timer mit großer Spreizung

OP #3740734
Lesenswert?

Moin Jungs,
wie würdet ihr das machen:?
Gegeben Atmega mit 7,2738MHz

Gewünscht: eine PWM mit einer festen High Zeit von ca. 30mS und 
variablen Low Zeiten von 30mS bis 144s.

Meine erste Idee:
2 Timer, einer der für die Low Zeiten zuständig ist und einer der 
aktiviert wird sobald der erste Timer um ist und den Pin auf High 
geschalten hat. Der zweite timer schaltet den Pin nach 30ms wieder auf 
Low.
Mit einem 16 bit Timer kann ich mit einem Prescaler von 1024 nur maximal 
9,1s "überbrücken" bevor er überläuft. Ich müsste also eine feste 
Zeitbasis zählen lassen und eine Variable für die Sekunden hochzählen 
lassen und dan in der Main auf den gewünschtetn Vergleichswert 
vergleichen oder wie würdet ihr das machen?
Die Länge des High Pegel muss immer gleich bleiben.
Wär da für Vorschläge dankbar.
Grüße Christian
Gast #3740838
Lesenswert?

Chris tian schrieb:

> wie würdet ihr das machen:?
> Gegeben Atmega mit 7,2738MHz
>
> Gewünscht: eine PWM mit einer festen High Zeit von ca. 30mS und
> variablen Low Zeiten von 30mS bis 144s.

Einen Timer für CTC mit einer Halbperiode von 30ms programmieren, so 
genau es halt Timerbreite und Muttertakt zulassen.

Der Rest passiert im OC-Interrupt des Timers. Natürlich ausschließlich 
in Vielfachen von 30ms (bzw. dem Wert, der sich aus dem dem verfügbaren 
Muttertakt als bestmögliche Näherung ergab)

Bis hierhin ist das wirklich Kinderkram.

Interessant wird es erst, wenn du für die "kleinen" Low-Zeiten genauer 
als das 30ms-Raster werden mußt.

Mußt du?
Gast #3740899
Lesenswert?

Chris tian schrieb:

> Abere mit nem 16Bit timer komm ich doch maximal auf eine Periodendauer
> von 9 Sekunden, dann hab ich top erreicht und der Pin wird umgeschaltet?
> Oder hab ich was übersehen?

Ja. Man kann den Timer auch rein als Zeitgeber für Software benutzen. Er 
muß nicht notwendigerweise direkt an den Pinpegeln rumhäkeln.

Oder anders augedrückt: Du mußt einfach nur in der ISR einen Zähler 
implementieren.

Dort vergleichst du den Stand deines Zählers mit dem aktuellen Sollwert 
deiner PWM (z.B. zwischen 1*30ms=30ms und 4800*30ms=144s).Ist der Zähler 
>= aktueller Sollwert, wird er auf 0 zurückgesetzt.

Letzlich schaust du, ob dein Zähler Null ist und gibst genau dann "high" 
aus, ansonsten "low".

Echt primitiv, oder?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren