Hallo ihr!
Möchte mit dem Timer1 (µP --> ATmega8) eine PWM generieren, die mir
einen Motor ansteuert. Leider ist Timer1 anderer
Meinung und zeigt sich nicht kooperativ mir gegenüber ;-) .
Mit dem Setzen der beiden COM1B0/1 Bits müsste doch sichergestellt sein,
dass OC2B beim Comparematch von OCR1B (TCNT = 0x45)
auf high geht. Da ich vorher OCR1A als TOP definiert habe (TCCR1B,
TCCR1A), müsste dann beim Erreichen von TCNT = 0x97 doch
ein low am Ausgang erscheinen, oder?
Kann mir jemand sagen, wo ich da einen Denkfehler habe?
Ursprünglich wollte ich für die PWM Timer2 verwenden, doch dann hat sich
herausgestellt, dass sich der TOP-Wert vom Timer2
nicht ändern lässt (oder doch??). Den TOP-Wert möchte ich deswegen
ändern, weil meine PWM eine Frequenz von ca. 20kHz haben
soll und mein µP eine interne Oszillator-f von 1MHz hat. 1MHz/255=3.9kHz
--> Lösung: Auflösung auf 5Bit herunterdrehen.
Schaff ich das auch irgendwie mit dem Timer2?
Danke für eure Hilfe,
LG Birgit
1 |
|
2 | #include <inttypes.h>
|
3 | #include <avr/io.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <avr/signal.h>
|
6 | #include <util/delay.h>
|
7 |
|
8 |
|
9 |
|
10 | void init_Timer1()
|
11 | {
|
12 | TCCR1A|= (1<<COM1B0) | (1<<COM1B1) | (1<<WGM10) | (1<<WGM11); //COM1B0:1 ... set OC1B on Compare Match, clear at TOP
|
13 | TCCR1B |= (1<<WGM12) | (1<<WGM13) | (1<<CS10); //Prescaler:1, Fast PWM (top = OC1A)
|
14 | TCNT2=0;
|
15 | OCR1A=0x97;
|
16 | OCR1B=0x45;
|
17 |
|
18 | sei();
|
19 | }
|
20 |
|
21 |
|
22 |
|
23 | int main(void)
|
24 | {
|
25 | PORTB &= ~(1<<PB2);
|
26 | DDRB |= (1<<PB2);
|
27 |
|
28 | init_Timer1();
|
29 |
|
30 | for(;;);
|
31 |
|
32 | }
|