16ビットADコンバーターMCP3425(K-08018)
なんかね、細かく電圧を測りたくて、
マイクロアンペアを正確に測れる測定器を作りたくて
あれからイロイロ悩んでいるんですけど、
とりあえず、arduino付属のadcでは前に記事でも書いたけど、
(https://ameblo.jp/fc2miha/entry-12833772982.html)
5Vの場合分解の10bitでは最小単位が4.8mVになってしまいまして
つまり、問題外なぐらいに分解能が低いので
16ビットのを試してみることにした。
16ビットなら5V/65536=0.000076V=76μボルトになるので、
それなりに直流回路に10Ωぐらい挟んであげてその抵抗に掛かる電圧を測定すれば
小さな電圧が出てくるはずなのでそれを測ってあげればいいかなーとか思いましたので、
そんで実験です。
使用したのはみんな大好き秋月電子のMCP3425(16Bit ADC I2C 基準電圧内蔵)搭載モジュール
これ、なかなか期待大です。
回路図
(真ん中ヘンに有る可変抵抗を回して電圧を変更して様子を見ます。)
実験結果
https://youtu.be/y5Y5Wj3_-YA
これって、
基準電圧2.048Vって書いてあるけど、2.048V以上は測定できないみたいですね。
逆にマイナスが測定できるっぽくて-2.048~+2.048の範囲のようです。
あと、上の実験では電圧値で表示しているけど、adcから取得した値をそのまま表示すると、
最大が32767になりました。
なので、上記の目論見ハズレましたが、基準電圧が下がったので
2.048/32767=63μボルトなので、ま、だいたいそんな感じですね。
■プログラム解説
大事な変換モードの設定。
bit7 :レディービット
読み込み時
0=レジスタ更新あり、1=レジスタ更新なし
書き込みで連続変換モード時
影響なし
書き込みでワンショット時
0=影響なし
1=新しい変換を開始
bit6 :使用しない
bit5 :使用しない
bit4 :変換モード
1=連続
0=ワンショット(ワンショット後低電力モードへ)
bit3-2:サンプルレート
00=240回/秒(12ビット)
01= 60回/秒(14ビット)
10= 15回/秒(16ビット)
bit1-0:PGAゲイン(前段のアンプみたいなやつ)
00=1倍
01=2倍
02=4倍
03=8倍
今回は
0b10011000
なので、16ビット 15回/秒 PGA=1 連続変換モード
getADCは16ビットのデータを1バイトづつ読み出して
最初に来たほうを8ビットシフトして16ビットに合体して返します。
■プログラム
#include <Wire.h>
#define MCP3425_address 0x68
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("adc mcp3425");
//モード設定 16ビット 15回/秒 PGA=1 連続変換モード
Wire.beginTransmission(MCP3425_address);
Wire.write(0b10011000);
// bit7 :レディービット
// 読み込み時
// 0=レジスタ更新あり、1=レジスタ更新なし
// 書き込みで連続変換モード時
// 影響なし
// 書き込みでワンショット時
// 0=影響なし
// 1=新しい変換を開始
// bit6 :使用しない
// bit5 :使用しない
// bit4 :変換モード
// 1=連続
// 0=ワンショット(ワンショット後低電力モードへ)
// bit3-2:サンプルレート
// 00=240回/秒(12ビット)
// 01= 60回/秒(14ビット)
// 10= 15回/秒(16ビット)
// bit1-0:PGAゲイン(前段のアンプみたいなやつ)
// 00=1倍
// 01=2倍
// 02=4倍
// 03=8倍
Wire.endTransmission();
}
void loop()
{
int adcValue = getADC();
float Volts = (int)adcValue * 2.048 / 32767.0 ;
Serial.println(String(Volts,5));
//Serial.print(" ,");
//Serial.println(adcValue);
delay(100);
}
int getADC()
{
Wire.requestFrom(MCP3425_address, 2);
int nfRtn = (Wire.read() << 8 ) + Wire.read();
return ( nfRtn );
}