ArduinoでMAD7991を使う

MAD7991は4チャンネルのADコンバータ(AD7991)を搭載したモジュールです。 I2Cシリアルインターフェースでコントロールすることができます。 4チャンネルの入力として使うか、3チャンネル入力とリファレンス入力として使うかを選択できます。



ADコンバータAD7991のデータシートはアナログデバイスの こちらのページからダウンロードできます。

Arduinoとの接続は次の回路図の通りです。I2Cの信号線、SCL, SCAは2.2kΩの抵抗でプルアップしています。



Arduinoのプログラム

setup()でI2Cの動作周波数は3.4MHz(ハイスピードモード)に設定します。 I2Cのアドレスはボードの取り扱い説明書右下の「仕様」にある通り0x28です。 A/D変換のデータを読み込むだめには、AD7991のレジスタ、上位4ビットで設定します。




#include <Wire.h>

#define AD7991_ADDRESS 0x28  // AD7991のI2Cアドレス (データシート参照)
#define MAX_CLOCK   3400000  // I2Cの動作周波数 340kHz
#define REG_CH0     0x10     // チャンネル0
#define REG_CH1     0x20     // チャンネル1
#define REG_CH2     0x40     // チャンネル2
#define REG_CH3     0x80     // チャンネル3

void setup() {
    // put your setup code here, to run once:
    Wire.begin();             // 接続の初期化
    Wire.setClock(MAX_CLOCK); // I2Cの動作周波数
    Serial.begin(115200);
}
                    
uint16_t readADC(uint8_t channel) {
    Wire.beginTransmission(AD7991_ADDRESS);
    Wire.write(channel);    // チャンネル選択
    Wire.endTransmission();
                    
    delay(10);  // データ準備の待機
                    
    Wire.requestFrom(AD7991_ADDRESS, 2);  // 2バイトのデータを要求
    if (Wire.available() == 2) {
        uint8_t msb = Wire.read();
        uint8_t lsb = Wire.read();
        return ((uint16_t)(msb&0x07) << 8)+lsb;  // 12ビットデータの取得
    }
    return 0;  // エラー時
}

void loop() {
    char chr[256];
    // put your main code here, to run repeatedly:
    uint16_t adcValue = readADC(REG_CH0);// チャンネル0からデータを取得
    sprintf(chr,"%04x ",adcValue);
    Serial.print(chr);
                    
    adcValue = readADC(REG_CH1);        // チャンネル1からデータを取得
    sprintf(chr,"%04x ",adcValue);
    Serial.print(chr);
                    
    adcValue = readADC(REG_CH2);        // チャンネル2からデータを取得
    sprintf(chr,"%04x ",adcValue);
    Serial.print(chr);
                    
    adcValue = readADC(REG_CH3);        // チャンネル3からデータを取得
    sprintf(chr,"%04x\n",adcValue);
    Serial.print(chr);
                    
    delay(50);  // 500ms待つ
}