Allow for high idle duty cycle when output is 'off', amplitude adjustments.
This commit is contained in:
		
							parent
							
								
									1117542411
								
							
						
					
					
						commit
						31eb465ebf
					
				
							
								
								
									
										14
									
								
								DDS.cpp
								
								
								
								
							
							
						
						
									
										14
									
								
								DDS.cpp
								
								
								
								
							| 
						 | 
				
			
			@ -61,22 +61,30 @@ void DDS::clockTick() {
 | 
			
		|||
  accumulator += stepRate;
 | 
			
		||||
  if(running) {
 | 
			
		||||
    if(tickDuration == 0) {
 | 
			
		||||
#ifdef DDS_IDLE_HIGH
 | 
			
		||||
      // Set the duty cycle to 50%
 | 
			
		||||
      OCR2B = pow(2,COMPARATOR_BITS)/2;
 | 
			
		||||
#else
 | 
			
		||||
      // Set duty cycle to 0, effectively off
 | 
			
		||||
      OCR2B = 0;
 | 
			
		||||
#endif
 | 
			
		||||
      running = false;
 | 
			
		||||
    } else {
 | 
			
		||||
      OCR2B = getPhaseAngle();
 | 
			
		||||
      OCR2B = getDutyCycle();
 | 
			
		||||
    }
 | 
			
		||||
    // Reduce our playback duration by one tick
 | 
			
		||||
    tickDuration--;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t DDS::getPhaseAngle() {
 | 
			
		||||
uint8_t DDS::getDutyCycle() {
 | 
			
		||||
#if ACCUMULATOR_BIT_SHIFT >= 24
 | 
			
		||||
  uint16_t phAng;
 | 
			
		||||
#else
 | 
			
		||||
  uint8_t phAng;
 | 
			
		||||
#endif
 | 
			
		||||
  phAng = (accumulator >> ACCUMULATOR_BIT_SHIFT);
 | 
			
		||||
  return 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
 | 
			
		||||
  return position >> amplitude;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										30
									
								
								DDS.h
								
								
								
								
							
							
						
						
									
										30
									
								
								DDS.h
								
								
								
								
							| 
						 | 
				
			
			@ -11,6 +11,10 @@
 | 
			
		|||
#define ACCUMULATOR_BITS      32
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// If defined, the timer will idle at 50% duty cycle
 | 
			
		||||
// This leaves it floating in the centre of the PWM/DAC voltage range
 | 
			
		||||
#define DDS_IDLE_HIGH
 | 
			
		||||
 | 
			
		||||
#define COMPARATOR_BITS       6
 | 
			
		||||
 | 
			
		||||
#define DDS_REFCLK_DEAULT     38400
 | 
			
		||||
| 
						 | 
				
			
			@ -123,7 +127,7 @@ public:
 | 
			
		|||
  void on(unsigned short duration) {
 | 
			
		||||
    // Duration in ticks from milliseconds is:
 | 
			
		||||
    // t = (1/refclk)
 | 
			
		||||
    tickDuration = duration / (1000.0/refclk);
 | 
			
		||||
    tickDuration = (duration * refclk) / 1000;
 | 
			
		||||
    running = true;
 | 
			
		||||
  }
 | 
			
		||||
  void off() {
 | 
			
		||||
| 
						 | 
				
			
			@ -137,8 +141,7 @@ public:
 | 
			
		|||
  }
 | 
			
		||||
  // Blocking version
 | 
			
		||||
  void playWait(unsigned short freq, unsigned short duration) {
 | 
			
		||||
    setFrequency(freq);
 | 
			
		||||
    on(duration);
 | 
			
		||||
    play(freq, duration);
 | 
			
		||||
    delay(duration * 1000);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
| 
						 | 
				
			
			@ -149,20 +152,27 @@ public:
 | 
			
		|||
  // Adjustable reference clock
 | 
			
		||||
  void setReferenceClock(unsigned long ref);
 | 
			
		||||
 | 
			
		||||
  uint8_t getPhaseAngle();
 | 
			
		||||
  uint8_t getDutyCycle();
 | 
			
		||||
 | 
			
		||||
  // 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;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  void clockTick();
 | 
			
		||||
  
 | 
			
		||||
private:
 | 
			
		||||
  bool running;
 | 
			
		||||
  unsigned long tickDuration;
 | 
			
		||||
  volatile bool running;
 | 
			
		||||
  volatile unsigned long tickDuration;
 | 
			
		||||
  volatile unsigned char amplitude;
 | 
			
		||||
#ifdef SHORT_ACCUMULATOR
 | 
			
		||||
  unsigned short accumulator;
 | 
			
		||||
  unsigned short stepRate;
 | 
			
		||||
  volatile unsigned short accumulator;
 | 
			
		||||
  volatile unsigned short stepRate;
 | 
			
		||||
  unsigned short refclk;
 | 
			
		||||
#else
 | 
			
		||||
  unsigned long accumulator;
 | 
			
		||||
  unsigned long stepRate;
 | 
			
		||||
  volatile unsigned long accumulator;
 | 
			
		||||
  volatile unsigned long stepRate;
 | 
			
		||||
  unsigned long refclk;
 | 
			
		||||
#endif
 | 
			
		||||
  static DDS *sDDS;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue