Quantcast
Channel: JH7UBCブログ
Viewing all articles
Browse latest Browse all 440

AD9834DDSをPICで制御する実験その2

$
0
0
 前の記事では、主にAD9834DDSを制御するSPI(Serial Peripheral Intrerface)について書きました。

 今回は、周波数データ(バイナリ)からDDSに送るデータをどのように生成するかを書きます。

 周波数データ f(Hz) は、4バイト(32ビット)とし、F3,F2,F1,F0に格納します。

 DDSは、f = ΔPhase ×fmclk / 2^28 という関係式で目的の周波数 f を生成します。

 ここで、ΔPhaseがDDS用のデータで、fmclkは、DDSのマスタークロックです。

 DDS用のマスタークロックは、今回 67.108864MHz=2^26Hzを使っていますので、この値をfmclkに代入すると

 f = Δphase × 2^26 / 2^28 = ΔPhase / 2^2 となります。

 従って、DDS用データは、ΔPhase = f × 2^2 となり、周波数データを4倍すれば良いことになります。

 周波数データを4倍するのは簡単で、fのデータ(F3,F2,F1,F0)を全体的に左に2ビットシフトすれば良いのです。

 周波数データは、表示などにも使いますので、一旦DDS用のデータを格納するP3,P2,P1,P0に移して、下位から、つまりP0から左に1ビットシフトします。更に1ビットシフトを繰り返し、全体的に2ビット左にシフトします。

 アセンブラでは、

 SHIFT_L2
      BCF STATUS,C ;C=0
      RLF P0,F
      RLF P1,F
      RLF P2,F
      RLF P3,F
      BCF STATUS,C ;C=0
      RLF P0,F
      RLF P1,F
      RLF P2,F
      RLF P3,F
      RETURN

 レジスタを左にシフトした場合最上位ビットがキャリーCに入ります、前のCの値は再開ビットに入ります。
 最初にキャリーCをクリアしておいて、最下位バイトから左シフトを繰り返せば、全体的に左に1ビットシフトできます。これを2回繰り返します。

 例えば、1MHz=1000000Hz=0x00 0F 42 40 ですので、左に2ビットシフトすると0x00 3D 09 00となり、これがDDSに送るデータになります。(実際のDDSデータは28ビットですから、このデータの下位から28ビットがデータになります)

 AD9834DDSでは、制御データや周波数データは、16ビットずつMSB(最上位ビット)FirstでSPI通信で送ります。

 この送り方のパターンはいくつかあるのですが、典型的なケースについて説明します。

 最初にコントロールワード(16ビット)を送ります。上位1ビットD15,D14を00にすれば、コントロールデータになります。
 D13が、周波数データをどのように送るかを指定するビットで、1にすると28ビットの周波数データを下位、上位の順に2回送ることを指示することになります。

 D12~D0は、全て0として、コントロールワードは、0x20とし、最上位ビットから16ビットをSPIでDDSに送ります。

 次に、周波数データの下位14ビットに、レジスタをしてするビットD15,D14を加えて送信します。D15=0.D14=1でFREQレジスタ0を指定します。(FREQレジスタは、独立して0と1があります。)

 DDS用データP3,P2,P1,P0のP1,P0から下位から14ビットを送信用データD1,D0に移し、上位2ビットに01を加えてSPIでDDSに送信します。

 次に、P3,P2,P1,P0を全体的に2ビット左にシフトし、P3,P2の下位14ビットをD1,D0に移し、上位2ビットに01を加えて、送信します。

 以上で、目的周波数のデータがDDSにセットされ、目的周波数が発生します。

 けっこう回りくどいですが、何かの参考になれば幸いです。
 

Viewing all articles
Browse latest Browse all 440

Trending Articles