Go Down

Topic: DDS AD9851 (Read 269 times) previous topic - next topic

mentorade

Salve a tutti Arduinieri,
vi scrivo per avere qualche delucidazione in merito all'utilizzo dell'integrato AD9851.
Premetto che ho già avuto esperienze con suo fratello AD9850, per il quale non ho trovato alcun problema.
Ho cercato di usare lo steso sketch che mi era servito in precedenza ma senza risultato, ho poi letto che c'è da stare attenti con la parola da 32 bit da inserire perché è codificata in maniera leggermente diversa ma una volta acceso il caro 9851 sembra non volerne sapere di sputarmi fuori la tanto agognata radiofrequenza..
Il led della scheda si accende ma l'integrato nemmeno si scalda, cosa che il 9850 faceva.
Qualcuno ha mai avuto a che fare con questi strumenti?
Vi allego lo sketch e vi saluto calorosamente






Code: [Select]

#define W_CLK A4   // word load clock pin (CLK)
#define FQ_UD A3   // freq update pin (FQ)
#define DATA A2   // serial data load pin (DATA)
#define RESET A1  // reset pin (RST)
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW);}

#define potenziometro A0

#include <LiquidCrystal.h>           
LiquidCrystal lcd (6, 7, 9, 10, 11, 12);     

void setup() {
  Serial.begin (9600);
  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 AD9851 - Datasheet page 15.
       
  lcd.begin (16, 2);
  pinMode(A0, INPUT);
}


// 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<40; i++, data>>=1) {
    if (i==32){
      data=1;                             //attiva il moltiplicatore di frequenza di clock
    digitalWrite(DATA, data & 0x01);      //la "&" qui fa un'operazione booleana con il valore di "data"
    }
    pulseHigh(W_CLK);   //after each bit sent, CLK is pulsed high
  }
}

// frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) { 
  int32_t freq = frequency * 4294967295/180000000;     
  tfr_byte(freq);
  pulseHigh(FQ_UD);  // Done!  Should see output
}


void loop() {
  int valFreq=analogRead (potenziometro);
  int freqHz = map(valFreq, 0,1023, 0,300);
  static int valori [100];
  static int n = 0;
  valori [n] = freqHz;           
  n++;
  if (n>99){
    n=0;
  }
  static int stamp; 
  int somma;                       
  for (int a=0; a<100; a++){               
    somma = somma + valori [a];
  }
  stamp = somma/100;                 
  static int oldFreq=0;
  sendFrequency (stamp*100000);
  if (oldFreq != stamp){              //ATTENTO al != e non =!
    if (stamp == 0){
      stamp = 1;
    }
    sendFrequency (stamp*100000);
    lcd.clear ();
    lcd.setCursor (0, 0);
    lcd.print (stamp*100000);
    oldFreq = stamp;
  }
}

Sulimarco

Hai messo due graffe di troppo.
Prova cosi':

Code: [Select]

void tfr_byte(byte data)
{
  for (int i=0; i<40; i++, data>>=1)
  {
    if (i==32)
      data=1;                             //attiva il moltiplicatore di frequenza di clock
    digitalWrite(DATA, data & 0x01);      //la "&" qui fa un'operazione booleana con il valore di "data"
    
    pulseHigh(W_CLK);   //after each bit sent, CLK is pulsed high
  }
}



Marco

Go Up