mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM-Signal


Autor: Frank (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

versuche ein PWM-Signal zu erzeugen. Kann mir jemand sagen wo der
Fehler in dem Code steckt. Der Compiler sagt dass alles in Ordnung ist,
doch am Osz... ist nix zu sehen.

Atmega48, 8MHz externer Quarz!

Gruß

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du ins Compare-Register nix reinschreibst, dann kommt auch nix
raus...

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, eigentlich logisch! Jetzt klappts.

Ich verwende ja jetzt das OCR0A Register um die Pulsbreite des PWM
Signals ändern. Könnte ich nun das OCR0B in einem anderen Timer nutzen,
es da mit dem TCNT0 vergleichen um mir dann z.B. eine Pause des anderen
Timers generieren?

Oder denke ich da jetzt völlig unlogisch.....?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie der Name schon sagt, gehören die Register OCR0A und OCR0B zum Timer
0 (deshalb die '0' vor dem A bzw. dem B). Das ist intern fest
verdrahtet und lässt sich nicht ändern. Du kannst damit mit dem selben
Timer ein zweites PWM-Signal gleicher Frequenz erzeugen.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ändern will ich das ja gar nicht.

Will den Interrupt des anderen Timers für eine bestimmte Zeit anhalten,
sobald er z.B. 10mal durchlaufen wurde.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beide OC-Register hängen an exakt dem gleichen Timer.
Formuliere doch mal deine Frage um.
So, wie ich sie verstehe, willst du mit OCR0A eine PWM ausgeben.
In dessen Interrupt-Routine zählst du dann eine Variable herunter
(einfacher und universeller ist das...). Sobald diese Variable = 0 ist,
schaltest du OCR0A aus (und startest den OCR0B-Interrtupt).
OCR0B wird nur als Interrupt ausgeführt, und zählt seinerseits eine
Variable herunter, die bei 0 dann wieder OCR0A freigibt....
Richtig so?

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, nicht wirklich.

Hab ein Signal mit Timer2 erzeugt. Da dieses Signal im µs Bereich liegt
ist die maximale Impulspause dort 255µs, da ich den Timer im CTC Modus
(Teiler8) mit dem Compare Interrupt betreibe.

Nun möchte in dort aber gerne eine Impulspause von ca. 60ms erzeugen,
was aber mit diesem ja nicht mehr möglich ist.

Nun dachte ich, das ich mit dem Timer2 wo auch das PWM-Signal erzeugt
wird, durch vergleichen einer Variable irgendwie auf diese 60ms komme
und den Interrupt von Timer2 dann einfach ein/aus schalte.

Bestimmt voll kompliziert wie ich denke und wahrscheinlich geht es auch
viel einfacher! Aber irgendwie komm ich nicht drauf, wie ich diese 60ms
Pause dort erzeugen kann.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, nun wissen wir schon, wie lang die Pause sein soll. Jetzt müßten wir
nur noch wissen, wie lang der Impuls sein soll und was das alles mit
Timer0 zu tun hat, um den es ja im ursprünglichen Code geht. Im letzten
Posting wird ja auf einmal alles mit Timer2 gemacht.

Also, mit welchen Timern willst du wie was für Impulse und was für
Pausen erzeugen?

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also mit Timer0 wird bis jetzt nur das PWM Signal erzeugt.

Mit Timer2 wird ein Signal erzeugt, das einen Impuls von 20µs Highpegel
hat, danach 140µs Lowpegel und dann 10µs Highpegel. Nach diesen 3
Impulsen soll nun eine Pause von 60ms erfolgen, bevor diese 3 Impulse
sich wiederholen. Nur krieg ich diese lange Pause mit diesem Timer
nicht hin, da die maximale Impulsdauer bei meinen Einstellungen maximal
255µs beträgt.....

Nun will ich irgendwie diese Pause erzeugen und habe mir Gedacht, dass
dieses vielleicht mit einem anderen Timer zu realisieren ist. In diesem
Fall mit Timer0 da dort nur das PWM Signal erzeugt wird....

Nur irgendwie weiß ich nicht, wie ich das anstellen soll....

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nur krieg ich diese lange Pause mit diesem Timer
> nicht hin, da die maximale Impulsdauer bei meinen Einstellungen
> maximal 255µs beträgt.....

Und wednn diese maximale Impulsdauer 253 mal abgelaufen ist, dann
sind das (+/- ein paar Zerquetschte) in etwa 60 ms.
Also: maximale Impulsdauer einstellen, jedes mal im Interrupt eine
Variable hochzählen, bei 253 -> deine 60 ms sind vergangen.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also nachdem die drei Impulse erzeugt wurden, setze ich OCR2A auf
255(maximale Pulsdauer), schalte den Ausgang des Ports auf 0 und lasse
den Interrupt ca. 253 durchlaufen. Danch geht wieder alles von vorne
los. Richtig?

Nur irgendwie muss ich  dann schauen dass der Port beim nächsten
Interrupt nicht wieder gesetzt wird, sondern erst nach dem 253'ten
Durchlauf......

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.