Arduino Uno R3にプログラマブル波形発生器「AD9833」をSPIインタフェースで接続して、2kHzの三角波を発生させます。

AD9833 プログラマブル信号発生器モジュールとは

AD9833 プログラマブル信号発生器モジュールは、アナログデバイセズ社のプログラマブル波形発生器AD9833 を使ったモジュールで、ebayで購入しました。

プログラマブル波形発生器「AD9833」

  • 出力周波数レンジ:0~12.5MHz
  • 28ビット分解能(0.1Hz@25MHzリファレンス・クロック)
  • サイン波 / 三角波 / 矩形波出力
  • 電源電圧:2.3V~5.5V
  • 出力:サイン波 と 三角波 は0.6Vp-p、矩形波は電源電圧が5Vの時は5Vp-p
  • インタフェース:SPI

プログラマブル信号発生器モジュールのVccに電源を接続するだけ(SPIインタフェースでデータを設定しなくとも)で、「xx」MHz(xxはモジュールによって異なるみたいです)のサイン波が発生できます。

Arduino Uno R3とAD9833の接続

Arduino Uno R3とAD9833は、次のようにSPIインタフェースで接続して、AD9833の「OUT」「AGND」にはオシロスコープを接続します。

【Arduino Uno R3】  【AD9833】
      5V          ⇔     Vcc
      GND         ⇔     DGND
      SCK(#13)   ⇔     SCLK
      MOSI(#11)   ⇔     SDATA
      SS(#10)     ⇔     FSYNC

Arduino Uno R3とAD9833の接続

Arduino Uno R3のスケッチ

プログラマブル波形発生器「AD9833」は、Arduino Uno R3のスケッチを使って動作させます。Arduino IDEにより、次のスケッチを作成しArduino Uno R3に書き込みます。

  1. 13行目で発生する波形を三角波、14行目で発生する周波数を2kHzとするため、それぞれ変数「waveType」「freq」に設定します。
  2. 36行目のAD9833reset関数により、AD9833をresetします。
  3. 42行目のAD9833setFrequency関数により、パラメータで指定した周波数「frequency」と波形形状「Waveform」にAD9833を設定します。
  4. 61行目のWriteRegister関数により、パラメータで指定されたデータ「dat」をAD9833のレジスタに書き込みます。
/*
AD9833 Waveform Module vwlowen.co.uk
*/

#include <SPI.h>

const int SINE = 0x2000;                    // Define AD9833's waveform register value.
const int SQUARE = 0x2028;                  // When we update the frequency, we need to
const int TRIANGLE = 0x2002;                // define the waveform when we end writing.    
const float refFreq = 25000000.0;           // On-board crystal reference frequency
const int FSYNC = 10;                       // Standard SPI pins for the AD9833 waveform generator.

int waveType = TRIANGLE;
unsigned long freq = 2000;               // Set initial frequency.

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

  
  // Can't set SPI MODE here because the display and the AD9833 use different MODES.
  SPI.begin();
  delay(50); 
  
  AD9833reset();                                   // Reset AD9833 module after power-up.
  delay(50);
  AD9833setFrequency(freq, TRIANGLE);                  // Set the frequency and Sine Wave output
}


void loop() {

}

// AD9833 documentation advises a 'Reset' on first applying power.
void AD9833reset() {
  WriteRegister(0x100);   // Write '1' to AD9833 Control register bit D8.
  delay(10);
}

// Set the frequency and waveform registers in the AD9833.
void AD9833setFrequency(long frequency, int Waveform) {

  long FreqWord = (frequency * pow(2, 28)) / refFreq;

  int MSB = (int)((FreqWord & 0xFFFC000) >> 14);    //Only lower 14 bits are used for data
  int LSB = (int)(FreqWord & 0x3FFF);
  
  //Set control bits 15 ande 14 to 0 and 1, respectively, for frequency register 0
  LSB |= 0x4000;
  MSB |= 0x4000; 
  
  WriteRegister(0x2100);   
  WriteRegister(LSB);                  // Write lower 16 bits to AD9833 registers
  WriteRegister(MSB);                  // Write upper 16 bits to AD9833 registers.
  WriteRegister(0xC000);               // Phase register
  WriteRegister(Waveform);             // Exit & Reset to SINE, SQUARE or TRIANGLE

}

void WriteRegister(int dat) { 
  
  // Display and AD9833 use different SPI MODES so it has to be set for the AD9833 here.
  SPI.setDataMode(SPI_MODE2);       
  
  digitalWrite(FSYNC, LOW);           // Set FSYNC low before writing to AD9833 registers
  delayMicroseconds(10);              // Give AD9833 time to get ready to receive data.
  
  SPI.transfer(highByte(dat));        // Each AD9833 register is 32 bits wide and each 16
  SPI.transfer(lowByte(dat));         // bits has to be transferred as 2 x 8-bit bytes.

  digitalWrite(FSYNC, HIGH);          //Write done. Set FSYNC high
}

AD9833のデータシートは、「AD9833: 低消費電力 20 mW 2.3 〜 5.5 V プログラマブル波形発生器」を参照してください。

AD9833による2kHzの三角波/サイン波の発生

作成したスケッチを実行すると、オシロスコープに次の三角波が表示されます。Vppが「586.560mV」、Fが「2.000KHz」と表示されています。

AD9833による2kHzの三角波の発生

上記の画像は、デジタルオシロスコープ 「ISDS205A 3 」により計測したパソコン画面をキャプチャしています。

プログラムの13行目を「int waveType = SINE;」、14行目を「unsigned long freq = 100」にしてスケッチを実行すると、オシロスコープに次のサイン波が表示されます。Vppが「620mV」、Fが「100Hz」と表示されています。

サイン波 100Hz

1Mhzのサイン波を発生します。

1Mhzの矩形波を発生します。

1Mhzの三角波を発生します。