Arduino UNOで制御する正弦波発生器AD9834

 アマゾンで購入した

Signal Generator Module, AD9834 Digital DDS Function Signal Generator Module Sine Wave/Triangle Wave/Square Wave 75 MHz

を、Arduino UNOで制御します。

AD9834のおもなスペック

  データシート

  • 動作電圧 2.3~5.5V
  • 出力周波数 0~25MHz(50MHzクロック)
  • 波形 サイン波/三角波
  • 制御インターフェース SPI mode2

接続

 ピンヘッダ

名称 機能 名称 機能
GD GND GD GND
FSY SPI-CE(CS) PST Phase Select(位相選択入力でPHASE0またはPHASE1を選択)
CLK SPI-SCK FST

Freq Select(周波数レジスタFREQ0またはFREQ1を選択)

SDA SPI-DATAin(MOSI) RST Reset
GD GND Vcc 5V

 コネクタの出力は、Out+とOut-、Squの三つがあります。Out+とOut-は正弦波出力で、位相が180°ずれています。SquはSIGN BIT OUTのようです。デフォルトではハイ・インピーダンスになっていて、コントロール・レジスタ内のOPBITENを設定すれば、方形波の出力が得られます。

コントロール・レジスタ

レジスタのビット 名称 内容
D15 - 0
D14 - 0
D13 B28 B28=1では、二つの連続した書き込みで完全なワードを周波数レジスタにロードできる。B28=0の場合、28ビットの周波数レジスタは二つの14ビット・レジスタとして動作
D12 HLB HLB=1で、アドレス指定された周波数レジスタの14 MSBsに書き込み、HLB=0で、アドレス指定された周波数レジスタの14 LSBsに書き込み
D11 FSEL FREQ0またはFREQ1
D10 PSEL PHASE0またはPHASE1
D9 PIN/SW 周波数レジスタと位相レジスタを選択し、内部レジスタをリセット。PIN/SW=1で、適切な制御ピンによって機能を制御、PIN/SW=0で、適切な制御ビットによって機能を制御
D8 Reset RESET=1で、内部レジスタを0にリセット
D7 SLEEP1 SLEEP1=1で、内部MCLKクロックをディセーブルに、SLEEP1=0で、MCLKはイネーブル
D6 SLEEP12  SLEEP12=1で、内蔵DACをパワーダウン、SLEEP12=0で、DACはアクティブ
D5 OPBITEN OPBITEN=1で、ピンSIGN BIT OUTをイネーブル、OPBITEN=0では、SIGN BIT OUT出力バッファが高インピーダンス状態
D4 SIGNPIB SIGNPIB=1では、内蔵コンパレータがSIGN BIT OUTに接続、SIGNPIB=0では、DACデータのMSB(またはMSB/2)がピンSIGN BIT OUTに接続
D3 DIV2 DIV2=1で、デジタル出力がSIGN BIT OUTピンに直接出力、DIV2=0で、デジタル出力/2がSIGN BIT OUTピンに直接出力
D2 -  
D1 DIV2 MODE=1で、SIN ROMをバイパスし、DACから三角波出力が得られる。MODE=0で、SIN ROMを使用して位相情報を振幅情報に変換し、サイン波信号の出力が得られる
D0 -  

周波数レジスタへの書き込み

D15 D14 D13~D0
0 1 FREQ0レジスタ・ビット
1 0 FREQ1レジスタ・ビット


[例] FREQ0

内容 コード例
FREQ0レジスタの書き込み(D15、D14=01)、14 LSBs=0000 0100 0000 0000 0000
FREQ0レジスタの書き込み(D15、D14=01)、14 MSBs=3FFF 0111 1111 1111 1111

スケッチ

 FREQ0レジスタだけを設定します。PHASEは触りません。

 ボード上で、ピンヘッダのFST、PSTは何もしないとxxx0が選択されていると想定しています。

 最初の2バイトはコントロール・レジスタへの設定です。0x20でD13のビットを'1'にし、28ビット・データを送ると指示します。次の0x20でD5のビットを'1'にしてSIGN BIT OUTをイネーブルにし、方形波をSquコネクタから出力します。

 つづく4バイトで、28ビットの周波数データを送ります。

 Foutが28ビットの周波数データです。0x2492492は、データシートに掲載されている事例の値で、fMCLK=50MHz時、出力fOUT=7.143MHzが得られます。このボードではクロックが75MHzなので、補正値として1.33をかけています。

 Flsbが28ビットの下半分の14ビット分、Fmsbが上半分の14ビット分です。FREQ0レジスタ(D15=1、D14=0)を扱う形で、マスクをかけています。

 全体は、

  SPI.beginTransaction(settings);
  digitalWrite(FSYNC1, LOW);

でチップ・セレクト信号をLOWにし、6バイト送ったら、

  digitalWrite(FSYNC1, HIGH);
  SPI.endTransaction();

チップ・セレクト信号をHIGHに戻して転送終了です。


#include <SPI.h>

const int FSYNC1 = 10;  // CS

SPISettings settings(SPISettings(1000000, MSBFIRST, SPI_MODE2));

void setup() {
  pinMode(FSYNC1, OUTPUT);
  digitalWrite(FSYNC1, HIGH);

  SPI.begin();

  SPI.beginTransaction(settings);
  digitalWrite(FSYNC1, LOW);
    SPI.transfer(0x20);  // MSB   control register
    SPI.transfer(0x20);  // LSB

    uint32_t Fout = 0x2492492 * 1.33;
    uint32_t Flsb = (Fout & 0x3fff) | 0x4000 ;
    SPI.transfer(Flsb >> 8);  // frequency register 0 LSB
    SPI.transfer(Flsb);

    uint32_t Fmsb = ((Fout >> 14) & 0x3fff) | 0x4000;
    SPI.transfer(Fmsb >> 8);  // frequency register 0 MSB
    SPI.transfer(Fmsb);
  digitalWrite(FSYNC1, HIGH);
  SPI.endTransaction();
}

void loop() {
  // put your main code here, to run repeatedly:
}

 0x2492492の出力波形です。青色はOut-出力、赤色はSqu出力を見ています。

 0x189374Cの出力波形です。

 0x0624DD3の出力波形です。

 0x009D496の出力波形です。

 0x000FBA9の出力波形です。

※ 使用オシロスコープ Pico Technology 5242B PicoScope7ベータ版

前へ

Seeed Studio XIAO ESP32C3でBLE ③ I2CでセンサBMP280をつなぐ

次へ

Smart gadget SHT4x を使って電子百葉箱を作る ① 準備