Forum: Mikrocontroller und Digitale Elektronik ATmega - nur ein PWM möglich


von Hans W. (hans_wurst)


Lesenswert?

Hallo,

ich möchte zwei PWM-Signale mit dem ATmega3290p erzeugen. (Sollen zwei 
Motoren steuern) Dazu verwende ich den "Phase and Frequency Correct PWM 
Mode" und den Counter1.

Wenn ich nur ein Signal Erzeuge (OCR1A), funktionier mein Programm mit 
dieser Einstellung super:
1
    // Bit 7:6 - COM1A1:0: Compare Output Mode for Unit A
2
    TCCR1A &= ~(1<<COM1A1);     // Toggle OC1A on Compare Match
3
    TCCR1A |=  (1<<COM1A0);     // Toggle OC1A on Compare Match
Jedoch steht im Datenblatt, dass dann der zweite Counter (OCR1B) nicht 
verwendet werden kann.

Ändere ich diese Einstellung nun also um, funktioniert leider gar nichts 
mehr:
1
    // Bit 7:6 - COM1A1:0: Compare Output Mode for Unit A
2
    TCCR1A |=  (1<<COM1A1);     // Clear OC1A/OC1B on Compare Match when upcounting
3
    TCCR1A &= ~(1<<COM1A0);     // Clear OC1A/OC1B on Compare Match when upcounting


Kann mir vielleicht jemand sagen was ich falsch mache?
Ich habe mal meinen Code, der für einen Counter funktioniert mit 
eingefügt:
1
    // PRR-Power Reduction Register: PRTIM1 = 0
2
    // Power Reduction Timer/Counter1 = off
3
    PRR &= ~(1<<PRTIM1);
4
5
    // TCCR1A-Timer/Counter1 Control Register A
6
    // Bit 7:6 - COM1A1:0: Compare Output Mode for Unit A
7
    TCCR1A &= ~(1<<COM1A1);     // Toggle OC1A on Compare Match
8
    TCCR1A |=  (1<<COM1A0);     // Toggle OC1A on Compare Match
9
10
    // Bit 1:0 - WGM11:0: Waveform Generation Mode
11
    TCCR1A &= ~(1<<WGM11);      // PWM, Phase and Frequency Correct
12
    TCCR1A |=  (1<<WGM10);      // PWM, Phase and Frequency Correct
13
14
    // TCCR1B - Timer/Counter1 Control Register B
15
    // Bit 4:3 - WGM13:2: Waveform Generation Mode
16
    TCCR1B |=  (1<<WGM13);      // PWM, Phase and Frequency Correct
17
    TCCR1B &= ~(1<<WGM12);      // PWM, Phase and Frequency Correct
18
19
20
    // TCNT1H and TCNT1L - Timer/Counter1
21
    TCNT1H =  0x00;             // set counter to 0
22
    TCNT1L =  0x00;             // set counter to 0
23
    
24
    // TCCR1B - Timer/Counter1 Control Register B
25
    // Bit 2:0 - CS12:0: Clock Select
26
    TCCR1B &= ~07;              // clear settings before
27
    //---------------------------------------------------------
28
    // OCR1AH and OCR1AL - Output Compare Register 1 A
29
    OCR1AH = 0xFF;              // continuously compared with value TCNT1
30
    OCR1AL = 0x00;              // continuously compared with value TCNT1
31
    //---------------------------------------------------------
32
    TCCR1B |=  0x01;            // clk_IO/1     (No prescaling)
33
//  TCCR1B |=  0x02;            // clk_IO/8    (From prescaler)
34
//  TCCR1B |=  0x03;            // clk_IO/64   (From prescaler)
35
//  TCCR1B |=  0x04;            // clk_IO/256  (From prescaler)
36
//  TCCR1B |=  0x05;            // clk_IO/1024 (From prescaler)
37
38
    // TCCR1C-Timer/Counter1 Control Register C
39
    // only active when the WGM13:0 bits specifies a non-PWM mode
40
    TCCR1C =  0x00;             // for compatibility with future devices
41
    
42
    //Set Bit5 of PortB as output
43
    DDRB |= 0x20;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.