fork download
  1. #include <avr/io.h>
  2.  
  3. void pwm_init() {
  4. // Setăm pinul OC1A (de ex. pinul digital 9 pe Arduino UNO) ca output
  5. DDRB |= (1 << PB1);
  6.  
  7. // Setăm Timer1 în mod Fast PWM, cu TOP în ICR1
  8. TCCR1A = (1 << COM1A1) | (1 << WGM11); // Clear OC1A on compare match
  9. TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); // No prescaler
  10.  
  11. // Frecvență PWM = f_clk / (TOP + 1)
  12. // Pentru f_clk = 16 MHz și perioadă de 250 µs => f = 4 kHz
  13. // => TOP = (16,000,000 * 0.00025) - 1 = 3999
  14. ICR1 = 3999;
  15.  
  16. // Duty cycle de 25% => OCR1A = 25% din 3999 = 1000
  17. OCR1A = 1000;
  18. }
  19.  
  20. int main(void) {
  21. pwm_init();
  22. while (1) {
  23. // PWM este generat automat de hardware, nu e nevoie de cod suplimentar
  24. }
  25. }
  26.  
Success #stdin #stdout 0.02s 25928KB
stdin
Standard input is empty
stdout
#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
    }
}