Не пойму системы задания частоты pwm.

Тема в разделе "Микроконтроллеры AVR", создана пользователем Gomez, 22 июн 2023.

  1. Gomez

    Gomez Гик

    Нашёл вот статью. (На аглицком)
    https://www.fdossena.com/?p=ArduinoFanControl/i.md

    Код (C++):
    //configure Timer 1 (pins 9,10) to output 25kHz PWM
    void setupTimer1(){
        //Set PWM frequency to about 25khz on pins 9,10 (timer 1 mode 10, no prescale, count to 320)
        TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
        TCCR1B = (1 << CS10) | (1 << WGM13);
        ICR1 = 320;
        OCR1A = 0;
        OCR1B = 0;
    }
    //configure Timer 2 (pin 3) to output 25kHz PWM. Pin 11 will be unavailable for output in this mode
    void setupTimer2(){
        //Set PWM frequency to about 25khz on pin 3 (timer 2 mode 5, prescale 8, count to 79)
        TIMSK2 = 0;
        TIFR2 = 0;
        TCCR2A = (1 << COM2B1) | (1 << WGM21) | (1 << WGM20);
        TCCR2B = (1 << WGM22) | (1 << CS21);
        OCR2A = 79;
        OCR2B = 0;
    }
    //equivalent of analogWrite on pin 9
    void setPWM1A(float f){
        f=f<0?0:f>1?1:f;
        OCR1A = (uint16_t)(320*f);
    }
    //equivalent of analogWrite on pin 10
    void setPWM1B(float f){
        f=f<0?0:f>1?1:f;
        OCR1B = (uint16_t)(320*f);
    }
    //equivalent of analogWrite on pin 3
    void setPWM2(float f){
        f=f<0?0:f>1?1:f;
        OCR2B = (uint8_t)(79*f);
    }
    void setup(){
        //enable outputs for Timer 1
        pinMode(9,OUTPUT); //1A
        pinMode(10,OUTPUT); //1B
        setupTimer1();
        //enable outputs for Timer 2
        pinMode(3,OUTPUT); //2
        setupTimer2();
        //note that pin 11 will be unavailable for output in this mode!
        //example...
        setPWM1A(0.5f); //set duty to 50% on pin 9
        setPWM1B(0.2f); //set duty to 20% on pin 10
        setPWM2(0.8f); //set duty to 80% on pin 3
    }
    void loop(){
        //do what you want...
    }
    1) Не пойму, почему так по-разному выставляется частота на разных пинах PWM.
    2) Таймеры не слетят? millis(), например. Хотя читал, что на этой частоте не слетают, а вот, например, на 62 khz - таки да.
    3) Человек всё по делу пишет? ;) Потому что то, что прямо в кодах / регистрах или как их там, я, конечно, нихьт ферштеен. :(

    А, ну хотя можно было вдумчиво прочесть абзац и многие вопросы отпали бы сами. Почему так, что влияет на таймеры и другое. Пардон.
     
    Последнее редактирование: 22 июн 2023