昨日「アナログ」の別件記事で、ADコンバータAD7920を単体動作させてみました。アナログねたの続きだったので単体でしたが、本来はマイコン等SPIインタフェースを持つデバイスに接続して使用するチップです。今回は、昨日結線したAD7920搭載のブレッドボードをArdunio Unoに接続してみます。
※「IoT何をいまさら」投稿順Indexはこちら
別件記事は以下です。
お手軽ツールで今更学ぶアナログ(116) SAR ADC製品実例、AD7920入っていた件
上記記事で、とりあげているアナデバ(米国風に書くとADI)社 AD7920の製品ページは以下です。
12ビットA/Dコンバータ、250kSPS 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っと。