● 実験テーマ63
実験テーマ63:「PIC24Fによる、AD9834 DDSモジュールの実験」
              
(Strawberry Linux社の小型DDSモジュールの簡単な実験をしてみました。都合で手持ちの6MHz                
X'tal OSCで動かしました。)                  
※ 2015/2/23更新
   内蔵の、67.108864MHz OSCで動きました!!

             
・以下、この実験の顛末記です。
■ 2014.12.10
 
  ・DDS(ダイレクト・デジタル・シンセサイザ)方式の発振器を扱うのは初めてだが、
 
   昔、サイン波の、1サイクル分の振幅データを格納した、SIN              
ROMの、アドレスをカウンタで回して
             
   ROM出力の後で、DAC→ LPFを介してサイン波出力を得るようなことは経験がある。
 
   DDSも基本的には、それと同じ原理のようだ。
 
 
   DDSは、高い周波数のクロックを用いて純度の高いサイン波を発生可能である。
 
   DDSの心臓部は「クロックごとに周波数レジスタから一定の数が加算される
 
   アドレス・レジスタ= 位相アキュムレータ」である。
             
   つまり、前記の、アドレスカウンタに相当すると思ってよいと思う。
   今回の実験目的は、DDSのしくみを、実験を通して学習することと、そのプログラミングを
 
   体験することにある。
  ・このモジュールは、3線のSPIで制御される。
 
   DDSモジュールの電源が、マスタークロックモジュールを含めて、5Vなので、5V系のMPUを
 
   使うのがよさそう。
 
   WEB例を見ても、PICであれば断然、PIC18Fを使っている例が多い。
 
   ただこれは、コンパイラC18をインストールする必要がある。(無償版はあるが・・・)
 
   今回は手持ちのトレーニング基板として使い慣れている、電源は3.3V系になるが、
 
   「PIC24FJ64GA002」を使うことにした。
■ 2014.12.12
 
  ・PIC24Fの3つのポートで、ソフトウエアSPIを組み、AD9834を制御することになる。
 
   ただハード的に問題なのは、各デバイスの電源電圧の違いから、ロジックレベルの整合が
 
   取れないということである。
 
   調べたところ、AD9834の、SPIピンのレベル仕様は、
 
   Vih(min)= 2.8V(Vdd=4.5〜5.5V時)
             
   Vil(max)= 0.8V(Vdd=4.5〜5.5V時)
             
   一方、PIC24Fの出力ピン仕様は、
 
   Voh(typ)= 2.6V(標準で、Vdd-0.7)
             
   Vol(typ)= 0.4V
             
   なので、LoレベルはOKだが、Hiレベルは、Hiとして認識されないことになる。
   そこで、PIC24Fの、SPIポート出力は、O.D(オープンドレイン)設定にし、外部プルアップ
 
   (10kにて+5Vにつる)することにした。
  ・SPIのタイミングソフトはなんとかなりそうなので、
 
   DIP SWで数点スポット周波数を設定できるような簡単なテストプログラムを作成してみる。
            
            
  ・まずは水魚堂で回路図を作成した。
■ 2014.12.13
 
  ・ストロべり・リナックス社の「AD9834 小型DDSモジュール」を、1枚手配した。
     
   その他、実験用パーツ小物も手配済
■ 2014.12.17
 
  ・ストロべり・リナックス社の「AD9834             
小型DDSモジュール」を、どう料理する?
            
   @ モジュールキットには、SMAコネクタが、3個付属しているが、使いにくいので
 
      使わない。
            
   A サイン波の出力は、手持ちのBNCコネクタへ出したいので、DAC-Ioutピンの
 
      出力コンデンサ:C12=20pの両端の、ランド(5.08mmピッチ)を利用して、
            
      そこに3ピンのピンヘッダ の2番ピンを抜いたものを実装し、下の実験ベースボードと
            
      スタック接続することにした。
            
      ベースボードの方に、BNCを実装すればよい。
■ 2014.12.19
 
  ・ポート割付、内部プルアップの設定、O.D設定等検討し、テストプログラムを組み始める。
 
  ・AD9834の、SPI制御についてもいくつか、WEB検索して手頃なものがあったので、最初はそれを
 
   拝借することにした。
 
   拝借元は、henteko.orgの、「AD9834を使った、実験用 DDS-VFOの製作」ページです。
 
   ここに記載されていた、ソースの中の、2つのサブルーチンだけ利用させて頂きました。
 
   次の2つだけで、FOUTできそうな感触です。
 
   dds_dataset関数と、freq2serial関数の、2つです。
   freq2serial関数で、引数として渡された希望出力周波数の値から、実際にSPI転送で送信する
 
   14LSBsと、14MSBsの周波数レジスタの値を算出し、dds_dataset関数の引数:dataにその値を
 
   渡し、所定のSPIタイミングで、AD9834へ送信する形になります。
   尚、周波数レジスタへセットする値の計算式は、マスタークロックの周波数を、67.108864MHz(2^26)
 
   としているため非常に簡単な計算で済みます。
 
   つまり、周波数レジスタ値=             
(出力周波数/マスタークロックの周波数)x2^28
            
                                                
= (出力周波数/2^26)x2^28
            
                                                
= 出力周波数x4
            
   となります。
■ 2014.12.20
 
  ・一応、設定周波数を液晶へ表示したいので、後閑氏作成の、16キャラクタ*2行液晶用の、LCD
 
   ライブラリを使うことにしました。
 
   ソース作成は済んだ。
 
       コンパイル〜HEX作成まで、OKになった。
■ 2014.12.23
 
  ・実験ベースボードの製作が未だだったが、昨日までに完了した。  
 
  <チェック開始>
 
        まずは、モジュール未挿入で電源確認
           
   +5V→ 5.22V, +3.3V→ 3.24V
 
   この状態で、HEX書込みOK
  <動作確認>
 
   @ かんじんの、DDSが駄目
 
      1000Hz設定で、レベルは、約0.6Vp-pだが、波形が駄目。
            
                  
たまにサイン波になるが周期が合わない。(速めになる)
            
      駄目な時は、出力が出ない時もある。
            
      また周波数切替しても周波数変わらず??
■ 2014.12.24
 
  ・拝借したソフトSPIのタイミングを実測確認してみた。
 
   ただ、高速ロジアナを持合せてないので、SCLKのスピードを極端に遅く、約1kHzにしてタイミング実測
 
   確認をしてみた。
 
   下に、14LSBs=0x0000 +0x4000= 0x4000を、SPI転送した時のタイミングを示した。

  ※ AD9834の、SPIは、SCLKの立下りで、データを読込むことになっているが、これを見る限りは、
 
                
立上りのタイミングで、データビット幅の中央をサンプルするタイミングで送っているように見える。
           
     ソースを見ると、FSYNCを、Loアクティブにした後、直ぐにデータをセットした後にSCLKを立下げているので、
           
     セットアップ時間が足りない可能性がある。
         
     AD9834は、高速SPIなので、スペックを見てもこのセットアップ時間の規定値は、5nS(min)            
なので、
           
       問題ないような気もするが、私的には、マージンを上げるため、SCLKのパルス幅分の遅れを入れた方が
          
     ベターと考える。
           
     尚、この時、使った関数は、WEB例そのままで、以下の通りです。
           
     このサブルーチンをそのまま使い、
           
     dds_dataset(0x4000, 16);            
を実行させた時の、タイミングを測定したものです。
 <SPIプログラム例>
 
/***************************************************************
 
* serial data send (MSB first)
           
***************************************************************/
           
void dds_dataset(unsigned long data, unsigned int bt) 
           
{
           
       unsigned int i;
           
           
       DDS_FSYNC = 0;
           
       for(i = bt; i > 0 ; i--) {
           
          DDS_SDATA = (data            
>> (i - 1)) & 0x00000001;
           
          DDS_SCLK = 0;
           
          delay_us(500);	// 測定用に入れた(オリジナルのには入ってない)
           
          DDS_SCLK = 1;
           
          delay_us(500);	// 測定用に入れた(オリジナルのには入ってない)
           
       }
           
       DDS_FSYNC = 1;
           
}
  ・そこで、セットアップ時間のマージンを上げるため、SCLKのパルス幅分の遅れを入れてみた後の
 
   タイミング実測の結果を以下に示します。
 
   14MSBs=0x0FA0 +0x4000= 0x4FA0(1000Hz出力相当)を、SPI転送した時のタイミングです。

 <セットアップマージンを上げたSPIプログラム例>
 
/***************************************************************
 
* serial data send (MSB first)
           
***************************************************************/
           
void dds_dataset(unsigned long data, unsigned int bt) 
           
{
           
       unsigned int i;
           
           
       DDS_FSYNC = 0;
           
       for(i = bt; i > 0 ; i--) {
      
      DDS_SDATA = (data            
>> (i - 1)) & 0x00000001;
      
      delay_us(250);	//            
これがないと、セットアップ時間に余裕がなく、正確に読み取ってくれない可能性がある
           
          DDS_SCLK = 0;
           
          delay_us(500);	// 測定用に入れた(オリジナルのには入ってない)
           
          DDS_SCLK = 1;
           
          delay_us(250);	//  データセット後の250us遅延追加したので、クロックのデュティを50%とするため変更 141224 
 
       }
           
       DDS_FSYNC = 1;
           
}
  ・タイミングは良いようだが、これでも未だ駄目。
 
   ただ、1000Hz設定時、たまに正しい周期で、サイン波が出力されることを確認した。
   ここまで見てタイミングは良さそうなので、この症状は、後考えられるのは、RESETしかない。
 
   AD9834のデータシートを見ると、「AD9834のパワーアップ」という項目があった。
 
   「デバイスは、リセットする必要がある。」と明記されている。
   ソフトリセットが出来そうなので、やってみたがそれでも駄目。
 
   やった内容は、以下の通り。
 
   これを、メインループに入る前の、SPIの3信号のレベル初期化の後に入れた。
//// <AD9834の、パワーアップ>    141224 22:40 追加
           
dds_dataset(0x0100, 16);	// 内部リセットをアクティブにする
           
dds_dataset(0x4000, 16); //           
周波数レジスタ 14LSBsを、0に初期化 
 
dds_dataset(0x4000, 16);  //           
周波数レジスタ 14MSBsを、0に初期化
 
dds_dataset(0x0000, 16);	// 内部リセットを解除する
■ 2014.12.27
 
  ・ソフトリセットをもう少し追っかけてみることにした。
 
   データシートでは、初期化時、周波数レジスタの他、位相レジスタの初期化もするように書いて
 
   あったので(まあ、今回は、サイン波を出すだけで位相は制御しないので関係ないとは思うが・・)
 
   dds_dataset(0xC000,16);  // 位相レジスタの初期化
          
   を追加してみたが同じ。
■ 2014.12.31
 
  ・ソフトリセットのやり方には、もう一つ考えられる。
 
   前記のメインループの前に1回だけ行うパワーオンリセットでなく、freq_to_serial関数を実行する
 
   毎に、RESET ON→ Fレジセット転送→ RESET OFFを実施する方法である。
          
   RESET ONとするには、0x2100を送ればよい。
          
   そしてRESET OFFとするには、0x2000を送ればよい。
          
   その間で、データセット転送を行えばよい。
 
   (位相レジスタの初期化は今回関係なさそうなので省略した。)
 
   これでやってみた結果を以下に示すが、結果的にはこれでもうまく行かなかった。


※ この時、使ったソースは、これです。→ AD9834_DDS_TEST_141231.c
■ 2015.1.1
 
  ・解らないまま、年が明けてしまった。
■ 2015.1.2〜 2015.1.4
 
  ・いよいよ解らなくなってきたので、最近復活した、後閑氏HP(PIC           
FAN)の、「皆さんの掲示板」に、この件
          
   を投稿してみることにした。
 
   この日、投稿して、暫くは、回答がなかったのですが、1月4日に、後閑氏から助言がありました。
 
   この日、4回ほどやりとりを繰返しましたが、結局解らずじまいでした。
 
   現在(1月14日)、1月4日 23:09付の私の投稿を最後に、やりとりが止まっています。 
 
   やりとりの様子は、ここを参照してください。→ 後閑氏HP掲示板「AD9834           
DDSモジュールについて」
   簡単に助言いただいたことを、まとめると次のようになります。
 
    @ DDS側は5V動作のようですのでDDSのクロックが安定に発振していないのではないでしょうか?
 
    A 気になるのは、PIC側は3.3VでDDS側は5Vですよね。そうするとSPIの接続の電圧が異なることに
 
       なりますよね。
          
       そのあたりはどうしていますか?
          
    B 反射が起きているかもしれませんから、信号ラインに330オーム程度の抵抗を直列に挿入して
 
       ダンピングしてみてください。
          
    C クロックとデータの立ち上がり、立下りのタイミングは問題ないでしょうか?
 
       また、RESETを先に実行して、あとから周波数を設定してみてはどうでしょうか。
   @については、私も気になっているのですが、高速オシロも、高速カウンタも持ち合わせてないので
 
   判断のしようがありません。
 
   Aについては、このページの頭で書いたように、PIC24Fのオープンドレイン設定を使って外部プルアップ
 
   しているので問題ありません。
 
   Bは試しましたが、駄目でした。
 
   Cのタイミングについては、私が見た限りは問題ないと考えている。
 
   RESETを先にする方法は既に試したが、駄目だった。
  ・1月3日に、アナデバの英文のアプリケーションマニュアル(AN1070)に、
 
   「AD9833/AD9834           
プログラミング」と題して、プログラミングの具体的な例が載っていることに気が付く。
          
   これを見たら、基本は、私が去年の暮れ(12/31)に試した、0x2100で、RESET           
ONする方法の手順と
          
   全く一緒であることがわかった。基本的に手順は間違いなかったようだ。
 
   ただ位相レジスタを、0にする初期化が抜けているだけである。
 
   そこで、0xC000を送るのを追加してみたが、それでも駄目だった。
■ 2015.1.5
 
  ・こうなると本当に、特注の、67.108864MHz X'tal OSCの不良かもしれない。
          
   高速カウンタ或いはオシロがあれば一発で判るのだが、何とも歯がゆい。
 
   別の方法で良否の判断が出来ないものか?
 
   と考えたら、1つ方法があるのに気が付いた。
 
   大昔仕事で使っていた6.000MHzの、X'tal OSCが手持ちであるのを思い出した。
          
   リードワイヤも黒く錆びついているが果たして動くかどうか?
 
   しかも、WEB検索しても引っかからなかったので、ピンアサイン等が不明・・・
 
   たぶんTTL時代のものなので、+5V電源とは思うが・・・
 
   ちなみに、型番は、「YXO-201B 6.000MHz」です。
          
          
   それでも単体でチェックしてみたら動いたので、交換して試そうと思う。
 
   下に、チェックした時の様子をアップしました。

  ・交換して試してみる前に、現状の、freq_to_serial関数に、位相レジスタを0に初期化するステートメント
 
   を追加した状態で(アナデバの手順例と全く同じ)、念の為、再度今度は自作オシロと
 
   ロジアナでタイミングを確認してみた。
 
   結果、やはりタイミングは問題なさそうである。

■ 2015.1.6
 
  ・という訳で、手持ちの6MHzX'tal OSCで動かしてみる。
         
   これをやるために、モジュール上に実装されている、67.108864MHz X'tal OSCを外す必要はない。
         
   モジュール上で外すのは、R2:22Ωのダンピング抵抗だけでよい。
 
   また、X'tal OSCの、E/D(許可/禁止)ピンは、CN1-14pinを、GNDに落とすことによって発振停止
         
   にしておく必要がある。
 
   この状態で、CN1-12pin(MCLK入力)に、6MHzX'tal OSCの出力(ダンピング抵抗は、とりあえず
         
   手持ちの20Ωを付けた)を接続すればよい。
 
   とりあえず、周波数レジスタ値は、6Mだと、1000Hz出力で、計算上44738.9になるので
 
   四捨五入して、44739(AEC3h)の固定値でやってみることにした。
