Analog Devices の AD9835 をサンプルで入手できたので、PIC でコントロールしてみました。
DDS とは正弦波を D/A で高精度に周波数制御しながら出力するものです。
最大 50MHz で駆動でき、10bit 精度があります。
従来のアナログOPアンプを使った正弦波発信器より高精度です。AD9835 は機器への内蔵を想定しているため、表面実装のTSSOP(Thin Shirink Smole Outline Package)になっています。
48.8KHz まで 10bit精度 97.7KHz まで 9bit精度 195KHz まで 8bit精度 391KHz まで 7bit精度 781KHz まで 6bit精度 1.56MHz まで 5bit精度 3.125MHz まで 4bit精度
5.1mm x 6.2mm と非常に小さいため、扱い易いように DIP へ変換アダプタを作りました。
PIC と AD9835 とは3つの線(SCLK, SDATA, FSYNC)で接続し、コントロールには16ビットのコマンドで行います。
AD9835には6つのレジスタがあります。ピンで2つの周波数切り替えと位相を切り替えることができます。
FREQ0 REG 32bits FREQ0 用の周波数レジスタ FREQ1 REG 32bits FREQ1 用の周波数レジスタ PHASE0 REG 12bits PHASE0 用の位相オフセット PHASE1 REG 12bits PHASE0 用の位相オフセット PHASE2 REG 12bits PHASE0 用の位相オフセット PHASE3 REG 12bits PHASE0 用の位相オフセット
今回は FREQ0 とPHASE0 に固定しています。
32ビットレジスタの構造
H MSB(8bits) L MSB(8bits) H LSB(8bits) L LSB(8bits)
12ビットレジスタの構造
MSB(4bits) LSB(8bits)
データレジスタへの書き込みSYNC と SELSRC の設定
D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 C3 C2 C1 C0 A3 A2 A1 A0 B7 B6 B5 B4 B3 B2 B1 B0 Sleep, Reset, Clear コントロール
D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 1 0 SYNC SELSRC X X X X X X X X X X X X
D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 1 1 SLEEP RESET CLR X X X X X X X X X X X
アドレスとコマンドを指定することで、レジスタ操作をします。
A3 A2 A1 A0 Register 0 0 0 0 FREG0 L LSB(8bits) 0 0 0 1 FREG0 H LSB(8bits) 0 0 1 0 FREG0 L MSB(8bits) 0 0 1 1 FREG0 H MSB(8bits) 0 1 0 0 FREG1 L LSB(8bits) 0 1 0 1 FREG1 H LSB(8bits) 0 1 1 0 FREG1 L LSB(8bits) 0 1 1 1 FREG1 H LSB(8bits) 1 0 0 0 PHASE0 LSB(8bits) 1 0 0 1 PHASE0 MSB(8bits) 1 0 1 0 PHASE1 LSB(8bits) 1 0 1 1 PHASE1 MSB(8bits) 1 1 0 0 PHASE2 LSB(8bits) 1 1 0 1 PHASE2 MSB(8bits) 1 1 1 0 PHASE3 LSB(8bits) 1 1 1 1 PHASE3 MSB(8bits) 制御ソフトでは、浮動小数点演算が不可欠であり、Microchip の Application Note AN575 を利用しました。
C3 C2 C1 C0 Command 0 0 0 0 Phase 16ビット(8ビットバッファーを含む)の書き込み 0 0 0 1 Phase 8ビットバッファーへの書き込み 0 0 1 0 Register 16ビット(8ビットバッファーを含む)の書き込み 0 0 1 1 Register 8ビットバッファーへの書き込み 0 1 0 0 SELSRC=1 のときD9(PSEL0)とD10(PSEL1)を使用/SELSRC=0のときPSEL0とPSEL1ピンを使用 0 1 0 1 SELSRC=1 のときD11(FSELECT)を使用/SELSRC=0のときFSELECTピンを使用 0 1 1 0 SELSRC=1 のときD9(PSEL0)D10(PSEL1)D11(FSELECT)を使用/SELSRC=0のときPSEL0,PSEL1,FSELECTピンを使用 0 1 1 1 予約
最近の PIC はFLASHの容量が増えたので、浮動小数点も容易に扱うことができます。
周波数の上限は振幅が小さくなることを気にしなければ10MHzでも利用可能。
出力波形 正弦波、矩形波(Duty可変) 周波数 1Hz - 1MHz 周波数可変単位 1Hz,10Hz,100Hz,1KHz,10KHz,100KHz,1MHz 最大振幅 3.5Vpp
AD9835 入手方法の問い合わせを多く受けますが、アナログデバイセズ のホームページをご覧ください。英語能力が必要です。
型番 数 Parts 備考 0.01u 2 C4,C7 セラミックコンデンサ, (秋月) 100u 4 C1,C2,C5,C6 縦型電解コンデンサ,耐圧16V (秋月) SC1602B 1 LCD1 16桁2行表示LCD, (秋月) 10K 3 R1,R2,R3 カーボン抵抗1/4W (千石) 3.9K 1 R4 カーボン抵抗1/4W (千石) 500 1 VR1 ボリュームB (千石) 10K 1 VR2 ボリュームB (千石) NJM2930 1 U1 3端子レギュレータ5V, (秋月) 16F88 1 U2 PIC(秋月) JXO 1 U3 CMOS水晶発信器 50MHz, KCJOX7-50.0000 キンセキ(サンエレクトロ) AD9835 1 U4 Analog Devices (サンプル) LM6365 1 U5 高速オペアンプ(秋月) Case 1 Case ポリカーボネート・ケース、117x84x28mm (秋月) SW 3 SW ボタンスイッチ(千石) RCA 2 RCA RCAジャック(千石)
DDS.zip(3.3KB)
エラー処理をしていません。たとえば、周波数がマイナスになるような操作すると動作は不定になります。
- 周波数の変更する桁にアンダーラインが表示されます。
- RANGEボタンを押すごとにアンダーラインの位置が変わります。
- 周波数をUP/DOWNボタンで変更します。
- 周波数は電源OFFしても保持されます。
- 周波数をリセット(100KHz)するにはRANGEボタンを押しながら電源ONします。
出力波形をデジタル・オシロスコープ(PicoScope2104)で確認してみました。
左図が波形、右図がスペクトラムです。
1Hz単位で周波数を設定でき、波形も見ての通りです。スプリアスもほとんどみあたりません。
デジタル・オシロスコープは便利ですね。周波数とピーク電圧も同時に測定してくれます。
波形を画像として保存できるので、貼り付けも簡単です。
矩形波(1KHz)
以前はオペアンプを使ったアナログ正弦波発信器を使っていましたが、 高い周波数での波形鈍りと不安定さに悩まされていました。(C)2005-2006 All rights reserved by Y.Onodera.
目的の周波数に合わせるのも苦労していました。
技術は進歩するもので、DDS では周波数の安定性と1Hz単位での設定が可能になりました。
しかも1MHzでも波形に鈍りはみられません。 むしろ、下手なオペアンプをバッファーに入れると波形が鈍ってしまいます。
さすがに、1MHz 以上になると振幅にも影響がみられ、小さくなっていきます。
Analog Devices にはAD9835より優れたDDSもありますが、急激に消費電流が大きくなることと ピン数が多くなるため、アマチュアとしてはAD9835が最適のように思います。
周波数は非常に高精度でこれから重宝しそうです。
1Hz単位で周波数を指定できることから、123456Hzということもできます。有名な発振器用ICのMAX038ではこのようなことは難しいでしょう。