Programming of the DDS-60 (AD9851) frequency synthesizer from AmQRP http://midnightdesignsolutions.com/dds60/index.html I had to use long, floating math in order to get accurate frequency output.

Dependencies:   TextLCD mbed ChaNFS

Committer:
loopsva
Date:
Wed Apr 04 18:14:54 2012 +0000
Revision:
0:1ed24aaf786d
050511

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:1ed24aaf786d 1 #ifndef AD9851_H
loopsva 0:1ed24aaf786d 2 #define AD9851_H
loopsva 0:1ed24aaf786d 3
loopsva 0:1ed24aaf786d 4 #include "mbed.h"
loopsva 0:1ed24aaf786d 5
loopsva 0:1ed24aaf786d 6 /** A AD9851 driver interface to control the DDS-60 from AmQRP
loopsva 0:1ed24aaf786d 7 *
loopsva 0:1ed24aaf786d 8 * @code
loopsva 0:1ed24aaf786d 9 * #include "mbed.h"
loopsva 0:1ed24aaf786d 10 * #include "AD9851.h"
loopsva 0:1ed24aaf786d 11 *
loopsva 0:1ed24aaf786d 12 * AD9851 freqSyn(p13, p14, p15); //sdo, clk, len
loopsva 0:1ed24aaf786d 13 *
loopsva 0:1ed24aaf786d 14 * int main() {
loopsva 0:1ed24aaf786d 15 * freqSyn.AD9851Enable(); //turn on AD9851
loopsva 0:1ed24aaf786d 16 * freqSyn.AD9851Disable(); //turn off AD9851
loopsva 0:1ed24aaf786d 17 *
loopsva 0:1ed24aaf786d 18 * float Fdata;
loopsva 0:1ed24aaf786d 19 * Fdata = freqSyn.GetBaseValue(); //get Base frequency
loopsva 0:1ed24aaf786d 20 * Fdata = freqSyn.GetIfValue(); //get IF offset frequency
loopsva 0:1ed24aaf786d 21 *
loopsva 0:1ed24aaf786d 22 * freqSyn.SetBaseValue(7320000.0); //set new Base frequency (0.0 - 179,999,999.999MHz)
loopsva 0:1ed24aaf786d 23 * freqSyn.SetIfValue(1620000.0); //set new IF frequency (0.0 - 179,999,999.999MHz)
loopsva 0:1ed24aaf786d 24 * freqSyn.SetM6Value('A'); //set multiplier value 0 = 30MHz max, 6 = 180MHz max, A = auto
loopsva 0:1ed24aaf786d 25 *
loopsva 0:1ed24aaf786d 26 * //functions below are results from CalcNewValue()
loopsva 0:1ed24aaf786d 27 * bool ErFlag;
loopsva 0:1ed24aaf786d 28 * ErFlag = freqSyn.CalcNewValue(); //calculate new AD9851 value, based on Base, IF and M6 values
loopsva 0:1ed24aaf786d 29 * //if ok, new value output to AD9851
loopsva 0:1ed24aaf786d 30 * //note: reverts to old values if Base + IF * M6 is over limit, sets error flag
loopsva 0:1ed24aaf786d 31 * //ERROR occured with new values used by CalcNewValue()
loopsva 0:1ed24aaf786d 32 *
loopsva 0:1ed24aaf786d 33 * ErFlag = freqSyn.GetErrFlagValue(); //get error value from last time CalsNewValue() was executed
loopsva 0:1ed24aaf786d 34 *
loopsva 0:1ed24aaf786d 35 * unsigned int UIdata;
loopsva 0:1ed24aaf786d 36 * UIdata = freqSyn.GetFD32Value(); //get 32 bit hex value of AD9851 data
loopsva 0:1ed24aaf786d 37 *
loopsva 0:1ed24aaf786d 38 * char Cdata;
loopsva 0:1ed24aaf786d 39 * Cdata = freqSyn.GetFortyValue(); //get 8 bit hex value of AD9851 control register (enable & M6). Phase offset always 0
loopsva 0:1ed24aaf786d 40 * }
loopsva 0:1ed24aaf786d 41 * @endcode
loopsva 0:1ed24aaf786d 42 */
loopsva 0:1ed24aaf786d 43
loopsva 0:1ed24aaf786d 44 class AD9851 /*: public Stream*/ { // or : public Base
loopsva 0:1ed24aaf786d 45
loopsva 0:1ed24aaf786d 46 public:
loopsva 0:1ed24aaf786d 47 /** Create a frequency selector object
loopsva 0:1ed24aaf786d 48 * @param SDO serial data out
loopsva 0:1ed24aaf786d 49 * @param CLK serial clock - data clocked on + edge
loopsva 0:1ed24aaf786d 50 * @param LEN data latch enable strobe - high pulse after all 40 bits of data clocked in
loopsva 0:1ed24aaf786d 51 */
loopsva 0:1ed24aaf786d 52 AD9851(PinName SDO, PinName CLK, PinName LEN);
loopsva 0:1ed24aaf786d 53
loopsva 0:1ed24aaf786d 54 // Destroys object
loopsva 0:1ed24aaf786d 55 ~AD9851();
loopsva 0:1ed24aaf786d 56
loopsva 0:1ed24aaf786d 57 // Returns the stored Base Freq, IF Freq, 32 bit serial word and 5th control byte values
loopsva 0:1ed24aaf786d 58 double GetBaseValue();
loopsva 0:1ed24aaf786d 59 double GetIfValue();
loopsva 0:1ed24aaf786d 60 unsigned int GetFD32Value();
loopsva 0:1ed24aaf786d 61 char GetFortyValue();
loopsva 0:1ed24aaf786d 62 bool GetErrFlagValue();
loopsva 0:1ed24aaf786d 63
loopsva 0:1ed24aaf786d 64 // Set values
loopsva 0:1ed24aaf786d 65 double SetBaseValue(double bv);
loopsva 0:1ed24aaf786d 66 double SetIfValue(double bv);
loopsva 0:1ed24aaf786d 67 char SetM6Value(char bx);
loopsva 0:1ed24aaf786d 68
loopsva 0:1ed24aaf786d 69 // Turn the AD9851 on / off
loopsva 0:1ed24aaf786d 70 void AD9851Enable();
loopsva 0:1ed24aaf786d 71 void AD9851Disable();
loopsva 0:1ed24aaf786d 72
loopsva 0:1ed24aaf786d 73
loopsva 0:1ed24aaf786d 74 // calculates new AD9851 value - returns to old values if error occurs, sets error flag
loopsva 0:1ed24aaf786d 75 bool CalcNewValue();
loopsva 0:1ed24aaf786d 76
loopsva 0:1ed24aaf786d 77 protected:
loopsva 0:1ed24aaf786d 78 DigitalOut _clk, _sdo, _len;
loopsva 0:1ed24aaf786d 79 double bv;
loopsva 0:1ed24aaf786d 80 char bx;
loopsva 0:1ed24aaf786d 81
loopsva 0:1ed24aaf786d 82 private:
loopsva 0:1ed24aaf786d 83
loopsva 0:1ed24aaf786d 84 // transfers new 40 bit word to the AD9851
loopsva 0:1ed24aaf786d 85 void OutNewValue();
loopsva 0:1ed24aaf786d 86 void FirstAccess();
loopsva 0:1ed24aaf786d 87
loopsva 0:1ed24aaf786d 88
loopsva 0:1ed24aaf786d 89 };
loopsva 0:1ed24aaf786d 90 #endif