■ 2015.1.7
 
  ・昨日、お膳立てした実験をやってみたが、未だ駄目。
 
   @ 6MHz X'tal OSCの出力を、テスターのF計で確認すると、常に、5.99MHz出ている。
         
   A 駄目だが、Fo=10Hzと、100Hzでは正しい周期で出力されることを確認した。
 
   B Fo=1000Hzでは、何故か波形が歪むし、周期が正しくない?

  ・まあ現ソフトは、おおちゃくして、0.2秒毎に同じ設定を、RESET          
ON→ 設定→ RESET OFFという風に
         
   繰返しているので、動作のさせ方としては良くない。
 
   また固定値で入れているのも、全く効率的ではない。
 
   ここらで、FSW(周波数切替ディップSW)を使って、設定を変更した時のみ、設定を更新すように
 
   プログラムを変更すべき!!(最初からやるべきだったが・・流れでこうなってしまった)
   プログラム修正で、10, 100, 1000, 10000,          
100000, 200000, 300000, 400000, 500000, 1000000Hz
         
        の全てで、だいたいはOKになった。切替も瞬間に行われている。
        
   ただ、1000Hzと、200kHzで、電源立上げ時、周期が狂うことがあった。(再RESET後は、OKになる)
 
   未だ完全じゃない・・・
 
   
