
昨日「アナログ」の別件記事で、ADコンバータAD7920を単体動作させてみました。アナログねたの続きだったので単体でしたが、本来はマイコン等SPIインタフェースを持つデバイスに接続して使用するチップです。今回は、昨日結線したAD7920搭載のブレッドボードをArdunio Unoに接続してみます。
※「IoT何をいまさら」投稿順Indexはこちら
別件記事は以下です。
お手軽ツールで今更学ぶアナログ(116) SAR ADC製品実例、AD7920入っていた件
上記記事で、とりあげているアナデバ(米国風に書くとADI)社 AD7920の製品ページは以下です。
※2022年9月22日追記:以下と同じことをNucleo-F401RE + Mbed OS6 でもやってみました。その記事はこちら。
実験の回路
冒頭のアイキャッチ画像に現物写真を貼り付けましたが、お手軽ツールDigilent Analog Discovery2のプローブ線が煩くてなんだかよく分かりません。しかし、Arduino Unoとの接続は、電源、グランドの他はデジタル3端子のみであります。回路図が以下に。
測定対象のアナログ電圧は、ポロリンと取り付けたボリュームで生成しとりますです。
実験用のプログラム
今回は伝統のArduinoIDEを使ってプログラムを作成しました。こんな感じ。
最近、ArduinoIDEも2.0だ、ということなので、どこかでアップデートせにゃならんと考えておるのでありますが、上記はまだ古い奴です。
ソース全体はこんな感じ。短いデス。AD7920を接続するときは、MSBファースト、SPIモードは2です。データシートを読めば分かる話ですが。なお、SPIのクロック速度は「一番遅い」128分周にしてあります。念のため。
//AD7920 12bit AD connection test.
// CS: pin 10
// MISO: pin 12
// SCLK: pin 13
// SPI MODE2: CPOL=1(active low), CPHA=0(Falling Edge)
#include <SPI.h>
#define CSPIN (10)
void setup() {
Serial.begin(9600);
while (!Serial) {};
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE2);
SPI.setClockDivider(SPI_CLOCK_DIV128);
SPI.begin();
pinMode(CSPIN, OUTPUT);
digitalWrite(CSPIN, HIGH);
Serial.println("AD7920 TEST");
delay(100);
}
void loop() {
byte high, low;
int dat;
digitalWrite(CSPIN, LOW);
high = SPI.transfer(0);
low = SPI.transfer(0);
digitalWrite(CSPIN, HIGH);
dat = ((int)high << 8) + low;
Serial.print("DAT: ");
Serial.print(dat);
Serial.println("[Counts]");
delay(2000);
}
実機動作の確認
Analog Discovery2を取り付けてあるので、折角なのでロジアナモードでSPIのインタフェース信号を観察してみました。こんな感じです。
なお、AD7920は読み出しオンリのデバイスなので、マイコン側からするとMISO信号のみ接続です。Arduino APIで制御する場合、出力側のMOSI(ピン11)も「もれなく動作してしまう」のですが、使わないのでうっちゃってあります。
以下はArduinoのシリアルモニタで観察した動作結果です。AD7920は12ビットのADなので、生の値は0から4095まで読み取りできます。以下は入力電圧を生成しているボリュームを「絞って」測定値が動いているところです。
まあ、SPIインタフェースは正常動作しているみたい。マイコンでの接続もOKっと。
