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
- Committer:
- loopsva
- Date:
- 2012-04-04
- Revision:
- 0:1ed24aaf786d
File content as of revision 0:1ed24aaf786d:
#ifndef AD9851_H #define AD9851_H #include "mbed.h" /** A AD9851 driver interface to control the DDS-60 from AmQRP * * @code * #include "mbed.h" * #include "AD9851.h" * * AD9851 freqSyn(p13, p14, p15); //sdo, clk, len * * int main() { * freqSyn.AD9851Enable(); //turn on AD9851 * freqSyn.AD9851Disable(); //turn off AD9851 * * float Fdata; * Fdata = freqSyn.GetBaseValue(); //get Base frequency * Fdata = freqSyn.GetIfValue(); //get IF offset frequency * * freqSyn.SetBaseValue(7320000.0); //set new Base frequency (0.0 - 179,999,999.999MHz) * freqSyn.SetIfValue(1620000.0); //set new IF frequency (0.0 - 179,999,999.999MHz) * freqSyn.SetM6Value('A'); //set multiplier value 0 = 30MHz max, 6 = 180MHz max, A = auto * * //functions below are results from CalcNewValue() * bool ErFlag; * ErFlag = freqSyn.CalcNewValue(); //calculate new AD9851 value, based on Base, IF and M6 values * //if ok, new value output to AD9851 * //note: reverts to old values if Base + IF * M6 is over limit, sets error flag * //ERROR occured with new values used by CalcNewValue() * * ErFlag = freqSyn.GetErrFlagValue(); //get error value from last time CalsNewValue() was executed * * unsigned int UIdata; * UIdata = freqSyn.GetFD32Value(); //get 32 bit hex value of AD9851 data * * char Cdata; * Cdata = freqSyn.GetFortyValue(); //get 8 bit hex value of AD9851 control register (enable & M6). Phase offset always 0 * } * @endcode */ class AD9851 /*: public Stream*/ { // or : public Base public: /** Create a frequency selector object * @param SDO serial data out * @param CLK serial clock - data clocked on + edge * @param LEN data latch enable strobe - high pulse after all 40 bits of data clocked in */ AD9851(PinName SDO, PinName CLK, PinName LEN); // Destroys object ~AD9851(); // Returns the stored Base Freq, IF Freq, 32 bit serial word and 5th control byte values double GetBaseValue(); double GetIfValue(); unsigned int GetFD32Value(); char GetFortyValue(); bool GetErrFlagValue(); // Set values double SetBaseValue(double bv); double SetIfValue(double bv); char SetM6Value(char bx); // Turn the AD9851 on / off void AD9851Enable(); void AD9851Disable(); // calculates new AD9851 value - returns to old values if error occurs, sets error flag bool CalcNewValue(); protected: DigitalOut _clk, _sdo, _len; double bv; char bx; private: // transfers new 40 bit word to the AD9851 void OutNewValue(); void FirstAccess(); }; #endif