PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Software PWM



albundy
24.02.2007, 18:44
Hallo,

ich möchte ein LCD Display dimmen. Habe aber bis jetzt noch keine brauchbare Idee, um das umzusetzen.
Ich habe bereits einen Timer mit 10ms IRQ in Betrieb, der die Dauer des Dimmens bestimmen soll.
Das ganze soll etwa 1,5 - 2 Sekunden dauern.
Mein Programm läuft mit 8 MHz.
Hardware PWM ist leider nicht möglich.

Ich brauche eigendlich nur einen Denkanstoß, wie ich das in einer separaten Schleife realisieren kann.

SprinterSB
24.02.2007, 18:56
"PWM per Software" reicht nicht als Anstoß?


https://www.roboternetz.de/wissen/index.php/Pulsweitenmodulation#PWM_per_Software

albundy
24.02.2007, 21:26
PWM per Software" reicht nicht als Anstoß?
Leider nicht wirklich. Ich habe vorher schon danach gesucht.

Sorry, ich kann mir das irgendwie nicht richtig vorstellen.


max
Gibt die Auflösung der PWM an. Für max=100 hat die PWM eine Auflösung von 1% und es können 101 verschiedene duty cycle eingestellt werden (von 0 bis 100)
duty
Codiert den duty cycle; kann Werte von 0..max annehmen. Ein Wert von 0 entspricht 0%, ein Wert von max entspricht 100%.


Wenn ich 1,5 Sekunden dimmen will, in 10ms Schritten, wäre das als "Max" 150 ?
Wie muss ich mir in dem Zusammenhang "Duty" vorstellen ?

SprinterSB
24.02.2007, 21:36
Wenn ich 1,5 Sekunden dimmen will, in 10ms Schritten, wäre das als "Max" 150?

Das wäre eine Möglichkeit. Es kommt ja auch darauf an, welche Auflösung die PWM haben soll.

Du brauchst zwei Takte:

1) Ein Takt für die PWM, Frequenz f1. Dieser führt die im Artikel codierte Aktion aus. Dies sollte in möglichst äquidistanten Schritten erfolgen, um die PWM-Frequemz sicher zu stellen und den Jitter klein zu halten. Der Code ist nicht aufwändig und fühlt sich in einer ISR nicht unwohl. Für die Frequenz der PWM gilt dann f_PWM = f1 / MAX.

2) Ein Takt, mit dem du DUTY hochlaufen lässt. Dieser ist bei dir 10ms und nach 1.5s bist du bei 100%. Das kann unabhängig (asynchron) zu 1) geschehen.

Falls in einer ISR kein Platz ist oder das zu hohe Last macht wegen der IRQ-Rate, geht evtl. auch eine doppelt geschachtelte Schleife, aber dann wird die Nebenläufigkeit mit deinen anderen Aufgaben behindert.

wkrug
24.02.2007, 23:17
@albundy
Ich versteh da dein Problem nicht so ganz.
Dein Timer mit 10ms produziert ein PWM Signal mit ca. 50Hz (wenn ich das richtig verstanden habe).
Der Eingang des PWM Generators wird mit einem der Helligkeit entsprechenden Zahlenwert gefüttert. Einfacherweise nimmt man dafür einen Wert von 0 für AUS bis 255 VOLL AN, weil dieser Zahlenbereich in ein Register passt.
Diese PWM würd ich in einem normalen Timer Interrupt laufen lassen, der die entsprechende Pulsbreite an einem oder mehreren Ports ausgibt.
Die Dimmer Werte würd ich von einem anderen Timer Interrupt generieren lassen und die Werte dann einfach von der PWM Routine abholen lassen.

Somit kannst Du die Dimmfrequenz und die Dimmdauer getrennt voneinander einstellen. Musst allerdings auch 2 Timer dafür opfern.
Man kann natürlich auch beides in eine PWM Routine packen, wenn man denn tatsächlich keinen Timer mehr frei hat.

albundy
25.02.2007, 10:08
@SprinterSB

danke, ich denke, ich habe es jetzt verstanden.

Ich baue mir eine Schleife die alle 0,1ms "Tick" hochzählt.
Im Timer Int. (10ms) zähle ich "Duty" hoch.
Beide Zähler zählen jeweils bis 200. Wobei "Tick" dann wieder auf "0" gesetzt wird.
Somit erhöht sich in 200 Schritten ( 2 Sekunden) der "pwm=1" Zyklus in 0,1 ms Schritten.

Das der Controller während dessen nichts anderes machen kann, ist kein Problem.
Ich werde es heute mal ausprobieren.

@wkrug

wenn ich einen Timer frei hätte, würde ich Hardware PWM dafür nehmen.