Forum: Mikrocontroller und Digitale Elektronik PWM-Signal


von Frank (Gast)


Angehängte Dateien:

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ß

von johnny.m (Gast)


Lesenswert?

Wenn Du ins Compare-Register nix reinschreibst, dann kommt auch nix
raus...

von Frank (Gast)


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.....?

von johnny.m (Gast)


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.

von Frank (Gast)


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.

von inoffizieller WM-Rahul (Gast)


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?

von Frank (Gast)


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.

von Rolf Magnus (Gast)


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?

von Frank (Gast)


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....

von Karl H. (kbuchegg)


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.

von Frank (Gast)


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......

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.