■ 2015.1.9
 
  ・サイン波出力のみはだいたいOKなので、SB-OUT(方形波出力)を試す。
 
   SB-OUT(デジタル出力:0-5V)許可の設定(0x2100→ 0x2120に変更)         
にして、Fカウンタで確認してみる。
        
    @ コマンド:0x2120として、RESETを掛けながら、SB-OUTを許可し、Fレジセット転送+RESET解除では、
 
       サイン出力は出るが、コンパレータ出力(SB-OUT)は出ない。
        
    A ストロベリーリナックス社HP例にあるように、特に、RESETを制御しなくても(何もしなくても)
 
       0x2020と送った後、Fレジセット転送だけで、SB-OUTに、サイン波周期の、/2周期で矩形波(0-5V)が
        
       出力されることを確認した。
        
                
ただこれでも、出力が出なかったり、周期が違ったりすることがある。        

    B 私的には、サイン波周期と同じ周期で、SB-OUTに出力したいので、bit3:DIV2='1'にし0x2028に変更した。
 
               
この設定の時は、最初両出力に、何も出なかった。
        
       ところが何回か、MPU RESETを掛け直し(立ち上げ直し)したら、正常に希望通り出力した。

    C この動きから見ると、やはり電源立上げ時のリセットは、DDSについても必要なようだ。
 
       そこで、DDS POWER ON RESETとして、DDS初期化のところに、
        
       dds_dataset(0x0100,16); // RESET ON
        
       dds_dataset(0x0000,16); // RESET OFFを追加した。
        
       しかし、これでも同じ症状だった。
        
    D あと、位相は今回制御しないが、位相レジスタの初期化として、'0'を設定するのはやっておくことにした。
 
       このようにしても、症状は同じだった。
        
    E また、RESETを使わない方法に戻し、0x2038(SB-OUT→コンパレータ方形波+ Iout正弦波)としてみても、
 
               
