4-20mA電流信号を出力する回路を作ったので、何かの信号を伝送しようと思いました。
で、信号といえば正弦波かなぁ、と。正弦波といえばウィーン・ブリッジ発振回路ですかねぇ。
そんなことを考えながらジャンク箱をかき回していましたら、何やら IC が。62352A? なんだろ?
これ「8BIT 12CH D-A CONVERTER WITH BUFFER AMPLIFIERS」っていう D/A コンバータだそーで、パーツ品番は「M62352AGP」です。
D/A コンバータを使ってみよう
D/A コンバータというと、最近は DAC とかいってオーディオ機器の一種のことらしいですが、こいつはそれとは違うようです。
図 1 は DatasheetCatalog.com にあったデータシート (三菱電機) に載っていたブロックダイヤグラムです。
入力は 12 ビットのシリアルデータをシフトレジスタで受けます。シリアルデータの一部はデコーダに渡され、出力するアナログチャンネルを指定します。
ん?これって「シフトレジスタでデジタルピン数を減らす」でやったこととおんなじ仕組みじゃん 。
えーと、こいつに Arduino からデータを送れば、アナログ出力が得られる、と。アナログ出力ってことは、UNO のような PWM じゃなくて Due みたいに本当のアナログ出力ができるってこと。
だから、4-20mA 電流信号回路に放り込めるぞ、っと (^_^;)
とゆーことで、Arduino で (疑似じゃない) アナログの正弦波を出力してみよう!
D/A コンバータのデータフォーマット
Arduino から D/A コンバータへ渡すシリアルデータのフォーマットを、データシートで調べてみました。が、なんだかなぁ、難しくはないんだけどこんがらがってしまいました。
以下、データフォーマットについて、備忘録的説明。
Digital data format
入力データのフォーマットは図 2 のようになっています。
データは全体で 12 ビット。MSB ファーストで送り込み、最初の 4 ビットが出力するアナログチャンネルの選択、あとの 8 ビットが出力する値です。
DAC select data
D8 | D9 | D10 | D11 | DAC selection |
0 | 0 | 0 | 0 | Don’t care |
0 | 0 | 0 | 1 | A1 select |
0 | 0 | 1 | 0 | A2 select |
0 | 0 | 1 | 1 | A3 select |
0 | 1 | 0 | 0 | A4 select |
0 | 1 | 0 | 1 | A5 select |
0 | 1 | 1 | 0 | A6 select |
0 | 1 | 1 | 1 | A7 select |
1 | 0 | 0 | 0 | A8 select |
1 | 0 | 0 | 1 | A9 select |
1 | 0 | 1 | 0 | A10 select |
1 | 0 | 1 | 1 | A11 select |
1 | 1 | 0 | 0 | A12 select |
1 | 1 | 0 | 1 | Don’t care |
1 | 1 | 1 | 0 | Don’t care |
1 | 1 | 1 | 1 | Don’t care |
表 1 は、出力するアナログチャンネルの選択データです。
この表を見ると何も疑問はないわけですが、よーく考えるとですねぇ、変なんです (^_^;)
MSB ファーストですよねぇ。
MSB とは Most singnificant bit 、つまり最も大きな値のビットのことです。で、D11 ビットが MSB でしょ?
つまり、A1 チャンネルを選択するときのビット列は 1000 、16 進数でいうと 0x8 です。A2 チャンネルは 0x4 、A3 は 0xC 、A12 は 0x3 でしょ。です。
実際どうするかは別ですけど、もし出力チャンネルの数字とビット列を合わせようと思ったら、ビット列を反転させる必要があります。
ここんところ、要注意です。
DAC data
D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D-A output |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Vref / 256 x 1 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Vref / 256 x 2 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | Vref / 256 x 3 |
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | Vref / 256 x 4 |
: | : | : | : | : | : | : | : | : |
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Vref / 256 x 255 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Vref / 256 x 256 |
表 2 は出力するアナログ電圧のデータです。
ここもちょっと気を付けていないといけない。ビットの並びが、表の左側が LSB です。
でも、0x00 が最小値で基準電圧の 1/256 、0x01 が基準電圧の 2/256 と、わかりやすいですね。最大値は 0xFF で、Vref が出力されます。
なお、表では簡略化してしまっていますが、基準電圧 Vref は VDD – VSS で、最低電圧が VSS となります。VSS は、GND 電圧が推奨のようです。
次回へ
さて、シフトレジスタへ渡すデータのフォーマットがわかりましたので、あとは簡単です。以前やった、シフトレジスタとラインデコーダを使った 7 セグメント LED の制御「シフトレジスタでデジタルピン数を減らす」と基本は同じですから。
次回は、実際の回路と、Arduino のスケッチを作ることにしましょう。