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.
|
||||
TCCR1B = _BV(CS11) | _BV(WGM13) | _BV(WGM12);
|
||||
TCCR1A = 0;
|
||||
//ICR1 = ((F_CPU / 8) / refclk) - 1;
|
||||
ICR1 = ((F_CPU / 8) / 9600) - 1;
|
||||
ICR1 = ((F_CPU / 8) / refclk) - 1;
|
||||
//ICR1 = ((F_CPU / 8) / 9600) - 1;
|
||||
|
||||
// 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)
|
||||
|
@ -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..
|
||||
void DDS::clockTick() {
|
||||
/* if(running) {
|
||||
accumulator += stepRate;
|
||||
OCR2A = getDutyCycle();
|
||||
}
|
||||
return;*/
|
||||
if(running) {
|
||||
accumulator += stepRate;
|
||||
if(timeLimited && tickDuration == 0) {
|
||||
|
@ -129,5 +142,7 @@ uint8_t DDS::getDutyCycle() {
|
|||
phAng = (accumulator >> ACCUMULATOR_BIT_SHIFT);
|
||||
uint8_t position = pgm_read_byte_near(ddsSineTable + phAng)>>(8-COMPARATOR_BITS);
|
||||
// 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
|
||||
// rate. The higher this value, the smoother the output wave will be, at the
|
||||
// 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
|
||||
// provide more accurate frequencies. Adjustments in the range of hundreds
|
||||
// is a good start.
|
||||
|
@ -193,10 +193,16 @@ public:
|
|||
// frequency supported will fit in a short.
|
||||
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
|
||||
// started, or they will need to be restarted. Frequencies will need to
|
||||
// be set again to use the new clock.
|
||||
void setReferenceClock(unsigned long ref);
|
||||
void setReferenceClock(unsigned long ref) {
|
||||
refclk = ref;
|
||||
}
|
||||
unsigned long getReferenceClock() {
|
||||
return refclk;
|
||||
}
|
||||
|
@ -206,7 +212,7 @@ public:
|
|||
// 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.
|
||||
void setAmplitude(unsigned char amp) {
|
||||
amplitude = 8 - amp;
|
||||
amplitude = amp;
|
||||
}
|
||||
|
||||
// This is the function called by the ADC_vect ISR to produce the tones
|
||||
|
|
Loading…
Reference in New Issue