bonjour
je suis bloqué sur l'algorithme pour le control du AD9850 avec l'Arduino si c possible j'aimerais avoir qlq information pour me guidé un peu je vous pris de m'aidé si c possible
-----
bonjour
je suis bloqué sur l'algorithme pour le control du AD9850 avec l'Arduino si c possible j'aimerais avoir qlq information pour me guidé un peu je vous pris de m'aidé si c possible
Dernière modification par Jack ; 11/02/2016 à 16h43. Motif: Modification du titre
Quel est le rapport avec ce qui précède?
Alors tu ouvres une nouvelle discussion et tu expliques clairement ce sur quoi tu buttes.
Il est d'usage de donner un lien vers le circuit qui pose problème, dans ton cas, l'AD9850.
http://www.ad7c.com/projects/ad9850-dds-vfo/
VOICI LE lien j'ai pas une grande connaissance pour la programation arduino j'ai trouvé un algorithme avec le microC mais reste a le convertir :s
Il y a du code arduino récupérable sur la page que tu donnes...
j'ai deja esseyé ce code mais ca marche pas
C'est à dire ? Qu'est ce qui ne marche pas ?
Tu peux sans doute contacter l'auteur de la page pour lui demander assistance...
j'ai pas pu afficher les 2 signaux en meme temps :s
Tu cherches à faire quoi exactement ?
Donne le code et le schéma.
ca c'est le prog que j'ai:Code:/* Main code by Richard Visokey AD7C - www.ad7c.com Revision by VK8BN March 28 2014 5 to 5.5 VFO for 6 meter Rig Added 1 Hz frequency steps default start step size 10 Hz */ // Include the library code #include <LiquidCrystal.h> #include <rotary.h> #include <EEPROM.h> //Setup some items #define W_CLK 8 // Pin 8 - connect to AD9850 module word load clock pin (CLK) #define FQ_UD 9 // Pin 9 - connect to freq update pin (FQ) #define DATA 10 // Pin 10 - connect to serial data load pin (DATA) #define RESET 11 // Pin 11 - connect to reset pin (RST) #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); } Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses. Must be interrupt pins. LiquidCrystal lcd(12, 13, 7, 6, 5, 4); // I used an odd pin combination because I need pin 2 and 3 for the interrupts. int_fast32_t Band = 50000000 ; int_fast32_t rx= Band; // Starting frequency of VFO int_fast32_t rx2=1; // variable to hold the updated frequency int_fast32_t increment = 10; // starting VFO update increment in HZ. int buttonstate = 0; int GoUSB = 1; String hertz = "10 Hz"; int hertzPosition = 5; byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ; //Placeholders String freq; // string to hold the frequency int_fast32_t timepassed = millis(); // int to hold the arduino miilis since startup int memstatus = 1; // value to notify if memory is current or old. 0=old, 1=current. int ForceFreq = 1; // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory. YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET! void setup() { pinMode(A0,INPUT); // Connect to a button that goes to GND on push pinMode (A5,INPUT); // connect to toggle switch to change from upper to lower sideband digitalWrite(A0,HIGH); digitalWrite(A5,HIGH); lcd.begin(16, 2); PCICR |= (1 << PCIE2); PCMSK2 |= (1 << PCINT18) | (1 << PCINT19); sei(); pinMode(FQ_UD, OUTPUT); pinMode(W_CLK, OUTPUT); pinMode(DATA, OUTPUT); pinMode(RESET, OUTPUT); pulseHigh(RESET); pulseHigh(W_CLK); pulseHigh(FQ_UD); // this pulse enables serial mode on the AD9850 - see datasheet lcd.setCursor(hertzPosition,1); lcd.print(hertz); // Load the stored frequency if (ForceFreq == 0) { freq = String(EEPROM.read(0))+String(EEPROM.read(1))+String(EEPROM.read(2))+String(EEPROM.read(3))+String(EEPROM.read(4))+String(EEPROM.read(5))+String(EEPROM.read(6)); rx = freq.toInt(); } } void loop() { if (rx != rx2){ showFreq(); sendFrequency(rx); rx2 = rx; } buttonstate = digitalRead(A0); if(buttonstate == LOW) { setincrement(); }; // Write the frequency to memory if not stored and 2 seconds have passed since the last frequency change. if(memstatus == 0){ if(timepassed+10000 < millis()){ storeMEM(); } } } ISR(PCINT2_vect) { unsigned char result = r.process(); if (result) { if (result == DIR_CW){rx=rx+increment;} else {rx=rx-increment;}; if (rx >=56000000){rx=rx2;}; // UPPER VFO LIMIT if (rx <=48000000){rx=rx2;}; // LOWER VFO LIMIT } } // frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32 void sendFrequency(double frequency) { if (GoUSB == 1){frequency =frequency / 10 ;}; // devide by 10 to give 5 to 5.5 Mhz int32_t freq = ( frequency )* 4294967296./125000000; // 125 MHz clock on 9850. slight adjustment to the 125000000 can be made to correct for any frequency error in each individual DDS board for (int b=0; b<4; b++, freq>>=8) { tfr_byte(freq & 0xFF); } tfr_byte(0x000); // Final control byte for 9850, set to (0x001) for 9851 to enable 6 x multiplier of xtal for 180 MHz clock pulseHigh(FQ_UD); // Done! Should see output } // transfers a byte, a bit at a time, LSB first to the 9851 via serial DATA line void tfr_byte(byte data) { for (int i=0; i<8; i++, data>>=1) { digitalWrite(DATA, data & 0x01); pulseHigh(W_CLK); //after each bit sent, CLK is pulsed high } } void setincrement(){ if(increment == 1){increment = 10; hertz = "10 Hz"; hertzPosition=5;} else if(increment == 10){increment = 50; hertz = "50 Hz"; hertzPosition=5;} else if (increment == 50){increment = 100; hertz = "100 Hz"; hertzPosition=4;} else if (increment == 100){increment = 500; hertz="500 Hz"; hertzPosition=4;} else if (increment == 500){increment = 1000; hertz="1 Khz"; hertzPosition=6;} else if (increment == 1000){increment = 2500; hertz="2.5 Khz"; hertzPosition=4;} else if (increment == 2500){increment = 5000; hertz="5 Khz"; hertzPosition=6;} else if (increment == 5000){increment = 10000; hertz="10 Khz"; hertzPosition=5;} else if (increment == 10000){increment = 100000; hertz="100 Khz"; hertzPosition=4;} else if (increment == 100000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;} else{increment = 1; hertz = "1 Hz"; hertzPosition=5;}; lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(hertzPosition,1); lcd.print(hertz); delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed. }; void showFreq(){ millions = int(rx/1000000); hundredthousands = ((rx/100000)%10); tenthousands = ((rx/10000)%10); thousands = ((rx/1000)%10); hundreds = ((rx/100)%10); tens = ((rx/10)%10); ones = ((rx/1)%10); lcd.setCursor(0,0); lcd.print(" "); if (millions > 9){lcd.setCursor(0,0);} else{lcd.setCursor(1,0);} lcd.print(millions); lcd.print("."); lcd.print(hundredthousands); lcd.print(tenthousands); lcd.print(thousands); lcd.print("."); lcd.print(hundreds); lcd.print(tens); lcd.print(ones); lcd.print(" Mhz "); timepassed = millis(); memstatus = 0; // Trigger memory write }; void storeMEM(){ //Write each frequency section to a EPROM slot. Yes, it's cheating but it works! EEPROM.write(0,millions); EEPROM.write(1,hundredthousands); EEPROM.write(2,tenthousands); EEPROM.write(3,thousands); EEPROM.write(4,hundreds); EEPROM.write(5,tens); EEPROM.write(6,ones); memstatus = 1; // Let program know memory has been written };
Dernière modification par Jack ; 11/02/2016 à 16h40. Motif: Balises code
Merci de penser à ajouter les balises code à l'avenir.
Schéma ?
Je maintiens ma question : tu cherches à faire quoi ?
Le code parle d'un afficheur LCD, de boutons et autre potar rotatif... Toi, tu as quoi ?
les bouton rotatif se sont des potentiometre pour variée la frequence
l'afficheur LCD pour afficher le pas la frequence le type de signal(carré ou sinisoidale) et la forme d'onde. le probleme ce que j'ai pas pu afficher les deux forme en meme temps
Donne ton schéma !
Tu utilises un oscillo pour la visu ?
Ce n'est pas un lien vers la doc du produit.
Ceci n'est pas compatible avec ton projet.