Forum: Mikrocontroller und Digitale Elektronik timer mit großer Spreizung


von Chris T. (chris0086)


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

: Bearbeitet durch User
von c-hater (Gast)


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?

von Chris T. (chris0086)


Lesenswert?

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?

von c-hater (Gast)


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?

von Bole aus Serbien (Gast)


Lesenswert?

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

 c-hater war schneller, aber...
 Nur aus Neugier:
 Wozu brauchst du das ?

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.