先日からAD9833を使ったDDSモジュールを使って遊んでいます。
前回の第1報
とりあえず動作させることはできたのですが、
ロータリーエンコーダーを回して下から上に周波数を変えていたら、
ある周波数から上には行かなくなる現象に遭遇。
周波数は、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アップ)
表示
スペクトル