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
AD9851/AD9851.h@0:1ed24aaf786d, 2012-04-04 (annotated)
- Committer:
- loopsva
- Date:
- Wed Apr 04 18:14:54 2012 +0000
- Revision:
- 0:1ed24aaf786d
050511
Who changed what in which revision?
User | Revision | Line number | New 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 |