Krumeltee

-> Elektronik, Mikrocontroller und Retro-Computing <-

Kontrast für HD44780 LCD Displays per Software (PWM) regeln

Posted by krumeltee - 27. August 2011

Oft muss man im Betrieb den Kontrast oder auch die Hintergrundbeleuchtung für Displays ändern. Für den Kontrast ist normalerweise ein Poti vorgesehen, für die Hintergrundbleuchtung gibt es zig verschiedene Varianten, jenachdem wie die Hintergrundbeleuchtung gemacht ist. Die Steuerung der Hintergrundbeleuchtung beschreibe ich in einem anderen Artikel.

Hier zeige ich zwei Methoden zur Regelung des Kontrasts und eine, ganz einfache, für die Hintergrundbeleuchtung.

Für den Kontrast gibt es die Möglichkeiten per:

  • DA-Wandler + Operationsverstärker (einfach, teuer)
  • PWM + RC-Glied (sehr einfach, billig)

Die Methode mit dem DA-Wandler ist nur dann sinnvoll, wenn entweder der Mikrocontroller einen DA-Wandler eingebaut hat oder sowieso schon einer im „System“ vorhanden ist. Für meine Versuche habe ich einen MAX520 und einen LM358 als Spannungsfolger beschaltet verwendet. Der Ausgang vom DA-Wandler auf den Eingang vom OP, der Ausgang vom OP direkt auf den Kontrast-Pin vom LCD. Mehr ist nicht notwendig, keine Widerstände, keine Kondensatoren, nichts.

Da mir diese Methode aber etwas zu teuer und wenig sinnvoll ist, habe ich mich für PWM + RC-Glied entschieden.

Diese Methode lässt sich für alle Displays einsetzen, welche nur über ein Poti von GND nach VCC im Kontrast geregelt werden, also nicht nur die HD44780, sondern auch viele T6963, KS0107/KS0108 Grafik-LCDs, …

Hier der Schaltplan:

Die Schaltung funktioniert so:

C1 und R2 bilden einen Tiefpass, der die PWM-Spannung in eine (annähernd) Gleichspannung umwandelt. R1 und R3 bilden einen Spannungsteiler, der einen „Mindestpegel auf den Kontrastpin legt.

Die meisten LCDs sind bei einer Kontrastspannung von ca. 0,8V bis 1,2V am besten lesbar. Mit dieser Schaltung lässt sich der Pegel des Kontrastpins von ca. 0,125V bis 2,8V in 256 Schritten einstellen.

Der Tiefpass+Spannungsteiler ist nötig, da ein reines PWM-Signal das Display sehr stark flackern lässt. Die PWM-Frequenz in meinem Beispiel beträgt ca. 31khz, ab 25khz wurde es schön lesbar, ohne Flackern ausmachen zu können. Weiter unten habe ich dazu noch eine kurze Erklärung.

Folgender Beispielcode ist gemeinsam für Hintergrundbeleuchtung und Kontrast gemacht. Er läuft auf einem ATMega16/ATMega32 bei 16Mhz und benutzt die Pins OC1A und OC1B. Die Helligkeit und der Kontrast lassen sich regeln, in dem man einfach die Werte von 0 bis 255 in die Register OCR1A und OCR1B schreibt:

int main(void) {
    char buffer[25];
    unsigned char contrast = 0;

    lcd_init(LCD_DISP_ON);
    lcd_clrscr();
    lcd_puts("hello world");

    DDRD |= (1<<PD5)|(1<<PD4);    // OC1A, OC1B for contrast and backlight

    DDRB &= ~((1<<PB0)|(1<<PB1));    // buttons
    PORTB |= (1<<PB0)|(1<<PB1);    // pullups for buttons

    TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1);
    TCCR1B = (1<<CS10);
    OCR1A = 0xff;
    OCR1B = 0x60;

    for (;;) {
        if(!(PINB&(1<<PB0))) { OCR1A++; _delay_ms(25); }
        if(!(PINB&(1<<PB1))) { OCR1B++;  _delay_ms(25); }
    }
}

