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