7:NUCLEO-F042K6のSPIを使ってAD9833(DDS)をコントロール

7:NUCLEO-F042K6のSPIを使ってAD9833(DDS)をコントロール

アマゾンで安価に購入できるDDSモジュールを購入しました。
2種類購入し、どちらもAD9833を使ったモジュールです。





2.54mmピッチのピンヘッダが付属するのでこの部分を半田付けすれば電子工作に利用できます。

今回はフットプリントが小さい右のモジュールを利用します。
モジュールをコントロールするCPUはSTM32開発ボードNUCLEO-F042K6を使います。

CubeMXを起動しボードNUCLEO-F042K6を選択後、以下のように設定します。

AD9833のコントロールとは直接関係ないIOも設定していますが、基本はSPI1を設定することです。


SPI1を設定するとPA5,PA6,PA7が選択されます。追加でPA4をCS用にDOに設定しFSYNCという名前をつけます。
CS用のIOはDO設定ができるものであればPA4以外でもかまいません。


SPI1はmodeにFull-Duplex Masterを選択


クロックの構成はデフォルトのまま、内部発信器を使う設定にします。このときAPB1,APB2は8MHzになります。


SPI1の設定は上のようにします。DataSizeを8bitにしました。AD9833は16bitのデータを受け取りますが、8bitを2回送れば16bitを送ったことになります。


FSYNCのPA4に User LabelとしてFSYNCと入力します。この文字列は任意で自由に設定して問題ありません。

ソースコード、AD9833をコントロールする部分のソースはArduino用のものが公開されていたのでそれをTrueStudioで使えるように修正しました。

AD9833は周波数の設定で2つの設定が可能ですが、今回はFREQ0の片方のみをつかいました。
SPIでデータを送出する直前にFSYNCをlowにしてデータ送出後highにもどします。
HAL_SPI_Transmit 関数に与えるデータの引数がuint_8タイプであったため、cubeMXでSPIのデータサイズを8bitにして8ビットデータを2回送るようにしました。
cubeMXでSPIデータサイズを16bitに設定することができますがそのときにHAL_SPI_Transmit をどのように使うかがわかりませんでした。

ソースの上のほうで以下の#defineを置いておきます。

 

main()の中ではwhileループの前でAD9833をリセットし周波数を設定すると発振するようになります。

1000Hzをセットして波形を確認すると正弦波を観察することができます。

DDSのチップは表面実装タイプがほとんどなので、モジュールを使うと簡単に動作確認ができるようになります。