A-Dコンバータ その6 16ビットI2C MCP3425-(1)
10/12ビットに次いで、マイクロチップのMCPシリーズの16ビットのA-DコンバータMCP3425を利用します。DIP化されたボードを秋月電子通商から入手しました。新しいロットでは少し外観が変わっています。
2.048Vの基準電源を内蔵しているので、安定なディジタル変換が望めます。符号付き16ビットなので、PGA=1で使ったとき、1LSBは62.5uVと大変細かいデータを取得できます。
●MCP3425のおもなスペック
- 分解能;16ビット
- パッケージ;6ピンSOT-23
- 基準電圧;2.048V内蔵
- 電源電圧; 2.7~5.5V
- 入力;差動1チャネル
- 増幅器;ゲイン・プラグラマブル前置アンプ内蔵(PGA)。1倍、2倍、4倍、8倍から選択
- 変換方式;ΔΣ(デルタ・シグマ)方式
- 変換速度;15 SPS (16ビット)、60 SPS (14ビット)、240 SPS (12ビット)から選択
- インターフェース;I2C
- I2Cデータ転送速度;standard (100 kHz)、fast (400kHz)、high-speed (3.4 MHz)モードのいずれか
- I2Cのスレーブ・アドレス;1101000 0x68固定
●設定用レジスタ
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
Readyビット | チャネル・セレクトだが使わない | 1;連続、0;ワンショット | 00;12ビット、01;14ビット、10;16ビット | PGA利得、00;×1、01;×2、10;×4、11;×8 |
パワーオン・リセット後、このレジスタの値は10010000です。12ビット、PGAは1倍の設定なので、16ビットに変更したいので、10011000にします。16ビットではサンプリング速度は15spsになります。
●読み出したデータのフォーマット
bit15~bit8が上位バイト、bit15は符号ビット、bit7~bit0が下位バイトです。
●接続
いままでのArduinoを使った実験では、I2Cバスにプルアップ抵抗を入れていました。過去、実験中入れ忘れても普通に通信できていました。このプルアップ抵抗は、SCL、SDAの二つの初期状態はHIGHなので、確実にそうなるようにするためです。ATMega328のデータシートにあるTWI部分でも、オープン・ドレインになっているのでプルアップ抵抗は必須だと書かれています。TWI関連レジスタにプルアップする機能は入っていません。しかし、Wireライブラリがプルアップありで設定していれば、外部に抵抗の配線は不要になります。Arduino.ccにある解説記事を読んでも必ずプルアップ抵抗は入れているようなので、この推測は正しくないかもしれません。
●スケッチ
読み出してきたデータにintでキャストしたら、符号処理が行えます(16行目)。
#include <Wire.h>
#define MCP3425_address 0x68
#define configRegister 0b10011000 //16bit 15sps PGA x1
float Volts;
float Vref = 2.048 ;
void setup() {
Wire.begin();
Serial.begin(9600);
Wire.beginTransmission(MCP3425_address);
Wire.write(configRegister);
Wire.endTransmission();
}
void loop() {
Volts = (int)readADC() * Vref / 32767.0 ;
Serial.println(String(Volts,5));
delay(1000);
}
float readADC() {
Wire.requestFrom(MCP3425_address, 2);
return ( (Wire.read() << 8 ) + Wire.read() );
}
●実行結果
入力には、電池エネループを1個つなぎました。IN+にマイナス、IN-にプラス端子をつなぎ、負の電圧が入力されています。
●I2Cバス転送速度を上げる
Arduino UNOのI2Cバスは400kHzまで対応しています。MCP3425はその上の3.4MHzまで対応しています。まず、400kHzで動作させます。Wire.begin();の次の行に次の記述を追加します。clockFrequencyはHz単位です。
Wire.setClock(clockFrequency); |
を追加します。
デフォルトの100kHzのときの波形です。プルアップ抵抗を入れていないので、クロック(青色)波形がなまっています。データのSDA(赤色)の波形の崩れはそれほどでもありません。
400kHzに変更しました。通信できなかったので、SCLとSDA信号を4.7kΩの抵抗で5Vへプルアップしました。
1MHzでは異常な波形になったので、少し下げて800kHzの設定にしました。読み出したデータは正しいですが、プルアップ抵抗を取り付けて、ATMega328の規格上限である400kHzで使ったほうがよさそうです。また、MCP3425自体も15spsと変換時間に時間がかかっているので、高速に読み出しするメリットは少ないです。
●PGAで利得を上げる
PGA x1の入力電圧範囲は、0Vから基準電源の±2.048Vです。x2では0~±1.024Vで1LSBは31.25uV、x4では0~±0.512Vで1LSBは15.625uV、x8では0~±0.256Vで1LSBは7.8125uVになります。
×2で実験します。configRegisterは0b10011001に変更します。入力は、10kと100kΩで分圧します。測定結果を1/2します。実行結果です。ばらつきが大きくなりました。
×4で実験します。configRegisterは0b10011010に変更し、測定結果を1/4します。実行結果です。
×8で実験します。configRegisterは0b10011011に変更し、測定結果を1/8します。実行結果です。小数点第4位の桁が安定しているので、有効桁数が増えているようです。