Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM mit Timervorgabewert
dj_cyborg
11.08.2013, 20:07
Hallo,
ich habe einen Atmega8 mit 16MHz. Ich möchte über eine PWM die Spannung einer Hintergrundbeleuchtung einstellen.
Wenn ich nicht Falsch liege, ist aber die schnellst mögliche Frequenz bei 16MHz, einen Prescaler von 1 und einen 8bit Timer bei 31250Hz.
Also: (16000000Hz/1) / (256*2) = 31,250 kHz
Ist das die schnellst mögliche Frequenz die ich mittels PWM erzeugen kann?
Kann ich bei PWM auch eine Art Timervorgabewert einbauen? Wenn ja, wie kann ich das in Bascom einbauen?
Danke für Eure Hilfe
mfG
Mario
aus welchem grund möchtest du die hintergrundhelligkeit mehr als 30000 mal in der Sekunde ändern?
dj_cyborg
11.08.2013, 20:50
Hallo Thomas,
also ich möchte die Helligkeit nicht 30000/sek ändern. :p
Sondern via PWM die Helligkeit der Hintergrundbeleuchtung eines S65 GLCD's einstellen. Also z.B. Am Tag heller und in der Nacht dunkler machen.
z.B. so: (Schaltung ganz unten) http://www.superkranz.de/christian/S65_Display/DisplayHardware.html
Nur ist mir nicht klar wie ich mit 16MHz Systemtakt 62,5kHz PWM erzeugen kann.
mfG
Mario
Edit: Ich hab gerade noch was gefunden, ich muß wohl den Atmega8 im Register auf Fast PWM umstellen. Muß ich jetzt erstmal das Datenblatt wälzen, wie das wieder funktioniert...
Sauerbruch
12.08.2013, 01:08
Nur ist mir nicht klar wie ich mit 16MHz Systemtakt 62,5kHz PWM erzeugen kann.
"Fast PWM" wäre da schon ein guter Ansatz - aber mir ist nicht klar, weshalb Du so eine hohe PWM-Frequenz brauchst, wenn´s nur darum geht, die Hintergrundhelligkeit eines Displays zu ändern. Das menschliche Auge ist so träge, dass es schon bei ca. 30 Hz keine einzelnen Ein- und Aus-Phasen einer Lichtquelle mehr voneinander trennen kann, sondern die Lichtquelle als mehr oder weniger hell leuchtend wahrnimmt (in Abhängigkeit des Ein-Aus-Verhältnisses). Mit 50 oder 100 Hz wärst Du schon auf der absolut sichern Seite! Wie kommst Du denn auf ausgerechnet 62,5 KHz?
dj_cyborg
12.08.2013, 06:20
Hallo Sauerbruch,
Danke für deine Antwort.
Die Displayhintergrundbeleuchtung läuft etwa mit 10,5V und 20-30mA. Die PWM pumpt mir die 5V Betriebsspannung über eine Induktivität in die Höhe. (siehe Schaltung im o.g. Link) Die 31,25kHz reichen aber nur für ca. 10V, 15mA. Da geht noch was! ;)
Für eine normale LED reicht die "normale" PWM schon aus aber hier geht es um eine Spannungserhöhung.
Die Frage müsste jetzt eigentlich heißen: Wie funktioniert der "FAST PWM Modus" in Bascom?
tausend Dank
mfG
Mario
Achso: Die 62,5K stehen oben im Schaltplan, da ich eine 1mH Induktivität verwende wird meine optimale Frequenz anders sein. Aber um das zu testen müßte ich erst mal in diesem Bereich der PWM kommen.
Sauerbruch
12.08.2013, 10:49
Okay - es geht Dir also gar nicht um ein variables Pulsweitenverhältnis, sondern Du bräuchtest eher ein Rechtecksignal mit 1:1-Tastverhältnis, aber variabler Frequenz - richtig?
Fast-PWM ist ja fast das gleiche wie "normales" PWM, nur dass der Zähler halt von 255 nicht wieder rückwärts runterzählt, sondern direkt auf auf 0 gesetzt wird. Die Frequenz des PWM-Signals ist daher doppelt so hoch wie bei "normalem" PWM (Taktfrequenz / (Prescaler * 256)). Mit dem Wert im Output-Compare-Register (OCR) kann dann das Impuls-Pausen-Verhältnis eingestellt werden.
Für Deine "Pumpe" wäre aber vielleicht der "CTC"-Modus das richtige: CTC heißt Clear Timer on Compare match - und das sagt eigentlich schon alles aus: Der Counter zählt so lange hoch, bis er den Wert im OCR-Register erreicht hat. Ist dies der Fall, wird der entsprechende Ausgang getoggelt und der Timer auf 0 resettet. Du bekommst also ein Rechtecksignal, das immer ein konstantes Tastverhältnis von 1:1 hat (weil´s ja durch Toggeln des Ausgangspins entsteht), aber eine sehr variable Frequenz. Je niedriger der Wert im OCR-Register ist, umso häufiger wird der Ausgang pro Zeiteinheit getoggelt. Eine Formel gibt es auch dazu: f = Taktfrequenz / (2*Prescaler*(OCR + 1)). Bei einem Prescaler von 1 könntest Du also Ausgangsfrequenzen zwischen 8 MHz (OCR=0) und 31,25 KHz (OCR=255) erzeugen. Auf Seite 111 des Datenblattes ist ein Diagramm, das mehr sagt als tausend Worte.
PWM-Geschichten mit Bascom zu programmieren fand ich immer etwas mühsam und undurchschaubar . Wenn Du das Register TCCR2 selber setzt weißt Du wenigstens, dass alles so ist wie es sein soll. Für Timer2 im CTC-Modus müssten die Bits WGM21 und WGM20 auf 1 und 0 gesetzt werden (CTC-Modus), die Bits COM21 und COM20 auf 0 und 1 ("Toggle OC2 on compare match"), und die Bits CS22, CS21 und CS20 auf 0, 0 und 1 (prescaler = 1). Das Register im Ganzen muss also &B00011001 enthalten - dann sollte es klappen, wenn Pin P.3 auch als Ausgang konfiguriert ist.
Ich hoffe, das war jetzt nicht zu viel verwirrende Informationen - andernfalls frag´ einfach nochmal nach!
dj_cyborg
12.08.2013, 11:33
Wow, vielen Dank für die vielen Informationen.
Ich werde das heut Nachmittag alles mal Versuchen.
Okay - es geht Dir also gar nicht um ein variables Pulsweitenverhältnis, sondern Du bräuchtest eher ein Rechtecksignal mit 1:1-Tastverhältnis, aber variabler Frequenz - richtig?
Jein, die Induktivität braucht eine bestimmte Frequenz bei der Sie am effektivsten Arbeitet.
Diese wollte ich durch testen erst einmal ermitteln - also variable Frequenz.
Wenn ich diese ermittelt habe, kann diese auch fix bleiben, denn die Helligkeit kann dann über das Tastverhältnis (Schaltschwelle) geändert werden. Kurze Ein-Phase - weniger Energie - dunkleres Display, und umgedreht.
Funktioniert aktuell auch schon wunderbar, nur ist die maximal Helligkeit erst zu ca. 80% erreicht. Die Ein-Phase sollte auch nicht länger sein als die Aus-Phase da sonst Energie über den MOS-FET (bei mir Transistor) verloren geht (in o.g. Schaltung Kurzschluss).
Also die Schaltschwelle bei 0 entspricht Display aus, bis maximal ca. 120 entspricht der vollen Beleuchtung (beim 8Bit Timer ).
mfG
Mario
dj_cyborg
12.08.2013, 18:33
So, ich denke jetzt hab ich's mit der Hilfe von Sauerbruch begriffen. Vielen Dank nochmal.
Den CTC- Modus habe ich nach deinen Angaben zum laufen bekommen und ganz gute Werte bei ca. 70kHz ermittelt.
Hab das ganze jetzt auf Fast PWM umgebaut. Und auf 62,5kHz eingestellt. Die Helligkeit lässt sich jetzt wunderbar von
Ocr1a = 0 (Display aus) bis Ocr1a = 70 (ca. 30mA über der Displaybeleuchtung einstellen). Hätte also noch genügend Puffer nach oben.
'8Bit FAST PWM mit 16MHz, Prescaler=1, F=62,5kHz
'Im PWM Modus ausgeschalten
'Foc1a = 0
'Foc1b = 0
'Modus 5 FAST PWM
'Wgm13 = 0
'Wgm12 = 1
'Wgm11 = 0
'Wgm10 = 1
'Prescaler 1
'Cs12 = 0
'Cs11 = 0
'Cs10 = 1
'A=Clear at Match, Set at Bottom / B = Normal Port
'Com1A1 = 1
'Com1A0 = 0
'Com1B1 = 0
'Com1B0 = 0
'Ins Register schreiben
Tccr1a = &B10000001
Tccr1b = &B00001001
'Als Ausgang schalten
Config Portb.1 = Output
'Schaltschwelle festlegen
Ocr1a = 0
So ein wenig Starthilfe im Datenblatt Urwald, nimmt einen erstmal den ersten Schrecken...tausend Dank ;)
mfG
Mario
Sauerbruch
12.08.2013, 21:08
Wow, das ist ja mal ein sauber auskommentierter Code!!
Schön dass es klappt - und mit der Zeit wirst Du sehen, dass diese Datenblätter gar nicht so schlimm sind. Im Gegenteil - je länger man ihn ihnen herumstöbert umso mehr entdeckt man, was diese kleinen Controller so alles können :-)
Weiterhin gutes Gelingen!
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.