AD9834をArduinoでコントロールするスケッチです。
基本的には、JA2GQPブログの記事のスケッチを使わせていただきました。JA2GQPさん、ありがとうございます。
AD9834に送る16ビットのデータは、MSB(最上位ビット)から順に送信します。
Arduinoには、1バイト(8ビット)分のデータを1ビットづつ送る関数としてshiftOut()という関数があります。
書式は、shiftOut(dataPin,clockPin,bitOrder,value) です。
各ビットは、dataPinに出力され、その後clockPinが反転し、そのビットが有効になったことが示されます。
例えば、dataPin=SDATA,clockPin=SCLK,bitOrder=MSBFIRST(最上位ビットから送り出す),value=wrk(16ビット)なら
まず、wrkの値を右に8ビットシフトしてから上位8ビットを先に送信します。
shiftOut(SDATA,SCLK,MSBFIRST,(wrk >> 8));
次にwrkの下位8ビットを送信します。
shiftOut(SDATA,SCLK,MSBFIRST,wrk);
スケッチの全体像は、JA2GQPブログを見ていただくことにして、ここでは、スケッチの中でDDSにデータを送る関数 Fnc_Dds()について解説します。
setup()の前にDDS_CLK と TWO_E28を定義しておきます。
const unsigned long DDS_CLK = 56000000L; // AD9834 Clock 56Mhz
const unsigned long TWO_E28 = 268435456L; // 2^28
実は、今回DDS_CLKを67108864=2^26にしたため、上の2行の記載が不要になりました。
void Fnc_Dds(double frquency){
//unsigned long wrk = frquency * TWO_E28 / DDS_CLK; //wrkは、DDSに送る周波数データ(32ビット)
上の行の記載が不要になり下のようにfrequencyを2ビット左にシフトするだけでOKです。
ただし、引数frequencyのデータ型は、unsigned longにしなければなりません。
unsingned long wrk = frequency << 2;
unsigned int wrk1,wrk2,wrk3;
wrk1 = 0x2000; //wrk1は、コントロールデータで、28ビットモード
wrk2 = wrk & 0x3fff; //wrk2は、周波数データの下位14ビットを取り出したもの
wrk2 = wrk2 | 0x4000; //wrk2にFREQ0を指定するビットを付け加える
wrk3 = wrk >> 14; //右に14ビットシフトする。
wrk3 = wrk3 & 0x3fff; //wrk3に周波数データの上位14ビットをセットする。
wrk3 = wrk3 | 0x4000; //wrk3にFREQ0を指定するビットを付け加える。
digitalWrite(SCLK,HIGH); // SCLKをHIGHにする。
digitalWrite(FSYNC,LOW); //FSYNCをLOWにする。データ送信開始
shiftOut(SDATA,SCLK,MSBFIRST,(wrk1 >> 8)); //コントロールデータを送信
shiftOut(SDATA,SCLK,MSBFIRST,wrk1);
shiftOut(SDATA,SCLK,MSBFIRST,(wrk2 >> 8)); //周波数データの下位14ビットをFREQ0レジスタに送信
shiftOut(SDATA,SCLK,MSBFIRST,wrk2);
shiftOut(SDATA,SCLK,MSBFIRST,(wrk3 >> 8)); //周波数データの上位14ビットをFREQ0レジスタに送信
shiftOut(SDATA,SCLK,MSBFIRST,wrk3);
digitalWrite(FSYNC,HIGH); //FSYNCをHIGHにする、(データ送信終了)