Forum: Mikrocontroller und Digitale Elektronik ATMEGA328PB: Wie Fast PWM auf OC2A?


von Sebastian W. (wangnick)


Angehängte Dateien:

Lesenswert?

Liebe Leute,

ich scheitere zur Zeit auf einem ATMEGA328PB den PB3 über OC2A als 
Fast-PWM zu benutzen. PD3 über OC2B funktioniert!
1
#include <avr/io.h>
2
#define F_CPU 16000000
3
static const uint16_t OCR2DEF = F_CPU/8/16000; // 16kHz (prescaler 8)
4
static const uint8_t MASK_TCCR2A = (1<<COM2A1)|(1<<COM2B1); // PWM output to OC2A (PB3, D11) and OC2B (PD3, D3)
5
6
int main (void) {
7
    DDRD |= (1<<PIND3); // OC2B
8
    DDRB |= (1<<PINB3); // OC2A
9
    TCCR2A = (1<<WGM21) | (1<<WGM20); // Fast PWM with OCR2A as TOP value and OCR2B as duty cycle value
10
    TCCR2B = (1<<WGM22) | (1<<CS21); // Activate timer, prescaler 8
11
    OCR2A = OCR2DEF;
12
    OCR2B = (uint16_t)OCR2A*25/100; // 25% duty cycle
13
14
    volatile uint32_t nop;
15
    while (1) {
16
        TCCR2A |= MASK_TCCR2A;
17
        for (nop=0; nop<1000; nop++) continue; // 2ms
18
        TCCR2A &= ~MASK_TCCR2A;
19
        for (nop=0; nop<10000; nop++) continue; // 20ms
20
    }
21
}

Das Board ist ein Pololu A*Star 328PB, programmiert aus Microchip Studio 
7.0 mit AVR Dragon über ISP.

Was mache ich falsch?

LG, Sebastian

von Falk B. (falk)


Lesenswert?

Sebastian W. schrieb:
> ich scheitere zur Zeit auf einem ATMEGA328PB den PB3 über OC2A als
> Fast-PWM zu benutzen. PD3 über OC2B funktioniert!

Mal deine eigenen (kopierten?) Kommentare gelesen?


>     TCCR2A = (1<<WGM21) | (1<<WGM20); // Fast PWM with OCR2A as TOP
> value and OCR2B as duty cycle value

Wenn du beide OCR2x Ausgänge am Timer 2 verwenden willst, musst du einen 
Modus wählen, wo OCR2A NICHT als TO Wert benutzt wird, also Mode 1 oder
3.

von Oliver S. (oliverso)


Lesenswert?

Im Datenblatt liest sich das so:

„Setting the OCR1x equal to TOP will
result in a constant high or low output
(depending on the polarity of the output set by the COM1x1:0 bits.)“

Oliver

von Sebastian W. (wangnick)


Lesenswert?

Falk B. schrieb:
> Wenn du beide OCR2x Ausgänge am Timer 2 verwenden willst, musst du einen
> Modus wählen, wo OCR2A NICHT als TO Wert benutzt wird, also Mode 1 oder
> 3.

AHA! Jetzt fällt der Groschen. Mir war nicht klar dass OCR2A OC2A 
steuert und OCR2B OC2B. Das bedeutet dann aber auch, dass nur die 
OCxB-Ausgänge frei in der Frequenz gesteuert werden können, also mit 
OCR2A als TOP-Wert des Zählers, oder?

LG, Sebastian

von Georg M. (g_m)


Lesenswert?

ATmega328PB Datasheet:
When using OCRnA as TOP value in a PWM mode, the OCRnA register cannot 
be used for generating a PWM output.

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.