22// FILE: AD9833.cpp
33// AUTHOR: Rob Tillaart
44// PURPOSE: Arduino library for AD9833 function generator
5- // VERSION: 0.1.0
5+ // VERSION: 0.1.1
66// URL: https://github.com/RobTillaart/AD9833
77//
88
@@ -32,8 +32,12 @@ void AD9833::begin(uint8_t selectPin, uint8_t dataPin, uint8_t clockPin)
3232 _dataPin = dataPin;
3333 _clockPin = clockPin;
3434
35- pinMode (_selectPin, OUTPUT);
36- digitalWrite (_selectPin, HIGH);
35+ _useSelect = (_selectPin != 255 );
36+ if (_useSelect)
37+ {
38+ pinMode (_selectPin, OUTPUT);
39+ digitalWrite (_selectPin, HIGH);
40+ }
3741
3842 _hwSPI = ((dataPin == 0 ) || (clockPin == 0 ));
3943
@@ -65,7 +69,7 @@ void AD9833::begin(uint8_t selectPin, uint8_t dataPin, uint8_t clockPin)
6569 pinMode (_dataPin, OUTPUT);
6670 pinMode (_clockPin, OUTPUT);
6771 digitalWrite (_dataPin, LOW);
68- digitalWrite (_clockPin, LOW );
72+ digitalWrite (_clockPin, HIGH );
6973 }
7074 reset ();
7175}
@@ -74,8 +78,12 @@ void AD9833::begin(uint8_t selectPin, uint8_t dataPin, uint8_t clockPin)
7478void AD9833::begin (uint8_t selectPin, SPIClass * spi)
7579{
7680 _selectPin = selectPin;
77- pinMode (_selectPin, OUTPUT);
78- digitalWrite (_selectPin, HIGH);
81+ _useSelect = (_selectPin != 255 );
82+ if (_useSelect)
83+ {
84+ pinMode (_selectPin, OUTPUT);
85+ digitalWrite (_selectPin, HIGH);
86+ }
7987
8088 _hwSPI = true ;
8189 _spi_settings = SPISettings (8000000 , MSBFIRST, SPI_MODE2);
@@ -90,26 +98,45 @@ void AD9833::begin(uint8_t selectPin, SPIClass * spi)
9098
9199void AD9833::reset ()
92100{
93- setWave (AD9833_OFF);
94- setFrequency (1000 , 0 );
95- setFrequency (1000 , 1 );
96- setPhase (0 , 0 );
97- setPhase (0 , 1 );
101+ hardwareReset ();
102+ _control = AD9833_B28;
103+ writeControlRegister (_control);
104+ }
105+
106+
107+ void AD9833::hardwareReset ()
108+ {
109+ writeControlRegister (_control | 0x0100 );
110+ // reset all library variables to be in "sync" with hardware.
111+ _control = 0 ;
112+ _waveform = AD9833_OFF;
113+ _freq[0 ] = _freq[1 ] = 0 ;
114+ _phase[0 ] = _phase[1 ] = 0 ;
115+ }
116+
117+
118+ bool AD9833::setPowerMode (uint8_t mode)
119+ {
120+ if (mode > 3 ) return false ;
121+ _control &= 0xFF3F ; // clear previous power flags
122+ _control |= (mode << 6 ); // set the new power flags
123+ writeControlRegister (_control);
124+ return true ;
98125}
99126
100127
101- void AD9833::setWave (uint8_t waveType )
128+ void AD9833::setWave (uint8_t waveform )
102129{
103- if (waveType > 4 ) return ;
130+ if (waveform > 4 ) return ;
104131
105- // store wave type
106- _waveType = waveType ;
132+ // store waveform
133+ _waveform = waveform ;
107134
108135 // clear bits in control register
109136 _control &= ~(AD9833_SLEEP1 | AD9833_SLEEP12 | AD9833_OPBITEN | AD9833_MODE);
110137
111138 // set bits in control register
112- switch (_waveType )
139+ switch (_waveform )
113140 {
114141 case AD9833_OFF:
115142 _control |= (AD9833_SLEEP1 | AD9833_SLEEP12);
@@ -133,7 +160,7 @@ void AD9833::setWave(uint8_t waveType)
133160
134161uint8_t AD9833::getWave ()
135162{
136- return _waveType ;
163+ return _waveform ;
137164}
138165
139166
@@ -147,10 +174,8 @@ float AD9833::setFrequency(float freq, uint8_t channel)
147174 // convert to bit pattern
148175 // fr = round(freq * pow(2, 28) / 25 MHz));
149176 // rounding
150- uint32_t fr = (_freq[channel] * (268435456.0 / 25000000.0 ) + 0.5 );
177+ uint32_t fr = round (_freq[channel] * (268435456.0 / 25000000.0 ));
151178
152- _control |= AD9833_B28;
153- writeControlRegister (_control);
154179 writeFreqRegister (channel, fr);
155180
156181 return _freq[channel];
@@ -253,10 +278,11 @@ void AD9833::writeFreqRegister(uint8_t reg, uint32_t freq)
253278 if (reg == 1 ) data = 0x8000 ; // bit 15 and 14 10
254279
255280 // 28 bits in two sets of 14
256- data |= (freq & 0x3FFF );
281+ data |= (freq & 0x3FFF ); // least significant 14 bits
257282 writeData (data);
258- data &= 0xC000 ;
259- data |= (freq >> 14 );
283+
284+ data &= 0xC000 ; // remove freq data LSB
285+ data |= (freq >> 14 ); // most significant 14 bits
260286 writeData (data);
261287}
262288
@@ -275,7 +301,7 @@ void AD9833::writePhaseRegister(uint8_t reg, uint16_t value)
275301
276302void AD9833::writeData (uint16_t data)
277303{
278- digitalWrite (_selectPin, LOW);
304+ if (_useSelect) digitalWrite (_selectPin, LOW);
279305 if (_hwSPI)
280306 {
281307 mySPI->beginTransaction (_spi_settings);
@@ -290,13 +316,13 @@ void AD9833::writeData(uint16_t data)
290316 // MSBFIRST
291317 for (uint16_t mask = 0x8000 ; mask; mask >>= 1 )
292318 {
293- digitalWrite (dao, (data & mask));
319+ digitalWrite (dao, (data & mask) != 0 ? HIGH : LOW );
294320 digitalWrite (clk, LOW);
295321 digitalWrite (clk, HIGH);
296322 }
297323 digitalWrite (dao, LOW);
298324 }
299- digitalWrite (_selectPin, HIGH);
325+ if (_useSelect) digitalWrite (_selectPin, HIGH);
300326}
301327
302328
0 commit comments