Hallo,
habe einen AVR Mega und möchte dort ein PWM Signal mit dem 16-Bit Timer
erzeugen. Wenn ich das Datenblatt richtig verstehe, kann ich mit Modus
15 mit dem Register OCR1A den oberen Grenzwert (=Periodendauer)
festlegen, mit ICR1 den Vergleichswert bei dem der Ausgangspin getoggeld
wird. Damit am Pin OC1A ein Signal erscheint, muss der Pin auf Ausgang
geschaltet sein.
Interrupts o.ä. benötige ich nicht, d.h. das PWM Signal soll immer
widerholt werden, wo der Counter aktuell ist, ist meiner Anwendung egal.
Mein Code zur Initialisierung:
1 | // Port B, Pin 1 als Ausgang
|
2 | DDRB |= (1 << PB1);
|
3 | // PWM Mode 15 = Fast PWM, nicht invertierter Ausgang auf Pin PB1=OC1A, Prescaler 64
|
4 | TCCR1A |= (1 << COM1A1) | (1 << WGM11) | (1 << WGM10);
|
5 | TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10);
|
6 | // Testsignal
|
7 | OCR1A = 0xAAAA; // Periodendauer
|
8 | ICR1 = 0x2222; // Toggelwert
|
Leider kann ich am Pin PB1 jedoch kein toggeln erkennen. Woran liegt
das?
Habe außerdem Probleme die korrekten Werte des Prescalers und der
Periodendauer auszurechnen. Mein Quarz hat 14MHz, gewünscht sind 15msec
Periodendauer, wovon 3msec high sein sollen. Wie geht man da am besten
vor? Im Datenblatt steht zwar die Formel, aber ich kenne ja nur meine
gewünschte Frequenz/Periodendauer, aber weder den TOP Wert, noch den
Prescaler.
Gruß,
Jan