両出力とも出力は出なかったり、サイン波だけ出たりする。

<その他のメモ書き>
        
本実験時の、SPIタイミング・ソースは以下
        
/**************************************************************************
        
* serial data send (MSB first)
         
* 16ビット(bt=16で指定)SPI転送
         
* AD9834は、SCLKの立下りエッジでデータを読込む (SCLK≒約4MHz)
 
****************************************************************************/
 
void dds_dataset(unsigned long data, unsigned int bt)
         
{
         
  unsigned int i;
         
         
  DDS_FSYNC = 0;
         
         
  for(i = bt; i > 0 ; i--) {
         
    DDS_SDATA = (data >> (i - 1)) & 0x00000001;
         
    asm("clrwdt");	//Td=125nS(62.5nS x 2) この遅延を入れないと誤動作する。
         
    DDS_SCLK = 0; 
        
    asm("clrwdt");	//Td=125nS(62.5nS x 2) クロックのデューティを50%に確保するために入れた。
         
    DDS_SCLK = 1; 
        
  }
        
  DDS_FSYNC = 1;
         
}
■ 2015.1.10
 
  ・今迄、1ヶ月以上かけてやってきた実験だが、X'tal OSCの不良らしいところまでは判ったのだが、
        
   方形波も一緒に出す設定にすると、どうしても上手く行かない。
 
   まあサイン波のみの設定でも完全ではないが・・・(時々おかしくなる)
 
   ここで、再度サイン波のみの設定にして、より完全な動作を目指す。
 
 
  ・もうやることがなくなっていたが、それでもひつっこく、色々いじっている内に、1つ判ったこと有!!
 
    @ 自作カウンタを、入力ATT無しで無理やり、オシレータのダンピングRの接続して、周波数測定
 
      すると、6.000010MHzと精度よく確認できた。
 
            
