mikrocontroller.net

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


Autor: Jens Schubert (wurstgote)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens Schubert (wurstgote)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Holla, habe ich glatt vergessen: Das ganze soll auf einem ATmega8
laufen!

Grüße
Jens

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens Schubert (wurstgote)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens Schubert (wurstgote)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.