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