Hello,
I am working on a sin wav generator using a timer interrupt with a frequency of 100,000 Hz. Using a sine table of 256 values, I've calculated the number of interrupts that should occur before progressing to the next value in the table (samplesPerTic). Rather than causing sinusoidal oscillation, the code causes an LED be maintained at a constant voltage. I am new to timer manipulations, so any help would be greatly appreciated!
int sinTable[] = {127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124};
const int outPin = 3;
const long samplerate = 100000;
long t = 0;
int freq = 4;
long samplesPerPeriod = samplerate/freq;
int samplesPerTic = samplesPerPeriod/256;
int sinPos = 0;
void setup(){
cli();//disable interrupts
//timer 1 (sample rate of 100000:
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
//set compare match register- 100khz to start
OCR1A = 159; // = (16 000 000 / 100 000) - 1 = 159
//turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS10 bit for 0 prescaler
TCCR1B |= (1 << CS10);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei();//enable interrupts
}
//timer 1 interrupt increments t and resets each time it reaches period
ISR(TIMER1_COMPA_vect){
t++;
if (t >= samplesPerPeriod){
t = 0;
}
if (t >= samplesPerTic){
if (sinPos == 255){
sinPos = 0;
}
else{
sinPos++;
}
analogWrite(outPin, sinTable[sinPos]);
}
}
void loop(){
}
new_signal_generator_v2.ino (1.85 KB)