A 基本的には発振しているようだが、ここにプローブを繋ぐと、サイン波の周波数が変わってしまう
 
      現象を確認した。
 
    B もしかしたら、ダンピングR=20Ωの値が不適当で、反射を押さえきれてないのかもしれない
 
      と思い、R=100Ωに変更してみた。
 
      そしたら、何回リセットを繰返しても動作OKになった。
 
      サイン波のみの設定なら、このバージョンでよさそうである。
 
      また、周波数切替も問題なく行っている。
 
 
  ・ただ、6M OSCの出力のダンピング抵抗値=100Ωでも、サイン波出力のみの設定ではOKだが、
         
   方形波同時出力設定にすると駄目
■ 2015.1.11
 
  ・DDS初期化の前に、MCLKが安定するまでの待機時間を追加してみる。
 
   CQ出版社トライアルシリーズに載っていたソースにこの待機時間が記述されていたので入れてみたが、
 
   駄目な時は出力がでなかったり周期が遅くなったりする。
 
   ただこれは入れておくべきと考えるので入れておく。
 
   もうこうなると、素子のバラツキで、RESETが掛りにくい素子なのかなと思いたくなる。
 
   サイン波のみの出力設定の場合は、OK
 
   これが不可解!!
  ・もう解んなくなってきたが、やはりRESET問題だと思うので、
 
   新たに、AD9834_PowerUp関数を追加し、DDS RESET後、各レジスタ値を、0に初期化、その後RESET解除し、
        
   アナデバで言う「AD9834のパワーアップ」を実行、その後、本番のレジスタ書込みをしたら、方形波同時出力でも、
 
   OKになる。
 
   またFSW設定を変更した場合もパワーアップが必要。
 
   これがないと更新しない時がある。
 
   ただ、コンパレータ出力設定の場合は、未だ上手く行かない。
 
   コンパレータ出力以外は、OKなのだが・・・・
