IoT何をいまさら(107) SPI接続のADC、AD7920をArduinoで制御してみる

Joseph Halfmoon

昨日「アナログ」の別件記事で、ADコンバータAD7920を単体動作させてみました。アナログねたの続きだったので単体でしたが、本来はマイコン等SPIインタフェースを持つデバイスに接続して使用するチップです。今回は、昨日結線したAD7920搭載のブレッドボードをArdunio Unoに接続してみます。

別件記事は以下です。

お手軽ツールで今更学ぶアナログ(116) SAR ADC製品実例、AD7920入っていた件

上記記事で、とりあげているアナデバ(米国風に書くとADI)社 AD7920の製品ページは以下です。

12ビットA/Dコンバータ、250kSPS AD7920

※2022年9月22日追記:以下と同じことをNucleo-F401RE + Mbed OS6 でもやってみました。その記事はこちら

実験の回路

冒頭のアイキャッチ画像に現物写真を貼り付けましたが、お手軽ツールDigilent Analog Discovery2のプローブ線が煩くてなんだかよく分かりません。しかし、Arduino Unoとの接続は、電源、グランドの他はデジタル3端子のみであります。回路図が以下に。AD7920_ArduinoUno_DUT

測定対象のアナログ電圧は、ポロリンと取り付けたボリュームで生成しとりますです。

実験用のプログラム

今回は伝統のArduinoIDEを使ってプログラムを作成しました。こんな感じ。AD7920_EC

最近、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_LOGANA

なお、AD7920は読み出しオンリのデバイスなので、マイコン側からするとMISO信号のみ接続です。Arduino APIで制御する場合、出力側のMOSI(ピン11)も「もれなく動作してしまう」のですが、使わないのでうっちゃってあります。

以下はArduinoのシリアルモニタで観察した動作結果です。AD7920は12ビットのADなので、生の値は0から4095まで読み取りできます。以下は入力電圧を生成しているボリュームを「絞って」測定値が動いているところです。AD7920_Result

まあ、SPIインタフェースは正常動作しているみたい。マイコンでの接続もOKっと。

IoT何をいまさら(106) SAR型ADCの原理回路をArduinoで制御してみる へ戻る