● 実験テーマ110
「PIC24F_AD9833_試用実験」
(Easy_FRA_V4計画第1段として、小型の中華製DDSモジュール:GAOHOU_AD9833の、試用実験をしてみました。)
以下、この実験の顛末記です。
■ 2018.10.16
・Easy_FRA_V4計画(DDS部一体化)
@ 現ストリナの、AD9834モジュールは、P板化には不向きなので別のものを選択
A 1つのPIC(3.3V系)で、DDS部・LOGアンプ部・QVGAをコントロールするには
DDSは、+3.3V系が望ましい。
→ どうも今迄の、AD9834も、デバイス自体の、VCC=2.3〜5.5Vだが、モジュールに内蔵の
特注オシレータ:67.108864MHzの、VCCが、5Vなので、5V印加になっていたようだ。
B PICは、44pinQFP(0.8mmピッチ)の、PIC24FJ64GA004が、多ピンでハンダ付けが楽なので、これを使うか・・・
C DDSは、最もベーシックらしい、VCC=2.3〜5.5Vの、AD9833が実装された、
amazonで購入可な、中華製のモジュール:GAOHOU_AD9833(25MHzOSC実装済み)を使えば便利。
-----------------------------------------------------------------------------------------------
D とりあえずは、AD9833を動かす実験から進めたいと思う。
・SPIインターフェースの規格は、AD9834と同じようなので、前作ったテストプログラムで動きそう。
・そのままだと、10進DIP SWで周波数選択する形になっているが、まずはこれで動作確認
・次に、ロータリーエンコーダ+ステップSW追加バージョンに、ソフト変更して確認
・実験ハードは、PIC24Fトレーニング基板使用
■ 2018.10.17
・中華製のモジュール:GAOHOU_AD9833(25MHzOSC実装済み)届く。
■ 2018.10.18
・動作確認テストプログラムを考える。
@ SPIタイミングは、AD9834と同じでよさそう。
ただ、転送速度は、40MまでOKなので、余計なウエイトは入れないでやってみる。
A Fmclk= 25MHzなので、FrqRegに設定する値の計算式の、分母の定数=Fmcik/2~28 が浮動小数点になるため
その計算結果を、32bit整数型にキャストして、FrqRegに設定する値とする必要がある。
これは以前AD9834の時、さんざん悩んだあげく、Fmcik=6.144Mに変更して動かしたときの、ソースも
そうなっていた。ここら辺が大変面倒ではある。
B レジスタの扱いについては、AD9834と殆ど同じ構成のようだが、データシートのレジスタマップは
良く見といたほうがよさそう。
C 今回は、SPIラインのプルアップは不要と考えている。
■ 2018.10.19
・動作確認テストプログラム完了。コンパイルOK
・AD9833モジュール実験冶具作成
・動作確認
@ VCC=3.24V(モジュール実装時。ちょっと低めだが、トレーニング基板のレギュレータ出力が元々低めのようだ。)
A 一応基本的に、動いてはいる。
B 未だ高い方の周波数を十分見てないが、10〜10000Hzまでは、波形も見た目歪無く、カウンタで確認した周波数も、
-1Hz程度の誤差で問題ないが、100000Hzのカウンタ値が、+3Hzとやや多目だが、使用目的が
Easy_FRA_V4の、DDS部で、0〜100kHzの帯域しか使わないので良しとしても良いかな・・・
■ 2018.10.20
・1MHz出力までの実測データをまとめてみた。
・自作Fカウンタには、入力が、GAINを持つリニアアンプ(HCU04+フィードバック動作)を使っているため
0.55Vp-p程度のレベルでも反応するようである。
試しに、3.3Vレベルの方形波出力にソフトを変更して、カウンタ実測してみたが、結果は、0.6Vp-pのサイン波入力
と同じになった。
・誤差要因としては、モジュールに実装されている、極小の25MHzOSCの、出力精度が考えられる。
後閑さん記事で、AD9851を20Mで動かしている例があって、それでは、出力設定値計算上の、Fmclk/2~32で
得られる定数を補正している例があったが今回はそこまでやる用途ではないので見送り。
・data = (unsigned long)(((float)f) / (25000000.0 / (1024.0*1024.0*256.0))); // Fmclk/2^28をフロートで計算させてみた
ところ、以下のように、100k〜1M帯の誤差が改善された。
設定F[Hz] 実測F[Hz]
--------+----------+
100000 100001
200000 200004
300000 300006
400000 400008
500000 500010
1000000 1000021
これで行くことにした。これはトラ技トライアルシリーズの、AD9834モジュール
のファームウエアが、そう書かれていたので参考にした。
直接手計算したフロート計算結果を、適当な桁数で四捨五入して計算させると高い周波数の方でその影響が出るようだ。
以下のように書いた場合です。
/********************************************************************
* AD9833 DDS control (frequency to serial code)
* 希望の出力周波数:fから、シリアルコードを算出し、シリアル転送する。
*********************************************************************/
void freq_to_serial(unsigned long f)
{
unsigned long msb, lsb;
unsigned long data;
data = (unsigned long)(((float)f) / 0.0931322574); // 分母: Fmclk/2^28= 25000000/268435456= 0.0931322574
// フロート計算結果を、32bit整数にキャストし、設定値とする。
・
・
・
}
・PIC24Fでは、標準C算術関数ライブラリの中に、べき乗計算関数が用意されていた。
math.hをインクルードすれば使える。
pow(x,y):x^yの結果を、double型で返す。
powf(x,y):x^yの結果を、float型で返す。
今回は、powf(2,28)と書けばよいはず。
→ 何故か上手く行かなかった。前の方法で行くことにした。
使えるとしても、この関数を呼び出すのに時間を取られるので処理時間はより掛かるはず。
また関数の中身も、テイラー展開による高精度近似値を求めて、その値を返す方法を取っているらしい。
このテイラー展開に時間が取られてしまうらしい。
■ 2018.10.22
・ソースを整理し、_TEST_1の、最終ソースとする。(結果の写真は、このページトップを参照ください。)
・これまでの波形写真等、整理
・_TEST_2:ロータリーエンコーダにて周波数可変+STEP SW追加版のソフト検討
■ 2018.10.23
・TEST_2:ロータリーエンコーダにて周波数可変+STEP SW追加版のソフト・デバッグ完了
PULL UP設定のミスに、なかなか気付かず手間取ったが、何とか動作確認までok。
・データ取りを行った。
ここでは、1M以上を確認。
@ サイン波
設定F[Hz] 実測F[Hz]
--------+----------+
1000000 1000015
1234567 1234585
3000000 3000042
4000000 4000054 ← ここまでが、サイン波出力での、自作カウンタ実測の限界
→ たぶんレベルが下がっていると思われる。0.3Vとか。高速オシロを持ち合わせてないのでで確認できず。
A 方形波出力に設定し、3.3V出力で確認→ 9Mまでカウント確認できた。
ただ、10Mmaxだと、98・・・・・・位で変動していた。高調波のせい?
設定F[Hz] 実測F[Hz]
--------+----------+
9000000 9000130
※ 今回は、オーディオ帯の、100kHzまでしか使わないのでokとする。
<回路図>
・こちらからどうぞ→ AD9833_DDSモジュール回路
AD9833_DDSモジュール実験回路
<最終ソース・ヘッダファイル>
・こちらから、どうぞ:
/// メインソース
DDS_9833_TEST_1.c
DDS_9833_TEST_2.c
/// LCDライブラリ
LCD_Lib3.c
LCD_Lib3.h