Hallo,
ich möchte gerne mit Hilfe des Timer 1 vom ATmega32 mit 16MHz ein
PWM-Signal mit einer Frequenz von 800kHz ausgeben, mit variablem
Dutycycle.
Meine Idee war, die TCCR1A,B-Register folgendermaßen einzustellen:
- kein Prescaler -> 20 Takte entsprechen 1,25us und somit genau meiner
gewünschten Frequenz
- Mode of Operation: CTC, mit TOP = ICR1, wobei ICR1 = 19 (Also: Springe
bei 19 wieder auf 0. Details im ATmega32-Datenblatt auf Seite 109)
- und dann wollte ich Werte zwischen ~1 und ~18 ins OCR1A schreiben, um
verschiedene Dutycycles zu erreichen (über CompareMatch), die mir über
den Pin PD5 (OC1A) ausgegeben werden.
Hier der Code innerhalb meiner Funktion:
1 | OCR1A = u16Pwm; // = vergleichsregister vom Timer1 bekommt Variable
|
2 |
|
3 | ICR1 = 0x0013; // = 19, ICR1 beinhaltet den TOP-Wert, bei auf 0 gesetzt wird.
|
4 |
|
5 | TCCR1A = _BV(COM1A1); // High->Low an OC1A bei CompareMatch
|
6 | TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10) ; // siehe DB S.109
|
Ergebnis: Der Timer zählt periodisch bis zu meinem gewünschten im ICR1
angegebenen Wert, allerdings bekomme ich am OC1A keinerlei PWM-Output.
Meine Vermutung: Da ich ja im CTC-Modus arbeite, ist so eine PWM evtl.
gar nicht möglich? Aber wie gehts dann?
Ich freue mich auf alle Tipps. Bin schon seit Stunden am rätseln.. :(