1. Ich möchte ein PWM Signal erzeugen mit einer festen Frequenz (feste
Periodenlänge). Geht das auf diese Weise?
FastPWM: WGM 12=1 , WGM 10=1
PWM (Frequenz,Phase Correct): WGM 13=1 , WGM10=1
2. Die Frequenz soll so hoch wie nur möglich sein. (8 Bit Auflösung,
kein Prescaler)
Bekomme ich dann bei 16MHz @ 8Bit eine PWM Frequenz von (16000000/256=)
62.5KHz (bei FastPWM) und bei Phase/Frequenz Correct nur 31.25KHz?
3. Ist das so richtig, hab ich etwas vergessen?
Ich will folgendes:
-Wenn der Timer hoch zählt soll so lange der Wert kleiner als der Wert
in OCR1A/OCR1B ist soll high am Ausgang anliegen, wenn der Timer wert
größer ist soll der Ausgang auf Low fallen.
1 | void initPWM(void)
|
2 | {
|
3 | DDRB = 0xff; // Port B als Ausgang
|
4 |
|
5 | // beide Kanäle A und B haben die gleiche Frequenz/Taktung
|
6 | // COM1A , COM1B: Clear wenn down, Set wenn Up Counting
|
7 | // WGM11,WGM10 (TCCR1A):
|
8 | // WGM13,WGM12 (TCCR1B):´
|
9 |
|
10 | // Fast PWM 8-bit (WGM12,10 = Mode 5)
|
11 | TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<COM1B1) | (1<<COM1B0) | (1<<WGM10);
|
12 | TCCR1B = (1<<CS10) | (1<<WGM12); // kein Prescaling + PWM Mode 5
|
13 |
|
14 | // PWM (Frequenz,Phase Correct) (WGM13,10 = Mode 9)
|
15 | // TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<COM1B1) | (1<<COM1B0) | (1<<WGM10);
|
16 | // TCCR1B = (1<<CS10) | (1<<WGM13); // kein Prescaling + PWM Mode 9
|
17 |
|
18 | OCR1A = 0; // initialwert Pulslänge/Takte
|
19 | OCR1B = 0; // initialwert Pulslänge/Takte
|
20 | }
|