Stránka 1 z 1

328 pwm frekvence

Napsal: 15 led 2021, 17:14
od epzlin
Je mozne zmenit pwm frekvenci vystupu na jine hodnoty, nez 30hz/122hz/245hz/490hz/980hz/3920hz/31372hz ?

Pokud bych chtel treba 8200hz? A pritom stale pouzivat analogWrite.

Re: 328 pwm frekvence

Napsal: 15 led 2021, 18:22
od ondraN
To prostě nejde. Pokud chceš používat analogWrite, nemáš jiné možnosti volby frekvence.

Re: 328 pwm frekvence

Napsal: 16 led 2021, 08:15
od epzlin
Tak odpovím si sám. Přes analogWrite to skutečně nepůjde, ale po delším hledání jsem objevil knihovnu TimerOne. Díky ní to půjde podobně jednoduše jako s analogWrite. Navíc se získá 10bit rozlišení pwm.

#include <TimerOne.h> //timer1 328p piny 9+10
const byte fanPin = 9;

void setup(){
Timer1.initialize(122); //8200hz
//Timer1.initialize(50); //20khz- 50us delka periody
//Timer1.initialize(66); //15khz- 66us delka periody
//Timer1.initialize(100); //10khz-100us delka periody
//Timer1.initialize(200); // 5khz-200us delka periody
}

void loop(){
Timer1.pwm(fanPin, 512);//0-1023 pwm
}

Re: 328 pwm frekvence

Napsal: 16 led 2021, 12:40
od AstroMiK
Bez knihovny to jde třeba takhle:
Pro požadovanou frekvenci se musí spočítat hodnota registru 'ICR1'.

Kód: Vybrat vše

//----------------------------------------
// zakladni nastaveni casovace pro 16-bitove PWM vystupy
void setupPWM16()
  {
    DDRB  |= _BV(PB1) | _BV(PB2);       //PB1 = D9 ; PB2 = D10 ... na vystup
    TCCR1A = _BV(COM1A1) | _BV(COM1B1)  // non-inverting PWM 
          | _BV(WGM11);                 // mode 14: fast PWM, TOP=ICR1 
    TCCR1B = _BV(WGM13) | _BV(WGM12)    // mode 14
          | _BV(CS10);                  // prescaler 1
    ICR1 = 0xFFFF;                      //  do jakeho cisla ma citac pocitat (meni rozliseni a frekvenci)
                                        //           0xFFFF = 0b1111111111111111 = 16-bitove rozliseni; frekvence  244 Hz
                                        //           0x3FFF = 0b0011111111111111 = 14-bitove rozliseni; frekvence  977 Hz
                                        //           0x0FFF = 0b0000111111111111 = 12-bitove rozliseni; frekvence 3910 Hz
  }


//----------------------------------------
// nastaveni PWM sirky impulzu pro pin D9
void analogWrite16_1(uint16_t val)
  {
    OCR1A = val;
  }



//----------------------------------------
// nastaveni PWM sirky impulzu pro pin D10
void analogWrite16_2(uint16_t val)
  {
    OCR1B = val;
  }


(Není to úplně můj vynález, kus jsem opsal někde z internetu.)