328 pwm frekvence

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
epzlin
Příspěvky: 37
Registrován: 17 črc 2019, 19:22
Reputation: 0

328 pwm frekvence

Příspěvek od epzlin » 15 led 2021, 17:14

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.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: 328 pwm frekvence

Příspěvek od ondraN » 15 led 2021, 18:22

To prostě nejde. Pokud chceš používat analogWrite, nemáš jiné možnosti volby frekvence.

epzlin
Příspěvky: 37
Registrován: 17 črc 2019, 19:22
Reputation: 0

Re: 328 pwm frekvence

Příspěvek od epzlin » 16 led 2021, 08:15

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
}

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: 328 pwm frekvence

Příspěvek od AstroMiK » 16 led 2021, 12:40

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.)

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 19 hostů