AD9833の周波数制御で悩んだことの備忘メモ | 悪食釣り師のつれづれ日記

悪食釣り師のつれづれ日記

家計の足し?に、釣った魚は何でも食べるのだあ~

先日からAD9833を使ったDDSモジュールを使って遊んでいます。

 

前回の第1報

AD9833を使ったDDSのスプリアスの評価

 

とりあえず動作させることはできたのですが、

ロータリーエンコーダーを回して下から上に周波数を変えていたら、

ある周波数から上には行かなくなる現象に遭遇

周波数は、0.1Hzステップで設定したとき、2.0971520MHz

下の写真はそのときの様子

このときの表示は初期のバージョンで9の上の桁の0が表示されていません。

 

表示は少し手直しして0を追加

 

 

 

 

おかしくなる周波数は他にもう一ケ所有り、

1Hzステップで設定したとき、16.7772160MHz

 

 

 

AD9833の周波数を設定するのに使ったマイコンはPIC18F47Q43で、

周波数データを格納する変数は0.1HzステップだったこととAD9833のデータは28bitだったので、深く考えずに32bitのdoubleを選択していました。

 

 

2.0971520MHzの理由はまだ分かっていないのですが、

16.7772160MHzに遭遇して思い当たることが。

 

32bitのdoubleは、32bit全てが数字に割り当てられる訳ではなく、

何ビットかは正負の符号と指数部に割り当てられます。

167772160は2の24乗なので、数字24bit、正負1ビット、指数7ビットの割り当てだったとしたら167772160でストップするのは納得できます。

 

この問題を解決するため、周波数データを一旦10倍にして0.1(Hz)を1にして、

変数をdoubleから32bitのunsigned longに変えてみました。

このまま整数だけで処理できればよいのですが、周波数データからAD9833の制御データに変換する際、小数点以下の係数のかけ算をするので、周波数データを上位と下位の2つに分けて一旦doubleの演算をした後、またunsigned longに戻すという処理を入れています。

 

変更後は、無事に周波数設定の問題は解消されました。

 

2.0971520MHz

表示

スペクトル(スパン100Hz)

 

2.0971525MHz(0.5Hzアップ)

表示

スペクトル(スペアナの表示は1Hz単位なので2.097153MHz)

 

16.7772160MHz

表示

スペクトル(オーバークロックしたので16MHzに設定可)

 

16.7772170MHz(1Hzアップ)

表示

スペクトル