2016年11月3日木曜日

Wave GeneratorのAD9833をArduinoで動作させてみる。

師匠のtozさんにAmazonの中華がすごいと教えてもらった。AD9833を使ったファンクションジェネレータが1000円しなかったのでポチって届いたので動かしてみた。






こんな値段で大丈夫か?と思っていたがちゃんと届いたし動作した(^q^/

配線図

DATASHEETを見ると5V駆動できそうなのでArduinoで試した。

25MHzの水晶が載っているので正確な周波数も設定できそうだがDATASHEETをちゃんと読む気力がなかったのであてずっぽうで周波数スイープさせてみた。


Arduinoのスケッチ


AD9833_Test.ino

/*
 * AD9833 Test
 *  MCLK: 25MHz
 *
 * 2016.11.02 created
 *
 */

#include <SPI.h>

const int CS = 10;

void setup() {
  Serial.begin(9600);
  Serial.println("AD9833 Test");

  pinMode(CS, OUTPUT);
  SPI.begin();
  SPI.setDataMode(SPI_MODE2);
 
  AD9833reset();
}

void loop()
{
  static uint8_t cnt;
  AD9833setFrequency(cnt);
  cnt++;
  delay(10);
}

void AD9833reset()
{
  writeToAD9833(0x0100);
}

void AD9833setFrequency(uint8_t cnt)
{
  // 制御ワード
  writeToAD9833(0x2000);
  // 14LSBs
  writeToAD9833(0x4000);
  // 14MSBs
  writeToAD9833(0x4000 + cnt);
}

void writeToAD9833(uint16_t data)
{
  digitalWrite(CS, LOW);
  SPI.transfer(highByte(data));
  SPI.transfer(lowByte(data));
  digitalWrite(CS, HIGH);
}


出力波形

ch1:out ch2:SPI SCK

メモ:


出力波形はGND~600mV程度。DATASHEETを見ても、(AD9833_JP.pdf p2)

Vout最大 | 0.65 | V

となっているのでこれで正常だと思う。ノイズも相当乗っている(線が太い)のでアナログ回路での波形増幅+LPFは必要そうだ。

AD9833のDATASHEETを見ると、SPIのSCKの下降時にMOSIを評価するらしいので、SPI Mode2を指定した。

最近ARMを使っているのでArduino/ATMegaのintのbit長が16bitなのを忘れてしまって結構混乱する。しかもAD9833の周波数指定が28bitで14bitずつ送らないとだめっぽい。ArduinoのSPIのデータ幅は8bitなので周波数指定するにはちゃんと考えないとだめかもしれない(@@;

ブレッドボードで実験するとSPIの出力時には、波形出力にも相当信号波形が重畳する。

PCM5102を使ったファンクションジェネレータ場合と比べると高周波数でもデジタル歪(ガタガタ)が出ないのでノイズ対策をすれば何かと使いどころがありそう。