パワーMOSの制御用に作成したAVRマイコンボードです。
DACに12bitのMCP4726を2個とADCに16bitのMCP3428を1個載せてあり、どちらもI2Cでの制御です。はじめて使うICですが、無事動きました。
BASCOM-AVRでMCP4726は、
I2c_data(0) = &H96 ‘configuration vref=ext pd=640K gain=x1
I2csend &HC0 , I2c_data(0) , 1
でコンフィギュレーションレジスタを設定しておき、例えば1000mV出すには、(1000を16進にすると3E8なので)
I2c_data(0) = &H3
I2c_data(1) = &HE8
I2csend &HC0 , I2c_data(0) , 2
で、1000mV出力します。
VrefにはLM4040AIM3-4.1から4.096Vを入れてあるので、ビットあたり1mVが出ます。
MCP3428はネット上に情報が少なかったので参考までに
I2c_data(0) = &H90 ‘configuration /RDY=1 ch=0 /OC=0 s-rate=12bit gain=1
I2csend &HD0 , I2c_data(0) , 1
で、初期設定し
I2cstart
I2cwbyte &HD0
I2cstart
I2cwbyte &HD1
I2crbyte I2c_read(1) , Ack
I2crbyte I2c_read(0) , Nack
I2cstop
で、読み込めました。
———————————————————————————————————-
【7月29日追記】
上記の読み込みコードに誤りがあります。単独のチャンネルで連続の読み込みであれば読めてしまいますが、/RDYビットの確認(変換終了の確認)または読み込み前に5ミリ秒程度のウエイトが必要です。複数チャンネルの切替も含めて動作を確認の上で書き直したので、参考にされる場合は7月28日のブログも併せてお読みください。
———————————————————————————————————-
12bitで使っているので、I2c_read(1)に上側4bit、I2c_read(0)に下側8bitが入ります。
DACの出力はエンコーダで1mVステップで増減させます。
B = Encoder(pinc.2 , Pinc.3 , Lrot , Rrot , 0) ‘set VI_set
をループの中に入れておき、
Lrot:
If B <> &B00 Or Vi_set = 0 Then Return
Vi_set = Vi_set – 1
Return
Rrot:
If B <> &B01 Or Vi_set >= 2048 Then Return
Vi_set = Vi_set + 1
Return
エンコーダを回したときに、上のサブルーチンへ飛ばして値を設定します。
(ADCの上側が2.048Vなので、DACの出力も2048mVで止めてあります。接続予定の電子負荷用のパワーMOSユニットも20Aが上限ですから2V以上の出力は必要ありません。)
I_set = Vi_set
If I_set <> I_set_before Then Gosub Setdac_i
エンコーダが回されて、値が変化した時は次のサブルーチンで
Setdac_i:
Temp_word = I_set And &HF00
Temp_word = Temp_word / &H100
I2c_data(0) = Temp_word
I2c_data(1) = I_set And &HFF
I2csend &HC0 , I2c_data(0) , 2
I_set_before = I_set
Return
DACに送って出力します。
ひょっとするとおかしいところがあるかもしれませんが、これで動きましたというコードです。
ずいぶん昔はPGM-FI用のエンジン制御コンピュータの自動計測でADC80やDAC80といったコンバータを度々使いましたが、今ではこんなに小さなICで実現できてしまいます。それもマイコンとの接続はクロックとデータの2本ですからね・・・。あの頃は12ビットのデータを8ビットのバスで2回に分けて読んでいましたっけ。