要約
4mA~20mAの電流ループは、工業用プロセスのモニタリングアプリケーションでセンサ情報を送信するための一般的な手法です(センサは、温度、圧力、速度、および液体流量速度などの物理的パラメータを測定します)。電流ループ信号は、比較的ノイズの影響を受けず、その電力はリモートの供給電圧から取り出すことができます。このため、リモート位置まで情報を長距離にわたって送信する必要があるときには、電流ループがとりわけ有効となります。
単純明快なループ動作
電流ループでは、センサからの出力電圧は最初に比例した電流に変換されます。この場合、4mAは通常、センサのゼロレベル出力を表し、20mAはフルスケール出力を表します。4mA~20mAの電流は、リモートエンドにあるレシーバで元の電圧に変換された後、この電圧がコンピュータまたはディスプレイモジュールによって処理されます。
一般的な4mA~20mAの電流ループ回路は、4つの要素で構成されます。すなわち、センサ/トランスデューサ、電圧-電流コンバータ、ループの電源、およびレシーバ/モニタです。ループ駆動のアプリケーションでは、センサが電圧-電流コンバータを駆動し、他の3つの要素は直列に接続されて閉ループを形成します(図1)。
図1. 4mA~20mAのループ駆動回路図
4mA~20mAスマートトランスミッタ
従来の4mA~20mAトランスミッタは、物理的なパラメータを検知して4mA~20mAの標準範囲で比例電流を生成するフィールドマウント式デバイスを搭載していました。産業の需要に応えるために生まれた「スマートトランスミッタ」と呼ばれる第2世代の4mA~20mAトランスミッタは、マイクロコントローラ(µC)とデータコンバータを使用して、信号をリモートで調整しています。
スマートトランスミッタは、利得とオフセットを正規化し、アナログ信号をディジタルに変換してセンサを線形化し(たとえばRTDセンサや熱電対など)、µCに常駐する算術アルゴリズムを用いて信号を処理し、元のアナログに変換し、最後に標準電流として結果をループに沿って送信することができます。
最新の第3世代の4mA~20mAトランスミッタ(図2)は、「スマートでインテリジェント」であると考えられます。このトランスミッタには、4mA~20mA信号とツイストペア線を共有するディジタル通信が追加されています。これによって得られる通信チャネルは、センサデータとともに、制御信号と診断信号を送信することができます。
図2. 「スマートでインテリジェント」な4mA~20mAトランスミッタのブロック図
スマートトランスミッタで使用する通信規格はHartプロトコルであり、周波数シフトキーイング(FSK)を採用し、Bell 202電話通信規格に基づいています。ディジタル信号の1と0のビットは、それぞれ1200Hzと2200Hzの周波数を表します。これらの周波数の正弦波は、センサのDCアナログ信号に重畳され、アナログ通信とディジタル通信が同時に行われます(図3)。
図3. アナログとディジタルの同時通信
FSK信号の平均値は常にゼロであるため、この処理によって4mA~20mAのアナログ信号は影響を受けません。ディジタル状態は、アナログ信号を妨害することなく毎秒2~3回、変化することが可能です。最小許容ループインピーダンスは23Ωです。
「スマートでインテリジェント」な4mA~20mAトランスミッタのためのµCの基本要件
µCがこの4mA~20mA電流ループアプリケーションを遂行するためには、3つの特定の機能を備えている必要があります。すなわち、以下の機能が必要となります。
- 「データ収集のためのADC」と「ループ電流を設定するためのDAC」を駆動するシリアルインタフェース
- 低消費電力(電流バジェットは4mAであるため)
- 積和演算ユニット(MAC)。入力信号に適用するディジタルフィルタを搭載するとともに、Hartプロトコルの2つの周波数を符号化/復号化します。
µCの選択
上記の必須機能は、すべて「RISC µCのMAXQファミリ」で利用することができます(図4)。
図4. MAXQ µCのアーキテクチャの説明図
- アナログ機能
MAXQ µCは、いくつかのアナログ機能を搭載しています。クロック管理方式によって、現在使用中のブロックにのみクロックが供給されます。たとえば、命令がデータポインタ(DP)と演算論理ユニット(ALU)に関与する場合、これら2つのブロックにのみクロックが供給されます。この技術によって消費電力が軽減され、スイッチングノイズが減少します。 - 低消費電力
MAXQ µCは、高性能の電源管理機能を備えており、要求される性能レベルにµCの処理速度を動的にマッチングさせることによって消費電力を最小限に抑えています。たとえば、処理の少ない期間中、電力はゆっくりと消費されます。より多くの処理能力を必要とする場合、µCは動作周波数を増大します。ソフトウェアで選択可能なクロック分周の動作によって、発振器の1、2、4、および8サイクルのシステムクロックサイクルを自由に実装することができます。ソフトウェアでこの機能を実行することによって、µCはその他のハードウェアを必要とせず、コストをかけずに低電力状態に移行することができます。
電力に極めて敏感なアプリケーションでは、その他に次の3つの低電力モードが利用可能です。
- PMM1:256分周の電源管理モード
- PMM2:32kHz電源管理モード(PMME = 1となる。ここで、PMMEはシステムクロック制御レジスタのビット2)
- ストップモード(STOP = 1)
図5. MAXQの性能(MIPS/mA)と競合デバイスとの比較 - フィルタリングの信号処理
MAXQ µC内のMACには、4mA~20mAアプリケーションが必要とする信号処理が搭載されています。アナログ信号はADCに渡され、得られたサンプリングストリームはディジタル領域でフィルタリングされます。一般的なフィルタは、次式によって実現することができます。y[n] = bix[n-i] + aiy[n-i]
ここで、biとaiは、それぞれシステムのフィードフォワード応答とフィードバック応答の特性を表すものです。aiとbiの値に応じて、ディジタルフィルタは、有限インパルス応答(FIR)または無限インパルス応答(IIR)に分類することができます。システムにフィードバック要素が存在しない場合(すべてのai = 0)、そのフィルタはFIR型となります。
y[n] = bix[n-i]
ただし、aiとbiのどちらの要素もゼロ以外の場合、そのフィルタはIIR型です。
前述のFIRフィルタの式を見ればわかるように、主となる数値演算は、各入力サンプルに定数を乗じ、それぞれの積をnの値について累積しています。この処理は、C言語で書くと、以下のようになります。
y[n]=0; for(i=0; i<n; i++) y[n] += x[i] * b[i]
MAXQ µCのMACは、4 + 5nサイクルの実行時間とわずか9ワードのコードスペースでこの操作を実行します(これに対して従来のµCとMACでは12ワードが必要です)。move DP[0], #x ; DP[0] -> x[0] move DP[1], #b ; DP[1] -> b[0] move LC[0], #loop_cnt ; LC[0] -> number of samples move MCNT, #INIT_MAC ; Initialize MAC unit MAC_LOOP: move DP[0], DP[0] ; Activate DP[0] move MA, @DP[0]++ ; Get sample into MAC move DP[1], DP[1] ; Activate DP[1] move MB, @DP[1]++ ; Get coeff into MAC and multiply djnz LC[0], MAC_LOOP.
(MAXQアーキテクチャでのデータメモリアクセスの詳細については、「付録」を参照してください。)MAXQのMACでは、2番目のオペランドがユニットにロードされると必要な演算が自動的に行われ、その結果がMCレジスタに格納されます。また、MCレジスタ幅(40ビット)によって、オーバフローするまでに多数の32ビットの乗算結果を累積することができます。この機能は、各動作にオーバフローのテストが必要であった従来の方式を改善するものです。
MAXQ2000 µCの独自の性能
マキシム製MAXQファミリの最初の製品は、MAXQ2000という低電力16ビットRISC マイクロコントローラです。これには液晶ディスプレイ(LCD)用のインタフェースが組み込まれており、最大100 (RBX)または132 (RAX)のセグメントを駆動することができます。MAXQ2000は、血糖値のモニタリングに最適であると同時に、低電力動作で高性能が求められるアプリケーションに適しています。MAXQ2000は、最大14MHz (VDD > 1.8V)または20MHz (VDD > 2.25V)で動作します。
MAXQ2000は、32kワードのフラッシュメモリ(試作品や少量生産向け)、1kワードのRAM、3つの16ビットタイマ、および1つまたは2つのユニバーサル同期/非同期レシーバ/トランスミッタ(UART)を備えています。柔軟性を得るため、別々の供給電圧によってマイクロコントローラのコア(1.8V)とI/Oサブシステムに給電しています。超低電力スリープモードを備えているため、MAXQ2000はポータブル機器やバッテリ駆動の機器に最適です。
MAXQ2000評価キット
高性能MAXQ2000 µCは、MAXQ2000用のハードウェア開発環境を完備した評価(EV)キットで評価することができます(図6)。
図6. MAXQ2000のEVキットのブロック図
MAXQ2000のEVキットは、以下の特性を備えています。
- MAXQ2000コアとVDDIO電源レイル用のオンボード電源
- VDDIOまたはVLCD電源レイルに使用可能な調整可能電源(1.8V~3.6V)
- MAXQ2000のすべての信号と電源電圧用のヘッダピン
- 個別のLCDドータボードのコネクタ
- 3Vで3.5桁のスタティックLCDディスプレイを備えたLCDドータボード
- シリアルUART (ライン0)用のRS-232レベルのフルドライバ。フロー制御ラインを含む
- 外部割込み用の押しボタン、およびマイクロコントローラのシステムリセット用の押しボタン
- MAX1407多目的ADC/DAC IC。MAXQ2000 SPIバスインタフェースに接続
- 1-Wireインタフェースと1-Wire EEPROM IC
- ポートピンP0.7~P0.0におけるレベルについての棒グラフLEDディスプレイ
- アプリケーションのロードとインシステムデバッグのためのJTAGインタフェース
図7. MAXQ2000 µCをベースとした4mA~20mAトランスミッタ
HARTモデムの実装
システムに1200Hzと2200Hz (ビット1とビット0を表す)のトーンエンコーダ、およびこれら周波数のトーン検出機能が備わっている場合、MACを使用することによって、HARTモデムで必要となる機能を実装することができます。
次の差分方程式で表わされる2極フィルタとして再帰型のディジタル共振器を実装することによって、必要な正弦波を生成することができます。
Xn = k * Xn-1 - Xn-2,
ここで、定数kは、2 cos(2 x トーン周波数/サンプリングレート)です。kの2つの値は事前に計算してROMに格納しておくことができます。たとえば、8kHzのサンプルレートで1200Hzでのトーンを生成するために必要な値は、k = 2 cos(2 x 1200/8000)です。
発振器を起動するために必要な初期インパルスも計算する必要があります。Xn-1とXn-2がどちらもゼロの場合、その後のXnはすべてゼロになります。発振器を起動するには、Xn-1をゼロに設定し、Xn-2は、次式のとおりに設定します。
Xn-2 = -A x sin[2(トーン周波数/サンプリングレート)]
今回の例では、単位正弦波であると仮定すると、この式は、Xn-2 = -1sin[(2(1200/8000)]に簡素化されます。さらにこれをコードに換算するには、最初に2つの中間変数(X1,X2)を初期化します。X1はゼロに初期設定し、X2には、発振器を起動するための初期励起値(上式で計算)を代入します。したがって、正弦波の1サンプルを生成するには、以下の演算を実行します。
X0 = kX1 - X2 X2 = X1 X1 = X0それぞれの新たな正弦値を計算するには、乗算と減算が1回ずつ必要です。MAXQ µCのシングルサイクルのハードウェアMACを使用すれば、正弦波は以下のように生成することができます。
move DP[0], #X1 ; DP[0] -> X1 move MCNT, #INIT_MAC ; Initialize MAC unit move MA, #k ; MA = k move MB, @DP[0]++ ; MB = X1, MC=k*X1, point to X2 move MA, #-1 ; MA = -1 move MB, @DP[0]-- ; MB = X2, MC=k*X1-X2, point to X1 nop ; wait for result move @--DP[0], MC ; Store result at X0.2つの周波数を検出するだけでよいため、修正Goertzelアルゴリズムを使用します。このアルゴリズムは、簡易2次フィルタとして実装することができます(図8)。
図8. 簡易2次フィルタとして実装したGoertzelアルゴリズム
Goertzelアルゴリズムを使用して特定の周波数を検出するには、コンパイル時に、以下の公式を使用して、最初に定数の値を計算します。
k = トーン周波数/サンプリングレート a1 = 2cos(2k)次に、中間変数D0、D1、およびD2をゼロに初期化し、受け取った各サンプルXに以下を実行します。
D0 = X + a1*D1 - D2 D2 = D1 D1 = D0十分な数のサンプルを受け取った後(通常、8kHzのサンプルレートで205サンプル)、D1とD2の最新の計算値を使用して、以下を計算します。
P = D12 + D22 - a1 * D1 * D2.ここでPは、入力信号におけるテスト周波数の2乗電力の大きさを含みます。
2つのトーンを復号するには、2つのフィルタを用いて各サンプルを処理します。各フィルタには、それぞれに固有のk値と固有の中間変数セットが備わっています。各変数は16ビット長であるため、アルゴリズム全体として48バイトの中間記憶領域が必要です。
付録. MAXQファミリのデータメモリアクセス
データメモリには、データポインタレジスタのDP[0]とDP[1]、またはフレームポインタのBP[Offs]のいずれかを用いてアクセスします。これらのレジスタの1つを、あるデータメモリの位置に設定すると、ニーモニック@DP[0]、@DP[1]、または@BP[OFFS]をソースまたはデスティネーションとして使用することで、その位置の読出しまたは書込みが可能となります。
move DP[0], #0000h ; set pointer to location 0000h move A[0], @DP[0] ; read from data memory move @DP[0], #55h ; write to data memory読出しの後、データポインタのいずれかをポストインクリメントまたはポストデクリメントすることができます。あるいは、書込みアクセスの前に、いずれかのデータポインタをプレインクリメントまたはプレデクリメントすることができます。以下の構文を使用します。
move A[0], @DP[0]++ ; increment DP[0] after read move @++DP[0], A[1] ; increment DP[0] before write move A[5], @DP[1]-- ; decrement DP[1] after read move @--DP[1], #00h ; decrement DP[1] before write3つのポインタは、データメモリ上の単一の読出し/書込みポートを共有しています。目的のポインタをデータメモリの読出し操作に使用するためには、ユーザはこれを承知した上で、このポインタを起動しておく必要があります。これは、データポインタの選択ビット(SDPS1:0; DPC.1:0)を使用して明示的に実行することができます。また以下に示すように、DP[n]、BP、またはOFFSレジスタに書き込むことによって暗黙的に実行することもできます。
データポインタを使用した間接的なメモリ書込み操作によってSDPSビットが設定され、次にアクティブなソースポインタとして書込みポインタが有効になります。
move DPC, #2 ; (explicit) selection of FP as the pointer move DP[1], DP[1] ; (implicit) selection of DP[1]; set SDPS1:0=01b move OFFS, src ; (implicit) selection of FP; set SDPS1=1 move @DP[0], src ; (implicit) selection of DP[0]; set SDPS1:0=00bポインタの選択が完了すると、以下の動作が行われるまで有効なままです。
- ソースデータポインタの選択ビットが、上述の明示的または暗黙的な方法で変更されたとき(たとえば、別のデータポインタが使用のために選択される)
- アクティブなソースデータポインタによってアドレス指定しているメモリが、命令ポインタを使用して、コードフェッチのためにイネーブルにされたとき
- 現在のアクティブなソースポインタ以外のデータポインタによって、メモリ書込み操作が実行されたとき
move DP[1], DP[1] ; select DP[1] as the active pointer move dst, @DP[1] ; read from pointer move @DP[1], src ; write using a data pointer ; DP[0] is needed move DP[0], DP[0] ; select DP[0] as the active pointerレジスタデータに影響を与えることなくデータポインタのインクリメント/デクリメントの演算を簡素化するため、仮想NULデスティネーションをシステムモジュール6のサブインデックス7に割り当てて、ビットバケットとして機能するようにしています。データポインタのインクリメント/デクリメント演算は、以下に示すように、他のいずれのレジスタの内容も変えることなく、実行することができます。
move NUL, @DP[0]++ ; increment DP[0] move NUL, @DP[0]-- ; decrement DP[0]