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に書き込むコマンド操作は行っていません

送信フォーマットについて *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)

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

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

 尚、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"は未対応です、
なのでマルチマスターのバス上では動作しません。

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に設置させる場合に指定


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
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)




MCP4726を追記(*2) 2016/01/20
ライブラリ変更(*1) 2015/10/30


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