DAコンバータ MCP4725/6(I2C)を利用しD/A変換を行う

〔マイコン使用による電子部品の使い方に戻る〕


前のページでMCP4922をSPI(Arduino)にて接続してD/A変換を行って見ました。
このページでは、MCP4725をI2C(PIC)にて接続してD/A変換を行って見ます。
このページでMCP4726の記事も下記に追加して置きます。 *2)

使用したのはこちらの「MCP4725 EEPROM搭載12ビットD/Aコンバータモジュール」です。
このモジュールはピンを半田付けする必要が有ります。尚、MCP4725のデータシートはこちらです。

モジュールのピン構成図

I2Cバスのプルアップ抵抗について
モジュール裏のジャンパーパターン[J1][J2]に半田を盛れば2.7KΩでプルアップされます。
今回の記事ではこのプルアップは使用しないでPIC内部のプルアップ抵抗にて動作させています。

I2Cのデバイスアドレスについて
このデバイスは2個のアドレスが使用できます、A0端子をGNDに繋げれば0x60を使用し、
A0端子をVDDに繋げれば0x61を使用する事が出来ます。
モジュール裏のジャンパーパターン[J3]に半田を盛ればモジュールのGNDとA0端子が繋がります。
って事は、デバイスはDAコンバータが1回路ですので、同じI2Cバス上には2回路ぶん構成出来る
事になりますね。
尚、今回の記事ではA0端子をVDDに繋げているのでデバイスのアドレスは"0x61"としています。

内蔵EEPROMについて
このデバイスに内蔵しているEEPROMには、デフォルトでは”ノーマル起動・出力データ値は2048”と
設定情報が書き込まれています、なので電源がONした直後はVOUTから半分の電圧を出力します
電源ON後に出力したくないやパワーダウンさせておきたい場合はEEPROMを書き換えないとダメです。
今回の記事ではEEPROMに書き込むコマンド操作は行っていません。
PS. EEPROM書き込み関数を追加しました。 *3)

送信フォーマットについて *2)

Fast Modeのコマンド送信フォーマット
 1  1  0  0  0  0 A0 RW   C2 C1 PD1 PD0 D11 D10 D9 D8   D7 D6 D5 D4 D3 D2 D1 D0

A0:アドレス選択ビット(A0ピンがHIGHなら0x61、LOWなら0x60)
RW:書き込みなので0
C2/C1:コマンドで"Fast Mode"を指示なので"00"となる
PD1/PD0:パワーダウン選択ビット
        00=Normal Mode(パワーダウン無)
        01=1KΩの負荷抵抗にてGNDに設置
        10=100KΩの負荷抵抗にてGNDに設置
        11=500KΩの負荷抵抗にてGNDに設置
        パワーダウン時でもI2C通信は有効です、通常モードの復帰には10us掛かります。
D11-D0:出力する電圧のステップ数を指定します(0-4095)
     MCP4725はVDDが電圧リファレンスなので、VDD=3.3Vなら出力は0V(0)-3.3V(4095)です。

この他に、EEPROMに書き込むフォーマットやDAC状態の読み込みフォーマット等が有りますがここでは
説明を省きます。

《PIC》

( 配線図 )

配線図  左が実験の実態配線図です。

 モジュールの電源は、2.7V〜5.5Vですが今回は5.0Vです。
 ですので5.0Vを0-4095ステップ(12ビット)の分解能で出力されます、
 1ステップ辺り1.22mVですね。

 モジュールのVOUTにはLEDを接続し、PICのI2C端子は
 5番端子(SDA:RA2)と6端子(SCL:RA1)を利用しています。
 (I2Cプルアップ抵抗はPICの内蔵を使いました)

EEPROMの初期値で動作試験が可能です、PICはなくても電源を繋ぐだけでVOUTから半分の電圧値が
出力されるのでDACが動作するのか確かめる事が出来ますね。

( プログラム )

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
D_A2.lzh
D_A2.lzh "skI2Clib"の更新により変更 *1)
D_A2.zip "skI2Clib"を最新に更新 & EEPROM書込み関数追加 *3)

プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。

