This repository contains the NativeDDS library for Arduino. NativeDDS is a software implemented Direct Digital Synthesizer. NativeDDS generates sinusoidal waves for example for use in audio applications, motor drives, sine wave inverters or for a reference frequency source. The library is easy portable to other platforms.
The DDS frequency resolution is 32-bit. This means that the frequency can be tuned in steps of f_update/(2^32)
, with f_update = 1/timestep
(see below). The amplitude resolution can be eight bits or ten bits by choosing the class instances DDS_8bit_xx
or DDS_10bit_xx
. The eight bit implementation is faster and will be precise enough in most applications.
The following library instance methods are implemented:
DDS_8bit_1Ch or DDS_10bit_1Ch
DDS_8bit_2Ch or DDS_10bit_2Ch
DDS_8bit_IQ or DDS_10bit_IQ
DDS_8bit_3Ph or DDS_10bit_3Ph
The explanation below will be continued for the 8-bit case.
DDS_8bit_1Ch
is a single (output) channel DDS, DDS_8bit_2Ch
is a dual channel DDS, DDS_8bit_IQ
is a dual channel DDS generating orthogonal outputs and DDS_8bit_3Ph
is a three output channel DDS.
The following methods exists:
.begin()
.update()
Initialize the class instance with the member function begin()
. Also, begin()
must be called each time when the frequency or phase has to be updated.
DDS_8bit_1Ch, use: .begin(float frequency, float starting-phase, float timestep);
DDS_8bit_2Ch, use: .begin(float frequency1, float frequency2, starting-phase1, float starting-phase2, timestep);
DDS_8bit_IQ, use: .begin(float frequency, float starting-phase, float timestep);
DDS_8bit_3Ph, use: .begin(float frequency, float starting-phase, float timestep);
For the member function .begin()
, the variable frequency
is in Hz and starting-phase
in radians. timestep
is the loop repeating time in seconds at which .update()
is invoked.
The following public output variables are defined:
DDS_8bit_1Ch: out1
and uout1
for unsigned.
DDS_8bit_2Ch: out1
, out2
and uout1
, uout2
for unsigned.
DDS_8bit_IQ: outi
, outq
and uouti
, uoutq
for unsigned.
DDS_8bit_3Ph: outu
, outv
, outw
and uoutu
, uoutv
, uoutw
for unsigned.
- First create an instance of the library object, for example here we define mySin:
DDS_8bit_1Ch mySine;
- Initialize the DDS on some place in your setup function:
void setup() {
...
mySine.begin(float frequency, float starting-phase, float timestep);
...
}
- Call
mySine.update();
from the main loop or from an Interrupt Service Routine (ISR). Use.update(void)
on the basis of a regular time interval to generate a jitter free output signal.
Right after the previous step, the instantaneous (unsigned) output value is obtained with: int sample = mySine.uout1;
void loop() {
...
mySine.update();
sample=mySine.uout1
analogWrite(PWM_OUT, sample);
...
}
SineWave_8bit.ino
- Example of a single channel 8-bits DDS. The time base is generated in the main loop. The maximum usable output frequency is limited to about 100Hz.
SineWave_10bit.ino
- Example of a single channel 10-bits DDS. The time base is generated in the main loop. The maximum usable output frequency is limited to about 100Hz.
WobblingServo.ino
- A slowly sine-wave modulated servo motor application.
AudioGenerator.ino
- A generator for audible frequencies. A timer interrupt has been used to create the time base.
A lot of time was saved in developing this library by using the alternative Arduino-IDE Sloeber. Sloeber is a wonderful Arduino plugin for Eclipse. Thanks to Jantje and his contributors!