PICでI2C - ADコンバーター・MCP3425の使い方
分解能・直線性にすぐれちょっとはマイナスの電圧も測れてしまうという使い勝手のいいADコンバータです。16bitですが自動オフセット調整機能がついていてゼロ点が動いたりもしません。
MCP3425関連記事
「PICでI2C - ADコンバーター・MCP3425の使い方」 (この記事)
「MCP3425のもうちょっと詳しい使い方(ソース付き)」
「MCP3425の精度を調べてみた - 16bitADコンバータの分解能」
「じつはマイナスの電圧もちょっとは測れる16bitADコンバータMCP3425」
「ADコンバータでマイナスの電圧を測るとどうなるか? - MCP3425編」
「16bitADコンバータMCP3425とPICで作る白金抵抗温度計 - 1」
12bitですが8チャンネルというのもあります。
「PIC18F26K22でSPI - 8ch/ADコンバータ MCP3208の使い方」
分解能が高いものがほしければ20.6bitというのもあります。
「22ビット(20.6bit)ADコンバータMCP3553の使い方」
さらに21.9bitも
「22ビット(21.9bit)ADコンバータMCP3551の使い方 - MCP3553との分解能の比較」
---------
16bitのADコンバータ・MCP3425の使い方でいちばん難しいのは何と言ってもSOT-23-6パッケージのはんだ付けでしょうか。だから私は秋月でDIP化してあるものを買ってきました(基板用リードフレームだけは自分ではんだ付けします)
あとはVSS,VDD,SCL、SDAの四本の線を接続してV+/V-に測りたい電圧をかけるだけです。
下の写真は温度計を作るため白金薄膜抵抗に電流を流し電圧を測っているところです。
これ、白金薄膜抵抗を(ピンヘッダーを介して)直接ブレッドボードに刺していますが、気温を測りたいんだったらこういうことはしない方がいいです。これだと気温ではなくブレッドボードの温度を測っていることになり白金薄膜抵抗の応答性のよさがぜんぜん生きてきません。
プログラムの方も簡単です。
(XC8コンパイラ、ターゲットはPIC16F1938、事情あってfloat=32bit、double=32bitでやってます)
// MCP3425のデータを取り込む
ans = I2C_Start(ADRES_MCP3425,RW_0); // スタートコンディションを発行する
if (ans == 0) {
I2C_Send(0b10001000 | (iPG & 0x03 )) ; // configuration byte
}
I2C_Stop() ; // ストップコンディションを発行する
__delay_ms(150) ; // 変換が終わるまで待つ
ans = I2C_Start(ADRES_MCP3425,RW_1); // スタートコンディションを発行する
if (ans == 0) {
for( i=0;i<2;i++){
ip_MCP3425[i] = I2C_Receive(ACK) ;
}
ip_MCP3425[i] = I2C_Receive(NOACK) ;
}
I2C_Stop() ; // ストップコンディションを発行する
例によって「きむ茶工房ガレージハウス - I2C通信の実験」にあるI2Cライブラリを使うことを前提に書いています。
しいて注意点をあげるとすれば
・変換が終わるまでウェイトするかコンフィグレーションバイトで変換が終わったのを確認する。
(変換時間は変換ビット数によって異なります。上は16ビット前提です)
・読み取るのは変換結果2byte+コンフィグレーションバイトの3バイトです。
くらいでしょうか。上は一回ごとに変換を要求していますが連続的な変換( Continuous Conversion mode)も可能です。変換が終了したかどうかは戻されてくるコンフィグレーションバイトを見てもわかります。
コンフィグレーションバイトの設定だけはちゃんと調べなければならないのでデータシート(「Microchip - MCP3425 - 16-Bit Analog-to-Digital Converter with I2C Interface and On-Board Reference」)を読んでください。簡単にまとめるとこうなります。
たとえば上のように“0b10001011”だと
bit 7: 1 (ワンショットコンバージョンを前提に)新しい変換を要求します。
bit 6-5 何にも影響のないビットです。
bit 4: 0 ワンショットコンバージョンモードに設定しています。
bit 3: 1
bit 2: 0 16ビット変換を行います。
bit 1: 1
bit 0: 1 ゲインを x8 にします。
この例だと戻されてくるコンフィグレーションバイトは変換が終わっていれば0x0B、終わっていなければ0x8Bとなります。
// bit 7 RDY: Ready Bit
// Reading RDY bit with the read command:
// 1 = Output register has not been updated.
// 0 = Output register has been updated with the latest conversion data.
// Writing RDY bit with the write command:
// Continuous Conversion mode: No effect
// One-Shot Conversion mode:
// 1 = Initiate a new conversion.
// 0 = No effect.
// bit 6-5 C1-C0: Channel Selection Bits
// These are the Channel Selection bits, but not used in the MCP3425 device.
// bit 4 O/C: Conversion Mode Bit
// 1 = Continuous Conversion Mode.
// 0 = One-Shot Conversion Mode. The device performs a single conversion and enters a low power
// bit 3-2 S1-S0: Sample Rate Selection Bit
// 00 = 240 SPS (12 bits),
// 01 = 60 SPS (14 bits),
// 10 = 15 SPS (16 bits)
// bit 1-0 G1-G0: PGA Gain Selector Bits
// 00 = 1 V/V,
// 01 = 2 V/V,
// 10 = 4 V/V,
// 11 = 8 V/V
上のソースで(iPG & 0x03 )というところがありますがこれはiPGの下位2ビットでゲインを選択するためのものです。
なお得られたデータから電圧を計算するのは
fp = ip_MCP3425[1];
fp = (fp+ip_MCP3425[0]*256.0) * 62.5E-6;
とします。
------
追記
白金薄膜抵抗の端子電圧を測るのならこれでいいんですが、差動入力で発生する負の電圧も測るんだったら
fp = ip_MCP3425[1];
fp = (fp+ip_MCP3425[0]*256.0);
if( ip_MCP3425[0] > 127 ) fp=fp-65536.0;
fp = fp * 62.5E-6;
みたいにする必要がありました。すみません。
(差動入力で発生する負の電圧を測れるのであってほんとにマイナスの電圧を測れるわけではないので注意してください)
まったくマイナスが測れないわけでもないです。
「じつはマイナスの電圧もちょっとは測れる16bitADコンバータMCP3425」
------
ゲインが x1 でないときは fp をゲインで割ります。上の式にあるようにゲインが x1 のときの分解能は 62.5μV です。ゲインはx8まで設定できますので、そのときの分解能は8μVくらいになります。
なお、肝心の精度なんですが、私が持っているものはゲイン設定x8で誤差±0.06%rdg.±2dgt.のDMMと比較したら0.2%くらい低めでした。実用上はぜんぜん問題なさそうです。
ゲイン設定によって誤差のばらつきがあるようなのでそこは注意してください。
白金薄膜抵抗の両端の電圧から抵抗値を求め、さらにそれから温度を求めるところは「PICで平方根 - 白金薄膜抵抗で温度を測る」の記事にあります。
------
関連
「I2Cデバイス・アドレス一覧」
「同じアドレスのI2Cデバイスを使う」
「PICで平方根 - 白金薄膜抵抗で温度を測る」
「PICでI2C - 1 (温度計を作る)」
「PICでI2C - 液晶(LCD)ディスプレイ(ACM1602N1-FLW-FBW)に表示する」
「PICでI2C - LCD(液晶)ディスプレイによる違い」
「I2C大気圧センサーLPS331の驚くべき分解能」
「I2C大気圧温度センサーLPS331 - 海面更生気圧を気象庁とくらべてみた」
「炭素皮膜抵抗の温度係数を測定する話」
「サーミスタによる温度測定の精度」
「サーミスタ温度計の精度を調べる - 1」
「ミニ恒温槽の作成に向けて - 1」
参考
「Microchip - MCP3425 - 16-Bit Analog-to-Digital Converter with I2C Interface and On-Board Reference」
「きむ茶工房ガレージハウス - PICの動かせ方入門はこちら - 16F1938覚書」
「きむ茶工房ガレージハウス - I2C通信の実験」
「きむ茶工房ガレージハウス - 気圧センサーで大気圧と標高を測定して見ます(MPL115A1)(MPL115A2)」
予習として拝見していたのですが、とても参考になります。
私の記事を読んでI2Cのセンサーを使って温度計とか気圧計とかそういうものを作りたくなった方も実際に作られるときはこちらを読まれた方がいいと思います。
「電子工作の実験室 - PIC(8bit) - PIC16シリーズ - I2Cモジュールの使い方」
« PICで平方根 - 白金薄膜抵抗で温度を測る | トップページ | PICでI2C - 温度センサーLP331APとAM2321の精度比較 »
「趣味の電子工作」カテゴリの記事
- PICで作る100MHz周波数カウンタ検証用XOR(エクスクルーシブオア)逓倍器(2016.03.08)
- 150MHz(~200MHz?)周波数カウンター用プリスケーラー(1/4分周器)(2016.03.06)
- 測温抵抗体(Pt100、白金薄膜温度センサー)の抵抗値を温度に変換する(平方根を使わない)計算式(2016.03.01)
- GPS/JJY(標準電波)を基準周波数源とするためのPLLの詳細(2016.02.27)
- GPS受信モジュール1PPS対決 - GE-612T vs GM-5157A(2016.02.21)
この記事へのコメントは終了しました。
« PICで平方根 - 白金薄膜抵抗で温度を測る | トップページ | PICでI2C - 温度センサーLP331APとAM2321の精度比較 »
コメント