ダウンロードしたら解凍して下さい、以下のファイル構成です。
 D_A2.c・・・・・・・・・・・・・メインのサンプルソースプログラム *1)
 D_A2_EEPROM.c・・・・EEPROM書込みのサンプルソースプログラム *3)
 skI2Clib.c・・・・・・・・・・I2C通信を行う関数ソースファイル *1) *3)
 skI2Clib.h・・・・・・・・・・I2C通信を行う関数のインクルードファイル *3)

 尚、CPUのクロックは8MHzを想定しています。
 なので通信速度等(I2C)はシステムクロック8MHzで計算されています。

D_A2.c

このサンプルの動作は、電源ONでLEDが2.5Vの電圧値で半点灯します、
5秒経つとLEDが5.0Vの電圧値(4095)で全点灯し、更に5秒後にDACがパワーダウンするのでLEDは
消灯します。

このサンプルでは、DACのコマンドは"Fast Mode"のみですので、EEPROMへ書き込む為のコマンドは
データシートを見て自分で作成してみて下さいねぇ


"skI2Clib.c"はマルチマスターに対応していますが、この"D_A2.c"は未対応です、
なのでマルチマスターのバス上では動作しません。

D_A2_EEPROM.c *3)

このサンプルの動作は、DACをパワーダウン、DAC出力は0VでEEPROMに書込む事を行っているだけです

EEPROMは1回書込めば良いので、このサンプルの様に必要な設定をEEPROMに書込むプログラムのみ
作成し実行させれば本番のプログラム容量を少し軽くできるのではないかと思います......


DACの関数ライブラリの使い方を説明します。 *2)
関数のパラメータ値はチェックしていません、指定時は注意しましょう。

 DACout(adres,value)
  D/Aコンバータにデータを出力する処理です。
   adres  :スレーブのアドレス(7ビット)を指定します(0x60.0x61)
   value  :出力する電圧のステップ数を指定します(0-4095)

 DACpowerdown(adres,stage)
  D/Aコンバータをパワーダウンさせる処理です。
   adres  :スレーブのアドレス(7ビット)を指定します(0x60.0x61)
   stage  :パワーダウンさせる段階を指定します(1/2/3)
        1=1KΩの負荷抵抗にてGNDに設置させる場合に指定
        2=100(125)KΩの負荷抵抗にてGNDに設置させる場合に指定
        3=500(640)KΩの負荷抵抗にてGNDに設置させる場合に指定

 DACoutANDsave(adres,stage,value) *3)
  D/Aの出力とEEPROMに書き込みを行う処理です。
   adres  :スレーブのアドレス(7ビット)を指定します(0x60.0x61)
   stage  :パワーダウンさせる段階を指定します(1/2/3)
        1=1KΩの負荷抵抗にてGNDに設置させる場合に指定
        2=100(125)KΩの負荷抵抗にてGNDに設置させる場合に指定
        3=500(640)KΩの負荷抵抗にてGNDに設置させる場合に指定
   value  :出力する電圧のステップ数を指定します(0-4095)

  尚、DACout()とDACoutANDsave()関数を混在させたらDACoutANDsave()がうまく動作しなかった
  様な気がします.....

skI2Clib.c
skI2Clib.h

I2C通信を行う為のライブラリですこの内容につては、こちらを参照下さい。
今回の通信速度は100KHzとなっていますが、デバイスは400KHz/3.2MHzも可能な様です。

《MCP4726》  *2)

こちらで購入のMCP4726ですが、MCP4725との違いは?

"A0"端子から"VREF"に換わっています、って事はぁ、I2Cアドレス固定0x60で,
  電圧リファレンスがVDDから専用端子(VREF)と別れたと言う事ですね。
モジュールのピン配列が異なっていて、このモジュールにはパスコン・プルアップ抵抗等が何もない。
・ パワーダウン操作が1K/100K/500Kから1K/125K/640Kと変わっている。
・ 出力ゲインが1x/2xから選択可能。
・ 電圧リファレンスがVDD/VREF/VREF(Buffered)から選択可能。

尚、MCP4726のデータシートはこちらです。

送信フォーマットについて

Write Volatile DAC Register”モードのコマンド送信フォーマット
 1  1  0  0  0  0  0 RW   C2 C1 PD1 PD0 D11 D10 D9 D8   D7 D6 D5 D4 D3 D2 D1 D0

アドレス選択ビットは無しなので0x60固定
RW:書き込みなので0
C2/C1:コマンドで"Write Volatile DAC Register"モードを指示なので"00"となる
PD1/PD0:パワーダウン選択ビット
        00=Normal Mode(パワーダウン無)
        01=1KΩの負荷抵抗にてGNDに設置
        10=125KΩの負荷抵抗にてGNDに設置
        11=640KΩの負荷抵抗にてGNDに設置