■ 2015.1.12
 
  ・CQ出版社トライアルシリーズを読んでいたら、コンパレータ出力について次の記述があった。
 
   「コンパレータ入力はAC結合になっていて、カットオフ約4MHzの、ハイパスフィルタになっているようです。
 
            
低い周波数を入力するとコンパレータ出力にランダムな信号が現れて正常に動作しません。
        
   ・・・中略・・・
 
            
純度の高いサイン波が欲しい時は、コンパレータノイズ(スプリアス)の影響を受けないように、コンパレータ
        
    は止めておいた方が良い。」
        
   この記述の通り、低い周波数では正しくコンパレータ動作しないようなので、このモードは使わない
 
   こととした。 
  ・ここで幾つか波形取りしたので、抜粋してアップする。
 
   見てお判りのように、周波数精度がよくない。
 
   1000Hzで、6Hzずれている。
 
   これは、6Mの場合、周波数レジスタ値の計算結果が、小数点以下を伴うからである。
 
   今は簡易的に、四捨五入しているため誤差になる。
 
   後日何とかしたい。
 
   まあ、67.108864MHz X'tal OSCが動いてくれば問題ないのだが・・・

■ 2015.1.13
 
  ・6MHz OSCの場合、四捨五入して計算させると、1000Hzで+6Hzの誤差となるので 
       
   data = (unsigned long)(f * 44.7392426);
        
   として小数点計算の結果を、32bit整数型へキャストしてみた。(引数fの型は、floatに変更)
 
   コンパイルは通り、うまく行く。
 
   1000Hzで、+0Hz、10000Hzで、+1Hzの誤差
 
   1000000Hzで、+136Hzの誤差に留まった。(約0.01%= 100ppmの誤差)
      
      
   この水晶が古くて、仕様不明で、周波数安定度の定格が判らないが、型番から見ると、YXO-***
 
   となっているので、温度補償(TCXO)されてないタイプと思われる。
 
   TCXOなら、1ppmの安定度があるが、このタイプだと、約100ppmほどと思われる。
 
   そう考えれば、性能は出ているようである。
 
   (あくまでも、私の考えです。)
 
 
  ・周波数精度が良くなったので、6M版として、ここまでをHP公開することにした。
 
   結果の写真は、このページの冒頭を参照してください。
■ 2015.2.18 ※日にちが空きましたが、追試をしました。(2015/2/23更新)
 
 <追試1:_Fcyダウン+プルアップ削除で試す>
  ・2015.2.17の段階で、実験テーマ64にて、PIC18F14K50(5V系)では、
   内蔵の、67.108864MHz OSCで、AD9834 DDSモジュールを正しく動かすことが出来た。
   PIC24Fとの違いは以下である。
 
    @ 電源が、3.3V
    A SPIラインを+5Vでプルアップしている。
    B Fcyが高速(4Mに対し、16M)
   
・そこで、可能性は少ないと思うが、まずBについて、Fcyを、16Mから、4MHzにしてみた。
 
   これは、Config2でのクロック設定(内蔵8MHz+x4PLL=32MHz)は、そのままで、
   ポスト分周器の設定を、1/1から、1/4に変えるだけでOK。
  → やってみたが、全く症状変わらず。
  ・残る違いは、Aしかないので、これもやってみた。10kでプルアップしているが、この接続を切断して、
 
  直に、ピンソケットの、SPI号ピンに、PIC24Fポートからの信号線を接続修正した。

   当該SPIポートの、オープンドレイン設定をやめた。
  → 何とこれで上手く行った!!
     もちろん、方形波同時出力でだ!!
 
     SPIタイミング記述に一切の遅延要素を入れてなく、プログラムのスピードでも、ロジックレベルの整合は
 
     問題ないようで、動いている。
 
 
      
動的状態でのレベルは、高速オシロが無いので確認しようがないが
 
     静的な状態では、実測Hi= 3.23V, Lo=0V で
 
     AD9834の、SPI入力レベル規格は、Vih(min)= 2.8V(Vdd=4.5〜5.5V時)、Vil(max)=  
0.8V(Vdd=4.5〜5.5V時)
 
     であるので、整合は取れることになる。
 
     まあ、PIC24Fの出力ピン仕様は、標準で見ると、Voh(typ)=  
2.6V(標準で、Vdd-0.7)、Vol(typ)= 0.4Vなので、
 
     LoレベルはOKだが、Hiレベルは、Hiとして認識されないことになるが、
 
     実測では、3.23Vあるのでギリギリセーフのようだ。
■ 2015.2.19
 
 <追試2 プルアップ抵抗の値を変更して試す>
 
  ・今は、10kΩだが、これだと駄目、今より小さい値にする。
   手持ちの抵抗より、2.2kと、1kで試した。
   PIC24Fの、Vohは,標準で、2.6Vなので、PIC素子のバラツキで、この値に収まっていると、AD9834の、
   Vih=2.8Vmin なので、Hiとして認識しない可能性がある。
 
   なので、O.D設定+外部プルアップ対策はしておいた方がベターである。
   <結果>
    ・2.2Kで、SCLKの遅延挿入無しのフルスピードだと、改善はされるが時々NGになる。
     F切替時におかしくなることが多い。
     2.2kで、SCLKのところの遅延挿入をして、約4MHzに落とすと、さらに良くなるが、これでも100%  
OKになならない。
    ※ 結局、1kΩにして、SCLK≒4MHzで、100%  
OKになった。
 
 
    高速オシロを持ち合わせてないので、何とも言えませんが、
    O.D(オープンドレイン)設定の場合、弱プルアップ(10kΩ)では、SCLK等の立上り時間を十分速く出来ない
    ようで、SPIが誤動作していたものと推測します。

※ 以下は、150223更新版(67.108864MHz OSCで動いたバージョン)の回路図とソースです。
<最終回路図>
  
 ・こちらから、どうぞ→ 「AD9834 DDSモジュール実験回路」
 <最終ソース>
        
 ・こちらから、どうぞ→  DDS_AD9834_Test2.c
-------------------------------------------------------------------------------------------------------------------------------------------------
※ 以下は、更新前の、67.108864MHzでは動かず、6MHzで動かしたバージョンの回路図とソースです。
   参考程度に見て頂ければと思います。
<最終回路図>
  
 ・こちらから、どうぞ→ 「AD9834 DDSモジュール実験回路」
      
               「AD9834       
小型DDSモジュール回路」
<最終ソース>
        
 ・こちらから、どうぞ→  DDS_AD9834_Test.c
← 実験テーマ1に戻る TOP PAGEに戻る 実験テーマ64へ →