LCD-Backlight über den PC steuern
Bisher musste ich die Hintergrundbeleuchtung meines LCDs immer am Display selbst ab- und ausschalten bzw. regeln. Mit der Zeit wird es allerdings nervig, dauernd den Schraubendreher zu nehmen und die Beleuchtung etwas heller oder dunkler zu machen. Diverse Anwendungen, wie jaLCDs, können die Beleuchtung zwar an- und ausschalten was man schon mit einem Transistor und ein paar Widerständen machen kann aber die Helligkeit per Software einstellen?
"Ne, ham' wir nich" würde die Programmierer wahrscheinlich sagen.
Ich habe mich hingesetzt und ein bisschen überlegt...
...da kam mir in den Sinn, dass man DB0-DB7 am Display für eine Steuerung
missbrauchen könnte. Aber wie behält man den Helligkeitswert und setzt 8 Bit in
einen analogen Wert um?
Zum Glück gibt es die Newsgroup de.sci.electronics! Also schnell die Frage
gestellt auf die ich schon nach 20 Minuten die erste Antwort bekam.
Nun wusste ich auch, wie ein "Speicher für Logikschaltungen mit Enable" heißt:
8-Bit Latch oder in der langen Version "Octal D-Flipflop mit Latch".
Die erste Frage ist also geklärt - Aber was ist mit der Umwandlung von Analog nach Digital?
Ich habe mich ein bisschen im Internet umgesehen und bin dabei auf den IC DAC0800 gestoßen. Nach erstellen eines Stromlaufplanes mit besagtem Chip wollte ich zur Sicherheit wissen, ob die Beschaltung so richtig ist. Dank dafür an MaWin (und seine Gedult - ich hoffe, ich bin nicht in seiner Killfile ;) ). Er sagte mir, dass es so nicht funktioniert und empfahl mir, ein R-2R-Netzwerk zu verwenden.
Ok, also dann alles mit Widerständen. Also schnell Google öffnen
und "R-2R" einhämmern (ich wollte Referenzen zum ASCII-Bild der Newsgroupler).
Das
zweite Suchergebnis war ein Volltreffer: Eine komplette Beschreibung auf
einem Uni-Server.
Also schnell nach
EAGLE und einen
Stromlaufplan zeichnen.
Die Schaltung war nach einem Besuch in der Elektro-Apotheke auch relativ schnell
aufgebaut.
Das Testprogramm war auch sehr schnell geschrieben: Eine
Scrollbar, ein Timer und die Inpout32.dll. Der Timer verschob in 1s-Schritten
die Scrollbar um eine Einheit nach oben, die wiederum den Parallelport binär von
0 auf 255 hochzählte.
Um das Ergebnis nachher besser auswerten zu können, habe ich die Analogwerte mit
meinem DMM gemessen, das die Werte an den PC weitergab.
Dabei entstand folgendes Diagramm:
Zum Vergrößern anklicken.
Ich hatte eigentlich einen (halbwegs) linearen Anstieg der
Spannung erwartet. Aber das ist alles andere als Linear.
Auffällig ist, dass bei dem 2, 4, 8, 16, ... Wert der "Sprung" nach unten sehr
stark ausgebildet ist.
Nach etwas nachdenken war klar, dass ich das Flachbandkabel
verkehrt herum an den Parallelport angeschlossen habe.
Also noch einmal die Lötstation anwerfen und alle Adern richtig anlöten.
Und? (fast) LINEAR!
Da der Logik-IC die Hintergrundbeleuchtung aufgrund der "hohen"
Stromaufnahme nicht direkt betreiben kann, muss ein Transistor her. Mit einem
BC548 konnte ich eine einzelne LED schon recht gut dimmen - aber die große
Hintergrundbeleuchtung?
Bei einem Versuch fand ich heraus, dass die Spannung am Transistor zusammenbrach
- also muss ein stärkerer Transistor her. In der Bastelkiste fand ich einen
BC237 mit dem ich die Hintergrundbeleuchtung schon einmal schalten konnte. Mit
einem Widerstand vor der Basis konnte ich den Einstellbereich etwas erhöhen.
Also die Hardware ist schon mal fertig. Fast - wie ich später
feststellen musste.
Damit die Beleuchtung nicht dauernd ihre Helligkeit im Takt der Displayausgaben
ändert, muss das Latch noch angeschlossen werden. Spontan griff ich zu Pin 17 am
Parallelport.
Leider ist dieser hardwaremäßig invertiert. Sprich: Wenn man in in der Software
auf Low setzt ist er am Parallelport auf High. Wenn man anstatt des eigenen Code
jaLCDs o.ä. verwendet ist das nicht das wahre, da sich die Helligkeit nicht
hält. Also muss das Latch für den IC invertiert werden. Noch einen Logik-IC
wollte ich aus Platzgründen nicht nehmen.
Stattdessen einen BC548 mit einem Pull-Up. Wenn am Transistor jetzt an der Basis
5V anliegt, schaltet der Transistor das Latch des ICs auf 0V, wenn an der Basis
0V anliegen sperrt der Transistor und über den Pull-Up bekommt das Latch 5V (mit
geringem Strom der aber zum Schalten reicht).
Als Abschluss habe ich noch einmal die Spannung, die direkt an
der Beleuchtung anliegt gemessen.
Dem Ausgabewert wurde pro Sekunde 1 Addiert. Der Messvorgang dauerte somit 256
Sekunden (4:16)
Die gelegentlichen Spannungseinbrüche kann ich mir selbst nicht genau erklären.
Es sind keine Messfehler, sondern kommen entweder vom PC oder dem IC.
Nachtrag: Jetzt kann ich die Spannungseinbrüche erklären (Danke
Robert! [IRC]):
Da meine Apotheke keine HCT-ICs da hatte, habe ich einen HC genommen (die
Bezeichnung steht noch im Stromlaufplan), der eine höhere Schaltspannung hat.
Daher kann es sein, dass der IC eine 1 mit einer 0 verwechselt. Also lieber den
Chip wie unten (in der Bestellliste) angegeben.
Bei diesem Diagramm werden sich viele denken, dass die
Helligkeit nicht Linear sondern am Anfang sehr stark und danach fast nicht mehr
ändert.
Stimmt aber nicht. Die Helligkeit hängt mehr vom Strom als von der Spannung ab.
Deshalb habe ich auch den Strom, der zur Beleuchtung "fließt"
gemessen:
Das ist doch schon schöner. Zwar nicht 100% linear und bis zum Wert 32 auf 0mA,
aber was will man mehr?
Jetzt aber weg von der "theoretischen Praxis" und auf zum...
Nachbau:
Die Bestellliste (Art-Nr. für Reichelt) lautet wie folgt:
Menge: | Art.-Nr.: | Beschreibung: | Preis: |
1 | 74HCT573 | 8-Bit Latch | 0.31 € |
1 | BC337-25 | Transistor | 0.04 € |
1 | BC548A | Transistor | 0.05 € |
10 | Metall 10k | Metallschichtwiderstände 10kW 1% | 0.80 € |
9 | Metall 20k | Metallschichtwiderstände 20kW 1% | 0.72 € |
1 | 64Y-100k | Präzisionspoti 100kW | 0.64 € |
1 | X7R-2,5 100n | Vielschicht Kerko 100nF | 0.12 € |
Lochrasterplatine | |||
Flachbandkabel 9-Pol | |||
Insgesamt: | 2.68 € |
Der Stromlaufplan...
Klicken zum Vergrößern
...und das Platinen-Layout:
Zum abändern noch der Stromlaufplan und das Layout im EAGLE-Format:
Stromlaufplan und Platinen-Layout
Wenn es eng wird, kannst du statt den 10k-Widerständen natürlich auch ein Widerstandsnetzwerk verwenden. Ob die Genauigkeit darunter leidet ist nicht auszuschließen.
Wichtig ist, dass Pin 2 vom IC nicht an Pin 2 vom Parallelport
angeschlossen wird (auch die folgenden Anschlüsse), da du sonst ein Ergebnis
wie oben beschrieben bekommst.
Die Anschlussbelegung lautet wie folgt:
Parallel-Port: | Anschlussleiste (!!) |
2 | 9 |
3 | 8 |
4 | 7 |
5 | 6 |
6 | 5 |
7 | 4 |
8 | 3 |
9 | 2 |
17 | 1 |
Jetzt fehlt nur noch das Programm. Aber da wird dir auch geholfen ;)
'--- Beginn des Codes ---
Private Declare Sub PortOut32 Lib "inpout32.dll" Alias "Out32" (ByVal
PortAddress As Integer, ByVal Value As Integer)
Const Parport As Long = 888
Private Sub VScroll1_Change()
PortOut32 Parport + 2, 8
PortOut32 Parport, VScroll1.Value
PortOut32 Parport + 2, 5
End Sub
Private Sub VScroll1_Scroll()
PortOut32 Parport + 2, 8
PortOut32 Parport, VScroll1.Value
PortOut32 Parport + 2, 5
End Sub
'--- Ende des Codes ---
Das ganze ist jedoch nur zum Testen! Um richtig von 0-100% Dimmen zu können musst du die Grenzwerte miteinbeziehen. Dies musst du mit dem Poti abstimmen (Helligkeit auf 255 einstellen und den Poti so weit drehen, bis knapp vor den Punkt, bis es dunkler wird - am besten geht dies mit einem Strommesser) und dann nachträglich auch in zwei Variablen fassen, sodass die Kennlinie der Helligkeit einen best möglichen Verlauf hat.
Dieser Code ist vollständig in das aktuelle LCD-Modul integriert.