D11-D0:出力する電圧のステップ数を指定します(0-4095)
     出力する電圧のMAX値は電圧リファレンスの電圧値までとなります。

"Write Volatile DAC Register"モードなら上のMCP4725での"Fast Mode"モードと同じフォーマットに
なるのでこの方が便利でしょう。

Write Volatile Configuration Bitsのコマンド送信フォーマット
 1  1  0  0  0  0  0 RW   C2 C1 C0 V1 V0 PD1 PD0  G

C2-C0:コマンドで"Write Volatile Configuration Bits"を指示なので"100"となる
V1/V0:電圧リファレンスの選択ビット
      00/01=VDDを利用する場合(デフォルト)
      10  =VREFを利用する場合
      11  =VREF+バッファを利用する場合
         (低オフセット電圧低 ノイズ、非常に高い入力インピーダンスを提供するらしぃ)
PD1/PD0:パワーダウン選択ビット(上記参照)
G:出力ゲインの選択ビット(0=1x 1=2x)
  デフォルトは1xで、2xはVREFをVDD/2で使う場合のみ設定可能です。

このフォーマットで、VREFやゲイン選択が行えるがこのフォーマットではEEPROMに書き込みません。

この他に、EEPROMに書き込むフォーマットやDAC状態の読み込みフォーマット等が有りますが
ここでは説明を省きます。

( プログラム )

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
D_A22.c
D_A22_EEPROM.c EEPROM書込みのサンプルソースプログラム *3)
12F1822を使ったMCP4726でのメインのサンプルソースのみです、"skI2Clib"は上記からどうぞ。
(上記の"D_A2.c"でも動作はします)

D_A22.c

実験時の写真  左は実験時の写真です。
 VDDは5V(下側)で、VREFは3.3V(上側)です、
 VOUTにはLEDを接続しています。

 MCP4725は電源ONで2.5V出力していましたが、
 MCP4726は初期値が0なので、立上げ時の出力は無。

 でぇ、このサンプルの動作は、電源ON後 約5秒後に
 LEDが5.0Vの電圧値(4095)で全点灯します。
 この後、5秒後に電圧リファレンスをVDDからVREFに
 切り換えるのでLEDは3.3V出力で点灯します。
 更に5秒後にDACがパワーダウンするのでLEDは消灯します。

VDD/VREFピンには0.1uF(セラミック)と10uF(タンタル)を取付ける様に推奨しています。

DACの関数ライブラリの使い方を説明します。
関数のパラメータ値はチェックしていません、指定時は注意しましょう。

 DACout(adres,value)
 DACpowerdown(adres,stage)
  上記と同じです。

 DACconfigSet(adres,vref,g)
  D/Aコンバータのコンフィギュレーションにデータをセットする処理です。
  この関数はMCP4726用でMCP4725では機能しません。
  パワーダウンの設定は、"Normal Mode"モードで固定として送信しています。
   adres  :スレーブのアドレス(7ビット)を指定します(0x60)
   vref   :電圧リファレンスの設定です。(1/2/3)
        1=VDD 2=VREF(バッファ無し) 3=VREF(バッファ有り)
   g     :出力ゲインの設定です。(0=1x 1=2x)

 DACoutANDsave(adres,vref,g,stage,value) *3)
  D/Aの出力とEEPROMに書き込みを行う処理です。
  この関数はMCP4726用でMCP4725では機能しません。
   adres  :スレーブのアドレス(7ビット)を指定します(0x60)
   vref   :電圧リファレンスの設定です。(1/2/3)
        1=VDD 2=VREF(バッファ無し) 3=VREF(バッファ有り)
   g     :出力ゲインの設定です。(0=1x 1=2x)
   stage  :パワーダウンさせる段階を指定します(1/2/3)
        1=1KΩの負荷抵抗にてGNDに設置させる場合に指定
        2=125KΩの負荷抵抗にてGNDに設置させる場合に指定
        3=640KΩの負荷抵抗にてGNDに設置させる場合に指定
   value  :出力する電圧のステップ数を指定します(0-4095)



EEPROM書込み関数を追記(*3) 2020/03/31
MCP4726を追記(*2) 2016/01/20
ライブラリ変更(*1) 2015/10/30


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.