Arduino UNOで制御する正弦波発生器AD9834
アマゾンで購入した
を、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ベータ版