Skip to content

Commit 0b132b6

Browse files
committed
0.1.1 AD9833
1 parent 48a7d9e commit 0b132b6

File tree

10 files changed

+230
-70
lines changed

10 files changed

+230
-70
lines changed

libraries/AD9833/AD9833.cpp

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
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)
7478
void 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

9199
void 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

134161
uint8_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

276302
void 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

libraries/AD9833/AD9833.h

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
// FILE: AD9833.h
44
// AUTHOR: Rob Tillaart
55
// PURPOSE: Arduino library for AD9833 function generator.
6-
// VERSION: 0.1.0
6+
// VERSION: 0.1.1
77
// URL: https://github.com/RobTillaart/AD9833
88

99

1010
#include "Arduino.h"
1111
#include "SPI.h"
1212

1313

14-
#define AD9833_LIB_VERSION (F("0.1.0"))
14+
#define AD9833_LIB_VERSION (F("0.1.1"))
1515

1616

1717
#define AD9833_MAX_FREQ (12500000UL) // 12.5 MHz.
@@ -31,13 +31,18 @@ class AD9833
3131
public:
3232
AD9833();
3333

34-
// selectPin == fsyncPin
34+
// selectPin == fsyncPin
3535
void begin(uint8_t selectPin, uint8_t dataPin = 0, uint8_t clockPin = 0);
3636
void begin(uint8_t selectPin, SPIClass * spi);
3737

3838
void reset();
39+
void hardwareReset();
40+
// mode = 0..3 (datasheet)
41+
bool setPowerMode(uint8_t mode = 0);
3942

40-
void setWave(uint8_t wave = AD9833_OFF);
43+
44+
45+
void setWave(uint8_t waveform = AD9833_OFF);
4146
uint8_t getWave();
4247

4348

@@ -73,11 +78,15 @@ class AD9833
7378
void setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select);
7479
#endif
7580

76-
private:
7781

82+
// LOW LEVEL API - Expert users only
7883
void writeControlRegister(uint16_t value);
7984
void writeFreqRegister(uint8_t reg, uint32_t freq);
8085
void writePhaseRegister(uint8_t reg, uint16_t value);
86+
87+
88+
private:
89+
8190
void writeData(uint16_t data);
8291

8392
bool _hwSPI = true;
@@ -94,15 +103,15 @@ class AD9833
94103
uint8_t _dataPin = 0;
95104
uint8_t _clockPin = 0;
96105
uint8_t _selectPin = 0;
106+
bool _useSelect = false;
97107

98108

99109
// SIGNAL
100110
uint16_t _control = 0;
101-
uint8_t _waveType = AD9833_OFF;
102-
111+
uint8_t _waveform = AD9833_OFF;
103112

104-
float _freq[2] = { 1000, 1000 }; // Hz
105-
float _phase[2] = { 0, 0 }; // angle
113+
float _freq[2] = { 0, 0 }; // Hz
114+
float _phase[2] = { 0, 0 }; // angle 0..360
106115
};
107116

108117

libraries/AD9833/CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,22 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

88

9+
## [0.1.1] - 2023-08-25
10+
- fix #2 - external FSYNC control
11+
- add **setPowerMode(uint8_t mode = 0)** // mode = 0..3
12+
- add **void hardwareReset()**
13+
- redefined **reset()** - see readme.md
14+
- first tests with hardware.
15+
- improved performance **setFrequency()**
16+
- fixed software SPI
17+
- made low level register access public for "expert users"
18+
- **void writeControlRegister(uint16_t value)**
19+
- **void writeFreqRegister(uint8_t reg, uint32_t freq)**
20+
- **void writePhaseRegister(uint8_t reg, uint16_t value)**
21+
- update readme.md
22+
- minor edits
23+
24+
925
## [0.1.0] - 2023-08-25
1026
- initial version
1127

0 commit comments

Comments
 (0)