回路図は、DDS VFOとして機能する様、フルスペックで書いて有る。今回の仕様は、チャンネル切替式の為、破線部分は不要。
program
最小限の機能なので、DDS入門に適している。公開済のArduino AD9851 VFOでDDSが発振しない事(原因は、DDS Reset)が有った。今回、DDS Resetを含め、シンプルに纏めた。
//////////////////////////////////////////////////////////////////////
// AD9851 DDS program ver.1.0
//
// Copyright(C)2014-2015.JA2GQP.All rights reserved.
// Crystal replacement
// 2015/8/3
// JA2GQP
//--------------------------------------------------------------------
// Function
// 1.ch0=50.6Mhz ch1=50.55Mhz ch2=50.62Mhz ch3=50.69Mhz
// 2.TX=chenel frequency RX=0Hz(off)
//////////////////////////////////////////////////////////////////////
//---------- Define Constant Value ----------
const byte DATA = 4; // DIO4
const byte W_CLK = 5; // DIO5
const byte FQ_UD = 6; // DIO6
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 byte DDS_RST = 14; // DDS Reset
const long FRQ_CH0 = 50600000L; // CH0=50.6Mhz
const long FRQ_CH1 = 50550000L; // CH0=50.55Mhz
const long FRQ_CH2 = 50620000L; // CH0=50.62Mhz
const long FRQ_CH3 = 50690000L; // CH0=50.69Mhz
const unsigned long DDS_CLK = 192000000L; // AD9851 Clock(32MHz * 6)
const unsigned long TWO_E32 = 4294967295L; // 2^32
const byte DDS_CMD = B00000001; // AD9851 Command
//---------- 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(DDS_RST,OUTPUT); // Output pin set
pinMode(FQ_UD,OUTPUT);
pinMode(W_CLK,OUTPUT);
pinMode(DATA,OUTPUT);
Fnc_Dds_Int(); // DDS Initial
}
//---------- 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 Initialization ---------------
void Fnc_Dds_Int(){
digitalWrite(DDS_RST,HIGH);
delay(1);
digitalWrite(DDS_RST,LOW);
digitalWrite(W_CLK,HIGH);
digitalWrite(W_CLK,LOW);
digitalWrite(FQ_UD,HIGH);
digitalWrite(FQ_UD,LOW);
}
//---------- Function DDS set ---------------
void Fnc_Dds(double frquency){
unsigned long wrk = frquency * TWO_E32 / DDS_CLK;
digitalWrite(FQ_UD,LOW);
shiftOut(DATA,W_CLK,LSBFIRST,wrk);
shiftOut(DATA,W_CLK,LSBFIRST,(wrk >> 8));
shiftOut(DATA,W_CLK,LSBFIRST,(wrk >> 16));
shiftOut(DATA,W_CLK,LSBFIRST,(wrk >> 24));
shiftOut(DATA,W_CLK,LSBFIRST,DDS_CMD); // AD9851 command
digitalWrite(FQ_UD,HIGH);
}
0 件のコメント:
コメントを投稿