Forum: Mikrocontroller und Digitale Elektronik Fast PWM Mode Atmega32


von Till (Gast)


Lesenswert?

Hallo.
Ich will ein sehr spezielles Bussystem nachbilden:
1.2 KHz, die länge des Low level bestimmt ob es sich um eine 0,1 oder 
syncbit handelt. Ich hab ein Atmega32 auf einem STK500 (3,686MHz).
ich wollte den Fast pwm Mode verwenden damit ich nach jeder Periode 
(also jedes Bit) die Pulsweite verändern kann über das OCR0 register.

Aber wie komm ich auf meine Frequenz ? kann ich was unternehmen damit er 
nicht bis 256 hochzählt da ich mit den prescaler nicht hinkomm?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du könntest ihn durch einen ATmega324P upgraden, der besitzt die
Möglichkeit, als Alternative zu TOP = 0xFF im Fast PWM mode noch
TOP = OCR0A zu benutzen.  Damit kann man die Frequenz einstellen.

Beim ATmega32 bliebe höchstens die Möglichkeit, den Timer mit
dem Overflow vorzubelegen, um so die Zählweite zu verkürzen, und
die Impulsgenerierung dann nicht als Fast PWM, sondern als normale
Pinfunktion des OC0-Pins vorzunehmen.  Das leidet aber unter einem
Jitter, der durch mögliche Verzögerungen in der Interruptannahme
bedingt ist.

von Andreas K. (a-k)


Lesenswert?

Timer 1 müsste auch beim Mega32 einen PWM-Modus haben, der bis ICR1 
zählt.

von Till (Gast)


Lesenswert?

aber wohl nicht bei dem Fast Mode den ich benötige um nach jeder Periode 
die pulsweite zu verstellen

von Andreas K. (a-k)


Lesenswert?

Doch, er hat. Du müsstest bloss mal ins Datasheet reinschauen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Andreas Kaiser wrote:
> Doch, er hat. Du müsstest bloss mal ins Datasheet reinschauen.

Sogar 2.  Ich war nur davon ausgegangen, dass Timer 0 aus irgendwelchen
Gründen bereits gesetzt ist.

von Till (Gast)


Lesenswert?

Vielen Dank
Das hört sich gut an aber ich kanns nicht trotz datasheet.

DDRB = 0xff;  // ausgang
TCCR0 = 0x7a; // Fast mode, clk/8
OCR0 = 0x80; // verhältnis HIGH/LOW 1:1

Welchen Modus bzw. Register muss ich nun noch setzen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Es ging um Timer 1, du bist immer noch bei Timer 0.

Der PWM beim Timer 0 im ATmega32 kann nur als 8-bit-PWM betrieben
werden.  Wenn Timer 0 und ATmega32 für dich gesetzt sind, kannst
du das bestenfalls in Software emulieren, siehe oben.

Wenn Timer 0 gesetzt ist, es aber ein pinkompatibler AVR sein darf,
dann kannst du einen ATmega324P nehmen.  Er hat einen Mode 7, bei
dem er als Fast PWM arbeitet und die Zählweite mit OCR0A begrenzt
wird.  Der PWM-Ausgang ist dann OC0B.

Wenn der ATmega32 gesetzt ist, es aber auch Timer 1 sein darf, dann
guck dir die Modes 14 und 15 im Timer 1 an.

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.