Forum: Mikrocontroller und Digitale Elektronik 2-Kanal-PWM mittels Timer1


von Jens S. (wurstgote)


Lesenswert?

Tach zusammen,

mein Name ist Jens, ich bin der Neue und will mal direkt mit einer
Frage nerven:

Ich versuche gerade, mittels Timer1 zwei unterschiedliche PWM-Signale
auf PB1 und PB2 zu erzeugen. Bei beiden soll die PWM-Frequenz etwa
20kHz betragen.
Gedacht war nun folgendes: Ich lade ICR1 mit dem Wert 397 (der MC ist
mit 8MHz getaktet, 8000000/397 ~ 20151), packe in OCR1A und OCR1B
geeignete Werte und bereite Timer1 vor.
Dazu werden die TCCR1x-Register so bestückt:

  TCCR1A=_BV(COM1A1) | _BV(COM1B1) | _BV(WGM11);
  TCCR1B=_BV(WGM12) | _BV(WGM13) | _BV(CS10);

Wenn nun TCNT1 den in ICR1 gespeicherten Wert erreicht, soll ein
Interrupt ausgelöst werden; ich setze also

      TIMSK=_BV(TOIE1);

In der ISR werden dann die OCR1x-Werte geeignet verändert.
So weit, so gut. Das Problem ist nur, daß die Interrupt-Routine nicht
wie gewünscht alle 397 Takte angesprungen wird, sondern alle 1022
(=0x3fe) Takte.

Irgendetwas stimmt also mit meinen Einstellungen nicht, ich komme aber
ums Verrecken nicht drauf, woran es hapert.

Hat jemand von Euch eventuell eine Idee?

Tausend Dank im voraus,
Jens

von Jens S. (wurstgote)


Lesenswert?

Holla, habe ich glatt vergessen: Das ganze soll auf einem ATmega8
laufen!

Grüße
Jens

von TravelRec. (Gast)


Lesenswert?

Ist es nicht so, daß der Timer weiter läuft, bis er die eingestellte
maximale Bit-auflösung erreicht hat (also 8  9  10 Bit), es sei denn,
Du definierst das ICR-Register als Top-Wert und aktivierst das WGM12 und
WGM13 Bit im Fast-PWM Mode (Datenbladdel, mal in die Tabelle gucken -
hab´s nicht ganz im Kopf). Oder Du löschst den Timer manuell in der
ISR.

von Peter D. (peda)


Lesenswert?

Was willst Du denn nun ?

PWM oder Timerinterrupt ?

PWM oder Frequenzerzeugung ?


Die PWM erfolgt jedenfalls vollständig in Hardware und ganz ohne
Interrupts.
Die Frequenz, mit der die PWM erfolgt ist dabei abhängig von der
gewählten Bitbreite und dem Vorteiler und ist immer gleich. Der
PWM-Wert ändert nämlich nur das Tastverhältnis.


Peter

von Jens S. (wurstgote)


Lesenswert?

Hi,

@ TravelRec: Das ICR-Register sollte den TOP-Wert (hier halt 397)
erhalten. Wenn ich den Fast-PWM-Mode 14 wähle (WGM11=WGM12=WGM13=1,
WGM10=0), dann sollte der Zähler, laut Datenblatt, eigentlich bis zum
Wert von ICR1 hochzählen und im nächsten Takt auf 0 zurückgesetzt
werden. Das tut er aber irgendwie nicht.

@ Peter: Letzten Endes möchte ich zwei phasenverschobene Sinuskurven
via PWM erzeugen. Die notwendigen Tastwerte habe ich in einem Array
abgelegt. Ich hatte es nun aber so verstanden, daß ich die
PWM-Grundfrequenz unter anderem über das ICR1-Register einstellen kann,
bei dem gewählten Wert von 397 sollte also eine Grundfrequenz von
8000000/397 Hz benutzt werden. Oder habe ich da etwas grundlegend
falsch verstanden?

Grüße
Jens

von Jens S. (wurstgote)


Lesenswert?

Hallo zusammen,

ich bin's wohl noch einmal.
Das Problem hat sich gelöst :) Nun funktioniert's so, wie es soll. Der
Übeltäter war nicht mein Programm, sondern AVR Studio. Durch Zufall bin
ich im AVRFreaks-Forum über einen Beitrag gestolpert, in dem das
gleiche Fehlverhalten beschrieben wurde. Der Threadstarter hat dort
auch eine Mitteilung von Atmel gepostet, in der die Jungs eingeräumt
haben, daß der Taktzyklenzähler tatsächlich beim Waveform Generation
Mode 14 versagt.
Nachdem ich das Programm dann in Hardware gebannt und ein paar LEDs
angeschlossen habe, zeigt sich, daß es genau das tut,was geplant war.

Eine angenehme Nacht,
Jens

von TravelRec. (Gast)


Lesenswert?

Aach sooo, na ich brenne immer gleich und simuliere nicht vorher. LEDs
oder gar ein Display helfen beim Debugging. Wenn´s dann geht, ist gut,
ansonsten suche ich den Fehler in meinem Programm. Bislang hat der
Prozessor immer Recht gehabt und so gehe ich eventuellen Bugs im
Simulator lieber gleich aus dem Weg. Nix gegen AVR-Studio ansonsten.

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.