#include <avr/io.h>
void pwm_init() {
// Setăm pinul OC1A (de ex. pinul digital 9 pe Arduino UNO) ca output
DDRB |= (1 << PB1);
// Setăm Timer1 în mod Fast PWM, cu TOP în ICR1
TCCR1A = (1 << COM1A1) | (1 << WGM11); // Clear OC1A on compare match
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); // No prescaler
// Frecvență PWM = f_clk / (TOP + 1)
// Pentru f_clk = 16 MHz și perioadă de 250 µs => f = 4 kHz
// => TOP = (16,000,000 * 0.00025) - 1 = 3999
ICR1 = 3999;
// Duty cycle de 25% => OCR1A = 25% din 3999 = 1000
OCR1A = 1000;
}
int main(void) {
pwm_init();
while (1) {
// PWM este generat automat de hardware, nu e nevoie de cod suplimentar
}
}
I2luY2x1ZGUgJmx0O2F2ci9pby5oJmd0OwoKdm9pZCBwd21faW5pdCgpIHsKICAgIC8vIFNldMSDbSBwaW51bCBPQzFBIChkZSBleC4gcGludWwgZGlnaXRhbCA5IHBlIEFyZHVpbm8gVU5PKSBjYSBvdXRwdXQKICAgIEREUkIgfD0gKDEgJmx0OyZsdDsgUEIxKTsKCiAgICAvLyBTZXTEg20gVGltZXIxICZpY2lyYztuIG1vZCBGYXN0IFBXTSwgY3UgVE9QICZpY2lyYztuIElDUjEKICAgIFRDQ1IxQSA9ICgxICZsdDsmbHQ7IENPTTFBMSkgfCAoMSAmbHQ7Jmx0OyBXR00xMSk7ICAvLyBDbGVhciBPQzFBIG9uIGNvbXBhcmUgbWF0Y2gKICAgIFRDQ1IxQiA9ICgxICZsdDsmbHQ7IFdHTTEzKSB8ICgxICZsdDsmbHQ7IFdHTTEyKSB8ICgxICZsdDsmbHQ7IENTMTApOyAgLy8gTm8gcHJlc2NhbGVyCgogICAgLy8gRnJlY3ZlbsibxIMgUFdNID0gZl9jbGsgLyAoVE9QICsgMSkKICAgIC8vIFBlbnRydSBmX2NsayA9IDE2IE1IeiDImWkgcGVyaW9hZMSDIGRlIDI1MCAmbWljcm87cyA9Jmd0OyBmID0gNCBrSHoKICAgIC8vID0mZ3Q7IFRPUCA9ICgxNiwwMDAsMDAwICogMC4wMDAyNSkgLSAxID0gMzk5OQogICAgSUNSMSA9IDM5OTk7CgogICAgLy8gRHV0eSBjeWNsZSBkZSAyNSUgPSZndDsgT0NSMUEgPSAyNSUgZGluIDM5OTkgPSAxMDAwCiAgICBPQ1IxQSA9IDEwMDA7Cn0KCmludCBtYWluKHZvaWQpIHsKICAgIHB3bV9pbml0KCk7CiAgICB3aGlsZSAoMSkgewogICAgICAgIC8vIFBXTSBlc3RlIGdlbmVyYXQgYXV0b21hdCBkZSBoYXJkd2FyZSwgbnUgZSBuZXZvaWUgZGUgY29kIHN1cGxpbWVudGFyCiAgICB9Cn0K