Change amplitude scaling. Go back to refclk for ICR1. Added phase changes.
This commit is contained in:
parent
0e9a549f56
commit
2152100873
21
DDS.cpp
21
DDS.cpp
|
@ -42,8 +42,8 @@ void DDS::start() {
|
||||||
// clock as the DDS.
|
// clock as the DDS.
|
||||||
TCCR1B = _BV(CS11) | _BV(WGM13) | _BV(WGM12);
|
TCCR1B = _BV(CS11) | _BV(WGM13) | _BV(WGM12);
|
||||||
TCCR1A = 0;
|
TCCR1A = 0;
|
||||||
//ICR1 = ((F_CPU / 8) / refclk) - 1;
|
ICR1 = ((F_CPU / 8) / refclk) - 1;
|
||||||
ICR1 = ((F_CPU / 8) / 9600) - 1;
|
//ICR1 = ((F_CPU / 8) / 9600) - 1;
|
||||||
|
|
||||||
// Configure the ADC here to automatically run and be triggered off Timer1
|
// Configure the ADC here to automatically run and be triggered off Timer1
|
||||||
ADMUX = _BV(REFS0) | _BV(ADLAR) | 0; // Channel 0, shift result left (ADCH used)
|
ADMUX = _BV(REFS0) | _BV(ADLAR) | 0; // Channel 0, shift result left (ADCH used)
|
||||||
|
@ -77,8 +77,21 @@ void DDS::setFrequency(unsigned short freq) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Degrees should be between -360 and +360 (others don't make much sense)
|
||||||
|
void DDS::setPhaseDeg(int16_t degrees) {
|
||||||
|
accumulator = degrees * (pow(2,ACCUMULATOR_BITS)/360.0);
|
||||||
|
}
|
||||||
|
void DDS::changePhaseDeg(int16_t degrees) {
|
||||||
|
accumulator += degrees * (pow(2,ACCUMULATOR_BITS)/360.0);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Clean this up a bit..
|
// TODO: Clean this up a bit..
|
||||||
void DDS::clockTick() {
|
void DDS::clockTick() {
|
||||||
|
/* if(running) {
|
||||||
|
accumulator += stepRate;
|
||||||
|
OCR2A = getDutyCycle();
|
||||||
|
}
|
||||||
|
return;*/
|
||||||
if(running) {
|
if(running) {
|
||||||
accumulator += stepRate;
|
accumulator += stepRate;
|
||||||
if(timeLimited && tickDuration == 0) {
|
if(timeLimited && tickDuration == 0) {
|
||||||
|
@ -129,5 +142,7 @@ uint8_t DDS::getDutyCycle() {
|
||||||
phAng = (accumulator >> ACCUMULATOR_BIT_SHIFT);
|
phAng = (accumulator >> ACCUMULATOR_BIT_SHIFT);
|
||||||
uint8_t position = pgm_read_byte_near(ddsSineTable + phAng)>>(8-COMPARATOR_BITS);
|
uint8_t position = pgm_read_byte_near(ddsSineTable + phAng)>>(8-COMPARATOR_BITS);
|
||||||
// Apply scaling and return
|
// Apply scaling and return
|
||||||
return position >> amplitude;
|
uint16_t scaled = position;
|
||||||
|
scaled *= amplitude;
|
||||||
|
return scaled>>8;
|
||||||
}
|
}
|
||||||
|
|
12
DDS.h
12
DDS.h
|
@ -42,7 +42,7 @@
|
||||||
// This is how often we'll perform a phase advance, as well as ADC sampling
|
// This is how often we'll perform a phase advance, as well as ADC sampling
|
||||||
// rate. The higher this value, the smoother the output wave will be, at the
|
// rate. The higher this value, the smoother the output wave will be, at the
|
||||||
// expense of CPU time. It maxes out around 62000 (TBD)
|
// expense of CPU time. It maxes out around 62000 (TBD)
|
||||||
#define DDS_REFCLK_DEFAULT 9600
|
#define DDS_REFCLK_DEFAULT 38400
|
||||||
// As each Arduino crystal is a little different, this can be fine tuned to
|
// As each Arduino crystal is a little different, this can be fine tuned to
|
||||||
// provide more accurate frequencies. Adjustments in the range of hundreds
|
// provide more accurate frequencies. Adjustments in the range of hundreds
|
||||||
// is a good start.
|
// is a good start.
|
||||||
|
@ -193,10 +193,16 @@ public:
|
||||||
// frequency supported will fit in a short.
|
// frequency supported will fit in a short.
|
||||||
void setFrequency(unsigned short freq);
|
void setFrequency(unsigned short freq);
|
||||||
|
|
||||||
|
// Handle phase shifts
|
||||||
|
void setPhaseDeg(int16_t degrees);
|
||||||
|
void changePhaseDeg(int16_t degrees);
|
||||||
|
|
||||||
// Adjustable reference clock. This shoud be done before the timers are
|
// Adjustable reference clock. This shoud be done before the timers are
|
||||||
// started, or they will need to be restarted. Frequencies will need to
|
// started, or they will need to be restarted. Frequencies will need to
|
||||||
// be set again to use the new clock.
|
// be set again to use the new clock.
|
||||||
void setReferenceClock(unsigned long ref);
|
void setReferenceClock(unsigned long ref) {
|
||||||
|
refclk = ref;
|
||||||
|
}
|
||||||
unsigned long getReferenceClock() {
|
unsigned long getReferenceClock() {
|
||||||
return refclk;
|
return refclk;
|
||||||
}
|
}
|
||||||
|
@ -206,7 +212,7 @@ public:
|
||||||
// Set a scaling factor. To keep things quick, this is a power of 2 value.
|
// Set a scaling factor. To keep things quick, this is a power of 2 value.
|
||||||
// Set it with 0 for lowest (which will be off), 8 is highest.
|
// Set it with 0 for lowest (which will be off), 8 is highest.
|
||||||
void setAmplitude(unsigned char amp) {
|
void setAmplitude(unsigned char amp) {
|
||||||
amplitude = 8 - amp;
|
amplitude = amp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the function called by the ADC_vect ISR to produce the tones
|
// This is the function called by the ADC_vect ISR to produce the tones
|
||||||
|
|
Loading…
Reference in New Issue