Örnekte timer0 fast pwm kullanılmış ve datasheete göre frekans hesabı
ve değiştirebileceğin iki seçenek var ya devrenin kristalini değiştireceksin yada prescalar faktörünü değiştireceksin. Örnekte 16Mhz kristal kullnılmış ve TCCR0B |=0x05 yapılmış yani
Ekli dosyayı görüntüle 82742
registerinin prescalar bitlerinden CS02 ve CS00 biti set edilmiş bu aşağıdaki tabloya göre
Ekli dosyayı görüntüle 82743
1024 presclar değeri girilmiş yani en üst değer. Formülden gidersek
Eğer prescalar değerini değerini 1 yaparsak yani CS00 bitini 1 yaparsak
formüle göre
olacaktır yani en yüksek 62.5Khz değere çıkabilirsin.
Aşağıdaki kod 62500Hz lik bir pwm üretecektir (pin5).
C++:
void pwm_ayarla(uint8_t);
void setup(){
// WGM02/WGM01/WGM00 all set -> Mode 7, fast PWM
TCCR0A = (1<<COM0B1) + (1<<WGM01) + (1<<WGM00); // Set OC2B at bottom, clear OC2B at compare match
TCCR0B = (1<<CS00) + (1<<WGM02); // prescaler = 1;
OCR0A = 255;
OCR0B = 0;
DDRD |= (1<<PD5);
}
void loop() {
uint8_t duty_degeri = map(analogRead(A0),0,1024,0,255);
pwm_ayarla(duty_degeri);
}
void pwm_ayarla(uint8_t duty){
OCR0B = duty;
}
mosfetin birisini bu çıkışa diğerini ise aşağıdaki kodla timer2 ile üreteceğin çıkışa bağlayabilirsin (pin3).
C++:
void pwm_ayarla(uint8_t);
void setup(){
TCCR2A = (1<<COM2B1) + (1<<WGM21) + (1<<WGM20); // Set OC2B at bottom, clear OC2B at compare match
TCCR2B = (1<<CS20) + (1<<WGM22); // prescaler = 1;
OCR2A = 255;
OCR2B = 0;
DDRD |= (1<<PD3);
}
void loop() {
uint8_t duty_degeri = map(analogRead(A0),0,1024,0,255);
pwm_ayarla(duty_degeri);
}
void pwm_ayarla(uint8_t duty){
OCR2B = duty;
}
yani toparlarsak
C++:
void pwm_ayarla(uint8_t,uint8_t);
void setup(){
// WGM02/WGM01/WGM00 all set -> Mode 7, fast PWM
TCCR0A = (1<<COM0B1) + (1<<WGM01) + (1<<WGM00); // Set OC2B at bottom, clear OC2B at compare match
TCCR0B = (1<<CS00) + (1<<WGM02); // prescaler = 1;
OCR0A = 255;
OCR0B = 0;
TCCR2A = (1<<COM2B1) + (1<<WGM21) + (1<<WGM20); // Set OC2B at bottom, clear OC2B at compare match
TCCR2B = (1<<CS20) + (1<<WGM22); // prescaler = 1;
OCR2A = 255;
OCR2B = 0;
DDRD |= (1<<PD3);
DDRD |= (1<<PD5);
}
void loop() {
uint8_t duty_degeri = map(analogRead(A0),0,1024,0,255);
pwm_ayarla(duty_degeri,255-duty_degeri);
}
void pwm_ayarla(uint8_t duty0,uint8_t duty2){
OCR0B = duty0;
OCR2B = duty2;
}
Test etmedim ama teorik olarak çalışması gerekiyor. A0 daki potun değerine göre bir çıkış artarken diğeri azalacaktır. Kaynağı aşağıya bırakıyorum tüm modları inceleyip kendin istediğini yapabilirsin
https://wolles-elektronikkiste.de/en/timer-and-pwm-part-1-8-bit-timer0-2