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