An PB0 und PB1 sind zwei Taster angeschlossen, die, wenn man sie drückt den Wert in den Registern für Kontrast und Beleuchtung einfach hochzählen. Sobald der Wert grösser als 255 wäre, hüpft er automatisch auf 0 herunter und geht dann wieder weiter nach oben.

Hier mal ein paar Fotos von einem Weiss-Schwarzen Display mit obigem Code:

Erklärung zur PWM Frequenz:

Die PWM-Frequenz für den Kontrast muss im Vergleich zum Dimmen von LEDs, Lampen usw. sehr hoch sein, da sich das Display ja stetig aktualisiert. Wenn nun in dem Moment, wo das Display seinen Inhalt anzeigt, der Kontrast für kurze Zeit fehlt und gleich wieder da ist, dann flimmert alles. Das sieht dann ungefähr so aus, wie wenn man mit einer einfachen Kamera einen Fernseher/Monitor filmt und dort dann die Streifen quer durchs Bild rollen.

Erklärung zum Tiefpass:

Die PWM-Spannung wird vom Tiefpass in eine nahezu glatte Gleichspannung geglättet. Das Thema Tiefpass ist hierfür zu Umgangreich und wird schon auf zig anderen Seiten Disskutiert. Hier aber noch zwei Oszilloskop-Bilder, das eine vor dem Tiefpass, direkt an der PWM, das andere nach dem Tiefpass.

  Man sieht hier genau die PWM mit 5V und einer Frequenz von etwa 31khz.

Hier sieht man die geglättete Kontrastspannung von etwa 1,2V für das Display. Die Spannung „schwankt im Dreieck“ um etwa +-50mV (0,05V), was schon sehr gut ist. Das liesse sich durch einen 1µF Kondensator nach GND nahezu komplett auf ca. -+10mV ausbügeln, was aber völlig unnötig ist.

Jeder 7805 und ähnliche haben einen grösseren Fehler als das😉

7 Antworten to “Kontrast für HD44780 LCD Displays per Software (PWM) regeln”

  1. TOM said

    Cool… schön geschrieben … erspart mir, es selbst zu basteln und die passenden Werte herauszufinden🙂
    Wollte schon ein Digital-Poti nehmen (teuer!) oder es mir diskret aufbauen(viele Widerstände, viele Pins oder Schieberegister)

  2. stefan said

    Oder ein LDR Koppler, geht auch sehr gut um Ton zu regeln.

  3. TOM said

    für die Helligkeit vielleicht, aber bei so was nerven meiner Meinung nach automatische Anpassungen meist. beim Kontrast wird dir das wenig helfen, denn bei den Meisten Displays brauchst du unterschiedliche Kontrasteinstellungen für verschiedene Blickwinkel

  4. Gregy said

    Hi, tolle Sache! Vielen Dank dafür.

    Leider kann ich nicht nachvollziehen, wie Du die Angelegenheit mit der Helligkeit realisierst… Gehst Du direkt mit Deinem PD4 auf die Anode der Displaybeleuchtung? Oder gehe ich recht davon aus, dass Du die angegebene Schaltung auch für die Beleuchtung verwendest.

    Vielen Dank schon mal im Voarus und Beste Grüße

  5. […] Als ich meinen Reflow-Ofen gebaut habe, musste auch eine Kontrastregelung für das LCD auf die Platine. Das 1-Euro-Pollin-Display erwies sich da als recht sensibel, und so habe ich eine negative Hilfsspannung und ein Poti implementiert, damit ich bei Bedarf den Kontrast anpassen kann. Die klügere Lösung gibt esim Blog “Krumeltee” zu besichtigen: Per PWM mit dem Controller. […]

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

 
%d Bloggern gefällt das: