2015年9月9日水曜日

Arduino AD9834 DDS PCB

Arduino UNO版AD9834 DDSをPCB化した。このPCBテストの為、水晶発振器代替(チャンネル切替方式)7MHz用にAD9851のプログラムを移植した。試験するには、コンパクトなプログラムなので重宝する。DDS発振周波数は、送信時、7.195MHz、7.181MHz、7.160MHz。また、受信時は、0Hz(DDS発振停止)。

回路図である。バッファアンプのベース抵抗は、2次高調波低減の為、4.7kとした。プログラムで使わないI/Oは、書いてない。
基本波のスペクトラム。
広帯域増幅なので致し方ないが、バッファアンプ付加により、n次のスプリアスがある。4次以降のスプリアスは、見当らなかった。この程度であれば、アプリケーションで対応可能だ。
電源電圧5V時、出力4mW。バッファアンプの電源は、VINからでもジャンパー出来るので、出力アップ可能。

基板サイズ 69 x 54。
オシレターは、正方形、長方形に対応。














program

7MHz AM送信機用に周波数が設定してある。受信時は、発振停止。クロックは、手持ちの部品で周波数を選んで56MHzとしたが、この周波数に拘る事は無い。
 
//////////////////////////////////////////////////////////////////////
//  AD9834 DDS VFO Premixed type program ver.1.0
//
//    Copyright(C)2014.JA2GQP.All rights reserved.
//     Crystal replacement
//                                                  2015/9/8
//                                                  JA2GQP
//--------------------------------------------------------------------
//  Function
//    1.ch0=7.195Mhz ch1=7.181Mhz ch2=7.160Mhz ch3=7.195Mhz
//    2.TX=chenel frequency RX=0Hz(off)
//////////////////////////////////////////////////////////////////////

//----------  Define Constant Value   ----------
                                             
const byte  SDATA = 4;                     // AD9834 SDATA
const byte  SCLK = 5;                      //        SCLK
const byte  FSYNC = 6;                     //        FSYNC

const byte  SW_CH1 = 10;                   // Channel 1
const byte  SW_CH2 = 11;                   //         2
const byte  SW_CH3 = 12;                   //         3
const byte  SW_TX = 13;                    // TX Sw

const long  FRQ_CH0 = 7195000L;            // CH0=7.195Mhz
const long  FRQ_CH1 = 7181000L;            // CH1=7.181Mhz
const long  FRQ_CH2 = 7160000L;            // CH2=7.160Mhz
const long  FRQ_CH3 = 7195000L;            // CH3=7.195Mhz

const unsigned long  DDS_CLK = 56000000L;  // AD9834 Clock 56Mhz
const unsigned long  TWO_E28 = 268435456L; // 2^28

//----------  Memory Assign  -------------------

long Dds_Dat = 0;                         // DDS Data

//----------  Initialization  Program  ---------------

void setup(){
  pinMode(SW_TX,INPUT_PULLUP);            // Input pin set
  pinMode(SW_CH1,INPUT_PULLUP);
  pinMode(SW_CH2,INPUT_PULLUP);
  pinMode(SW_CH3,INPUT_PULLUP);

  pinMode(FSYNC,OUTPUT);                  // Output pin set
  pinMode(SCLK,OUTPUT);
  pinMode(SDATA,OUTPUT);
}

//----------  Main program  ---------------

void loop() {
  if(digitalRead(SW_CH1) == LOW){
    Dds_Dat = FRQ_CH1;
    }
  else if(digitalRead(SW_CH2) == LOW){
    Dds_Dat = FRQ_CH2;
    }
  else if(digitalRead(SW_CH3) == LOW){
    Dds_Dat = FRQ_CH3;
    }
    else{
      Dds_Dat = FRQ_CH0;
      }

  if(digitalRead(SW_TX) == HIGH){            // Rx?
    Dds_Dat = 0L;
    }

  Fnc_Dds(Dds_Dat);
  delay(100);
}

//----------  Function DDS set  ---------------

void Fnc_Dds(double frquency){
  unsigned long wrk = frquency * TWO_E28 / DDS_CLK;
  unsigned int wrk1,wrk2,wrk3;

  wrk1 = 0x2000;
  wrk2 = wrk & 0x3fff;
  wrk2 = wrk2 | 0x4000;
  wrk3 = wrk >> 14;
  wrk3 = wrk3 & 0x3fff;
  wrk3 = wrk3 | 0x4000;

  digitalWrite(SCLK,HIGH);                       // Added 2014/12/29
  digitalWrite(FSYNC,LOW);

  shiftOut(SDATA,SCLK,MSBFIRST,(wrk1 >> 8));
  shiftOut(SDATA,SCLK,MSBFIRST,wrk1);

  shiftOut(SDATA,SCLK,MSBFIRST,(wrk2 >> 8));
  shiftOut(SDATA,SCLK,MSBFIRST,wrk2);

  shiftOut(SDATA,SCLK,MSBFIRST,(wrk3 >> 8));
  shiftOut(SDATA,SCLK,MSBFIRST,wrk3);

  digitalWrite(FSYNC,HIGH);
}












         

0 件のコメント: