I have used Arduino Uno and module AD9850. I used the code below. Function OK. Very nice. AD9850 give out the suggested frequency.
Now the problem.
I use AD9850 module. The data sheet says up to 70 MHz.
BUT
In the code 8,8 MHz
Out AD9851 module 2,113 MHz
I cannot get freq. higher than 15 MHz out of AD9851.
Do i need to complete the code when i use AD9851?
This is the code i called "36C_DDS1_1Band_AD9851 FORUM"
/*
//1 Define in o utgångspinnarna
*/
//DDS1
const int DATA1 = 3; // Data DDS
const int FQ_UD1 = 4; // Frekvens uppdatering DDS
const int W_CLK1 = 5; // Clock till DDS
const int VFOpot1 = A0; // potentiometer för VFO
const int RITPot1 = A1; // Potentiometer för RIT
//DDS1
// Namnge och definiera några variablar som vi behöver
// Eftersom vi har siffror över 32000 så måste vi använda long, double och float
boolean Transmit1 =false; // skall vi sända? frekvensskift?
boolean sendDDS1 = HIGH; // uppdatera DDS:en
boolean TxPinState1 = HIGH; // TX nyckeln
int BandDDS1 = 0; // amatörbandval från BCD omkopplaren 0...15
long VFO_freq1 = 0; // frekvensen från VFO pot 0....100000
long RIT_freq1 = 0; // frekvensen från RIT pot 0....10000
long Freq1 = 0; // beräknad frekvens till DDS:en 0....1100000
long Pot_Freq1 = 0; // VFO + RIT sammanslagna 0....110000
long oldFreq1 = 0; // sparat värde för jämförelse med nya Freq 0....110000
//DDS1
// VFO UNDRE BANDKANT INVERTERAD LOGIK BANDOMK
long BandetDDS1 = 2080000000L; // Enda bandet DDS1
//DDS1
double TxOffset1 = 0; // ifall det är offset till sändaren
double RxOffset1 = 0; // offset vid superheterodynmottagare
float VFO_Freq_out1 = 0; // flyttal till medelvärdesberäkningen
float RIT_Freq_out1 = 0; // flyttal till medelvärdesberäkningen
//*********************************************************************************
//2 Setup
void setup() { // Setup... körs bara ett cykelvarv vid power on
//DDS1
// pinMode(TxPin,INPUT_PULLUP); // telegrafinyckeln
pinMode(FQ_UD1, OUTPUT); // frekvensuppdatering DDS
pinMode(W_CLK1, OUTPUT); // clockning av data till DDS
pinMode(DATA1, OUTPUT); // data till DDS
//DDS1
// starta upp DDS:en i serie mode
pulseHigh1(W_CLK1);
pulseHigh1(FQ_UD1);
//start the oscillator...
DDSsend1(); // starta DDS:en
}
// end of void setup
//*************************************************************************
//3 LOOP
//DDS1
void loop() { // Huvudprogrammet loopas kontinuerligt
// First, we check for Transmit1...
// TxPinState1 = digitalRead(TxPin); // kolla om nyckeln är nedtryckt
if (TxPinState1==0){ // nyckeln är nedtryckt!
if (Transmit1==false){ // kör endast en flank.. ett cykelvarv
Transmit1=true;
Freq1=(Freq1+15); // stör medelvärdesberäkningen till DDS:en
DDSsend1(); // så den uppdateras direkt!!
}
}
else{
// No :- we're in "Receive" Nyckeln är uppe!
if (Transmit1==true){ // kör endast en flank... ett cykelvarv
Transmit1=false;
Freq1=(Freq1+15); // stör medelvärdesberäkningen till DDS:en
DDSsend1(); // så den uppdateras direkt!!
}
}
//DDS1
switch (BandDDS1) {
case 0:
ReadPot1(); // Läs av VFO_pot + RIT_pot
Freq1 = BandetDDS1 + VFO_freq1; // addera Band + potarna
DDSsend1(); // sänd beräknade värdet till DDS:en
break;
}
}
//void loop end
//Subrutiner***********
//4 READPOT
void ReadPot1(){ // läs in potarna mappa dem och summera ihop dem
VFO_freq1 = analogRead(VFOpot1); // Läs av VFO pot
// VFO BANDBREDD
VFO_freq1 = map(VFO_freq1, 0, 1023, 0, 1023)*100; // mappa VFO poten till 0...102.300Hz
RIT_freq1 = analogRead(RITPot1); // Läs av RIT pot
// RIT BANDBREDD
RIT_freq1 = map(RIT_freq1, 0, 1023, -260, 260)*10; // mappa RIT poten till -2,6kHz..0..2,6kHz
VFO_Freq_out1 = VFO_Freq_out1 * 0.99 + VFO_freq1 * 0.01; // medelvärdesberäkna med flyttal
VFO_freq1 = (long)VFO_Freq_out1; // gör long integer av flyttalet
RIT_Freq_out1 = RIT_Freq_out1 * 0.99 + RIT_freq1 * 0.01; // medelvärdesberäkna med flyttal
RIT_freq1 = (long)RIT_Freq_out1; // gör long integer av flyttalet
VFO_freq1 = VFO_freq1 + RIT_freq1; // addera potarna
}
// end ReadPot
//**************************************************************************************
//5 DDSsend
//DDS1
void DDSsend1(){
// HYSTERES
//kolla om nya och gamla värdet skiljer mer än +/- 50 Hz
if (Freq1 >(oldFreq1 + 9) or Freq1 < (oldFreq1 - 9) ) {sendDDS1 = true;}
else { sendDDS1 = false;}
if (sendDDS1 == true) {
sendFrequency1(Freq1, Transmit1); // sänd till DDS:en
oldFreq1 = Freq1;}} // uppdatera till nästa jämförelse
//*************************************************************************************
// Subroutine to generate a positive pulse on 'pin'...
void pulseHigh1(int pin1) { // användes till att clocka DDS:en
digitalWrite(pin1, HIGH);
digitalWrite(pin1, LOW);
}
//**************************************************************************************
//6 tfr_byte
//DDS1
// transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
void tfr_byte1(byte data1)
{
for (int i=0; i<8; i++, data1>>=1) {
digitalWrite(DATA1, data1 & 0x01);
pulseHigh1(W_CLK1); //after each bit sent, CLK is pulsed high
}
}
//************************************************************************************
//7 sendFrequency
//DDS1
// calculate and send frequency code to DDS Module...
void sendFrequency1(double Freq1, boolean Tx1) {
int32_t freq1 = (Freq1+RxOffset1) * 4294967295/125000000;
if (Transmit1==true){
freq1 = (Freq1-RIT_freq1-TxOffset1) * 4294967295/125000000;
}
for (int b=0; b<4; b++, freq1>>=8) { //shiftOut(DATA1, W_CLK1, LSBFIRST, freq1 & 0xFF);
tfr_byte1(freq1 & 0xFF);
}
//DDS1
// shiftOut(DATA, W_CLK, LSBFIRST, 0x00); // sista databiten är nollor
tfr_byte1(0x000); // Final control byte, all 0 for 9850 chip
pulseHigh1(FQ_UD1); // skicka uppdatering av frekvensen till DDS:en
}
//************************************************************************************
//8 SLUT