|
sin_wave из сообщения по ссылке. Режим таймера "phase& freq corect", так гармоник меньше. Вроде должно работать.
#include < ioavr.h >
#include < inavr.h >extern __flash unsigned char sin_wave[256];
#define PWM_TICKS 256
#define PWM OCR1Bvoid main (void) {
__enable_interrupt();
for(;;);
}
uint8_t Phase;#pragma vector = TIMER1_OVF_vect
__root __interrupt void PWM_Handler (void) {
// sinus generator
PWM = SinTable[ ++Phase ];
}
char __low_level_init() {PORTB = (0 << 7)|(0 << 6)|(1 << 5)|(0 << 4)|(0 << 3)|(0 << 2)|(0 << 1)|(0 << 0);
DDRB = (0 << 7)|(0 << 6)|(1 << 5)|(1 << 4)|(1 << 3)|(1 << 2)|(1 << 1)|(1 << 0);
// use Capture B as PWM generator
TCCR1A = (0 << COM1A1)|(0 << COM1A0)|(1 << COM1B1)|(1 << COM1B0)|(0 << WGM11)|(0 << WGM10);
TCCR1B = (0 << ICNC1)|(0 << ICES1)|(1 << WGM13)|(0 << WGM12)|(0 << CS12)|(0 << CS11)|(1 << CS10);
ICR1 = PWM_TICKS * 2; // Set PWM frequency
PWM = PWM_TICKS; // generate 0.5 Vcc level// Enable Timer0 ints, system timer
TIMSK = (0 << OCIE2)|(0 << TOIE2)|(0 << TICIE1)|(0 << OCIE1A)|(0 << OCIE1B)|(1 << TOIE1)|(0 << TOIE0);
return 1;
}