Quantcast
Channel: JH7UBCブログ
Viewing all articles
Browse latest Browse all 440

ArduinoでAD9834DDSその4

$
0
0
 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にする、(データ送信終了)
 
 

Viewing all articles
Browse latest Browse all 440

Trending Articles