40 kHz PWM med timer0 på atmega16?
40 kHz PWM med timer0 på atmega16?
Jag har hört att det går om man kör MCU:n på 8 kHz men jag kan inte få till det, någon här som vet hur man gör?
Re: 40 kHz PWM med timer0 på atmega16?
Jag antar att du menar att du kör i 8MHz (inte kHz).
Nu är inte mega16 direkt modern, så det går inte att köra 40 kHz hårdvaru PWM med timer0 eller timer2. Däremot går det med timer1.
Du skulle behöva ha en PWM-mode där du kan sätta TOP till t.ex 8e6/40000 - 1 = 199 för att få 40kHz PWM.
Nu är inte mega16 direkt modern, så det går inte att köra 40 kHz hårdvaru PWM med timer0 eller timer2. Däremot går det med timer1.
Du skulle behöva ha en PWM-mode där du kan sätta TOP till t.ex 8e6/40000 - 1 = 199 för att få 40kHz PWM.
Re: 40 kHz PWM med timer0 på atmega16?
Du kan få 8e6/256 = 31.25 kHz.
Om du använder intern RC-oscillator, skulle man, i princip*, kunna skruva upp frekvensen till 10.24 MHz genom att ratta i OSCCAL. I så fall går det att få 40kHz PWM med både timer0 och 2. Eller använda en extern klocka med den frekvensen.
*Men det är inte rekomenderat om man skriver till EEPROM eller FLASH.
Om du använder intern RC-oscillator, skulle man, i princip*, kunna skruva upp frekvensen till 10.24 MHz genom att ratta i OSCCAL. I så fall går det att få 40kHz PWM med både timer0 och 2. Eller använda en extern klocka med den frekvensen.
*Men det är inte rekomenderat om man skriver till EEPROM eller FLASH.
Re: 40 kHz PWM med timer0 på atmega16?
Det kanske är av någon form av allmänintresse men jag upptäckte att det går faktiskt om man kör i CTC mode, är det någon som känner till eventuella nackdelar med att inte köra i fast PWM mode?
Raderna nedan gör tricket.
DDRB |= (1<<PINB3); // output on PB3/OC0
TCCR0 |= (1<<WGM01); // CTC mode
TCCR0 |= (1<<COM00); // toggle on compare match
OCR0 = 99; // => 40 kHz, se "modes of operation"
TCCR0 |= (1<<CS00); // start timer0, no prescaler
Raderna nedan gör tricket.
DDRB |= (1<<PINB3); // output on PB3/OC0
TCCR0 |= (1<<WGM01); // CTC mode
TCCR0 |= (1<<COM00); // toggle on compare match
OCR0 = 99; // => 40 kHz, se "modes of operation"
TCCR0 |= (1<<CS00); // start timer0, no prescaler
Re: 40 kHz PWM med timer0 på atmega16?
Hade du frågat om man kan få ut en symmetrisk 40kHz fyrkansvåg med timer0 på en mega16 så hade jag svarat ja. Men du kan ju inte variera pulsbredden, så då kan man ju inte kalla det PWM. Så det är alltså det som skiljer mellan CTC- och PWM-mode.
Men det var ju bra att du fick till det du ville ha.
Men det var ju bra att du fick till det du ville ha.

Re: 40 kHz PWM med timer0 på atmega16?
Tja det är ju en 50 % PWM
men du har helt rätt, det var otydligt skrivet.
