// Příklad PWM DAC využívající komplementárních PWM výstupů pro redukci zvlnění (případně snížení rychlosti přeběhu) #define F_CPU 16000000 #include #include #include void init_timer(void); void set_pwm(uint8_t value); // tabulka pro sinus (například 64 hodnot) const uint8_t table[]={ 0x80,0x8c,0x98,0xa5,0xb0,0xbc,0xc6,0xd0, 0xda,0xe2,0xea,0xf0,0xf5,0xfa,0xfd,0xfe, 0xff,0xfe,0xfd,0xfa,0xf5,0xf0,0xea,0xe2, 0xda,0xd0,0xc6,0xbc,0xb0,0xa5,0x98,0x8c, 0x80,0x73,0x67,0x5a,0x4f,0x43,0x39,0x2f, 0x25,0x1d,0x15,0xf,0xa,0x5,0x2,0x1, 0x0,0x1,0x2,0x5,0xa,0xf,0x15,0x1d, 0x25,0x2f,0x39,0x43,0x4f,0x5a,0x67,0x73 }; uint8_t i=0; // index na procházení tabulkou int main(void){ init_timer(); // rozběhnout timer while(1){ // každých ~31us zapsat novou hodnotu stídy (64 úrovní * 31us => perioda sinu 2ms => f~500Hz) _delay_us(31); // tupé čekání na další hodnotu "DAC", v praxi jsou lepší způsoby, ale o ty teď nejde i++; if(i>=sizeof(table)){i=0;} set_pwm(table[i]); // nastavit novou hodnotu střídy } } // nastavení PWM s ošetřením glitchů void set_pwm(uint8_t value){ TIFR0 |= (1<