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.
328 pwm frekvence
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.
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.
Re: 328 pwm frekvence
To prostě nejde. Pokud chceš používat analogWrite, nemáš jiné možnosti volby frekvence.
Re: 328 pwm frekvence
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
}
#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
Bez knihovny to jde třeba takhle:
Pro požadovanou frekvenci se musí spočítat hodnota registru 'ICR1'.
(Není to úplně můj vynález, kus jsem opsal někde z internetu.)
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;
}
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 19 hostů