- LiTime Speicher und Akkus         
Ergebnis 1 bis 8 von 8

Thema: RGB LED Spots mit PWM

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716

    RGB LED Spots mit PWM

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo alle zusammen,

    zunächst mal vielen Dank an alle hier, die mir immer antworten und bei meinen Problemen helfen, die eigentlich nie was mit Robotern zu tun haben. Ich vergesse das "gerne", da hier so viele Leute mit hervorragendem Wissen und Erfahrung schreiben.

    Ich hoffe auch, ihr habt wieder Lust euch in mein neuestes Problem rein zu denken und Vorschläge zu geben. Wie einige bestimmt mitbekommen haben bin ich zur Zeit am bauen einer RGB-Beleuchtung für mein Wohnzimmer, die ich gerne zunächst via Fernbedienung steuern möchte und später dann eine Kommunikation über IR zwischen PC und mehreren "Licht-Slaves" hinzufügen möchte.

    Als Beleuchtung habe ich mir LED-Spots in vier verschiedenen Farben im Halgon-Gehäuse gekauft. Am Wochenende habe ich den ersten Prototypen für die Steuerung auf Lochraster gebaut. Darauf enthalten ist ein Trafo, ein Tiny2313, der IR-Empfänger und 4 PWM-Ausgangsstufen, die wie folgt aussehen:

    Klicke auf die Grafik für eine größere Ansicht

Name:	RGB_Treiber.png
Hits:	20
Größe:	3,4 KB
ID:	24668

    Die von oben links kommende Leitung ist die gleichgerichtete Versorgungsspannung des 12V-Trafos. (ca. 17V DC). Ich habe bewußt einen stärkeren Treiber (IRF5305) gewählt, um das Ganze eventuell auf richtige Halgon-Spots umbauen zu können, wenn mir die LEDs nicht gefallen.

    Hier ist mein Test-Code im Tiny:

    Code:
    #define AVRGCC
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <compiler.h>
    #include <avr/interrupt.h>
    
    //F_CPU = 3686400
    
    #define PWM_PreScaler        8
    #define PWM_MaxStufen        100
    #define PWM_Frequenz        100
    #define PWM_OCR                (F_CPU / PWM_PreScaler / PWM_MaxStufen / PWM_Frequenz)
    
    #define FarbeRot            0
    #define FarbeGruen            1
    #define FarbeBlau            2
    #define FarbeGelb            3
    
    volatile    U8        PWM_level[4] = {0, 0, 0, 0};
    volatile    U8        PWM_count[4] = {0, 0, 0, 0};
    
    
    
    ISR (TIMER0_COMPA_vect)
    {
        U8 i1;
        for (i1 = 0; i1 < 4; i1++)
        {
            U8 Pin = (1<<i1);
    
            if ((PWM_level[i1] == 0))
                PORTB = ~(~PORTB | Pin);
            else
            {
                if (++PWM_count[i1] > PWM_MaxStufen)
                    PWM_count[i1] = 0;
    
                if (PWM_count[i1] < PWM_level[i1])
                    PORTB = (PORTB | Pin);
                else
                    PORTB = ~(~PORTB | Pin);
            }
        }
    }
    
    
    int main (void)
    {
        DDRB =  0b11111111;
        PORTB = 0b00000000;
    
        TCCR0A = (1<<WGM01);
        TCCR0B = (1<<CS00);
        OCR0A = PWM_OCR;
        TIMSK = (1<<OCIE0A);
    
        sei ();
    
        bool DimmUp[4] = {TRUE, TRUE, TRUE, TRUE};
        PWM_level[0] = 0;
        PWM_level[1] = 30;
        PWM_level[2] = 60;
        PWM_level[3] = 90;
    
        while (1)
        {
            U8 i1;
            for (i1 = 0; i1 < 4; i1++)
            {
                if (DimmUp[i1])
                {
                    if (++PWM_level[i1] == PWM_MaxStufen)
                        DimmUp[i1] = FALSE;
                }
                else
                {
                    if (--PWM_level[i1] == 5)
                        DimmUp[i1] = TRUE;
                }
            }        
            _delay_us (50);
        }
    
        return (0);
    }
    Die PWM-Ausgabe für die 4 Spots erledige ich "manuell" im Timer0. Ich habe erst mal 100 Helligkeitsstufen mit einer Wiederholfrequenz von 100 Hz gewählt. Im Hauptprogramm werden die 4 Helligkeitswerte in einer Endlosschleife einfach hoch und runter gezählt. Als Ausgansgwert habe ich die 4 Farben mit jeweils 30% Abstand zueinander initialisiert.
    Die PWM klappte mit den LEDs auf dem STK500 noch ganz gut, bei den 4 LED-Spots ist das Ergebnis aber nicht gerade berrauschend. Siehe Video:

    http://www.car-mp3.de/RNetz/RGB.zip

    Das "herunterdimmen" nachdem ich mit der Kamera von den Spots auf die Wand schwenke habe ich der Kamera zu verdanken. Maßgeblich für die Analyse ist das Bild an der Wand, nachdem sich die automatische Helligkeit der Kamera eingeregelt hat.

    Meine Meinung: Grün und Blau sind viel zu hell, dass könnte ich aber mit Maximalwerten der einzelen Farben aufeinander abstimmen.
    Wozu ich aber noch überhaupt keine Idee habe ist der viel zu geringe Helligkeitsunterschied der einzelnen Farben zwischen 5% Helligkeit und 100%. Wenn ich noch weniger als 5% nehme gehen die Spots quasi aus. 5% ist also das Minimum.

    Was meint ihr? Wie bekomme ich die Helligkeitsunterschiede besser hin? Habe ich vielleicht noch einen Fehler im Code, den ich wieder mal vor lauter Bäumen nicht sehe?

    Wie findet ihr allgemein den PWM-Code? Kann man da noch was optimieren? Die erste Abfrage in der for-Schleife ( if ((PWM_level[i1] == 0)) ) könnte man weglassen, ich möchte da aber später noch ein globales "Enable-Flag" hinzufügen, dass ich dann in dieser Abfrage mit rein-verodern möchte.

    Viele Grüße
    Andreas

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562
    Hallo Bumbum,

    die Sache, dass man zwischen 5% und 100% fast keinen Unterschied merkt, das Problem hat hier auch schon einer gehabt, und eine Erklärung und Lösung noch dazu:

    http://www.zabex.de/frames/sofabeleuchtung.html

    Er schreibt, das liegt an der Empfindlichkeit des menschlichen Auges, und ist deshalb auf 16 - Bit PWM umgestiegen, und hat Helligkeitstabellen implementiert, so dass es für das Auge nach einer "Linearen" Helligkeitsänderung aussieht.

    Genaueres steht etwas weiter unten im Artikel, unter der Überschrift "Meine zweite Lösung".
    Ich kenne mich damit auch nicht weiter aus, aber ich habe den Artikel vor einiger Zeit gelesen und mir gedacht, das könnte dir helfen
    Auch sonst für dich villeicht ein interessantes Projekt, weil Programmcode dabei und Schaltplan und so weiter.

    Mfg Thegon
    Geändert von Thegon (26.02.2013 um 19:30 Uhr)

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Hallo Thegon,

    vielen Dank für den Link. Das scheint eine plausible Erklärung zu sein.
    Da werde ich jetzt erst mal einen anderen Quarz an meinen Tiny löten, damit ich die 16 Bit PWM überhaupt schaffe. Ich werde berichten.

    Viele Grüße
    Andreas

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Thegon Beitrag anzeigen
    Er schreibt, das liegt an der Empfindlichkeit des menschlichen Auges, und ist deshalb auf 16 - Bit PWM umgestiegen
    Das ist wohl so, aber so groß ist der Effekt nicht. Ich hab auch schon mit 50 Stufen eine gut erkennbare Helligkeitsabstufung bekommen. So zwischen 70% und 100% war es nicht mehr so doll. Mit 100 Stufen und drei Farben bekommt man einen prima Regenbogen hin. Und 100 Stufen sind weniger als 7 Bit PWM.

    Ich denke, es liegt an deinen LED Strahlern. Wenn sie als Halogen-Ersatz gedacht sind, haben sie einen Gleichrichter am Eingang. Sollte danach ein Ladeelko eingebaut sein, arbeitet der gegen deine PWM.

    Schalte doch mal einen Strahler ans Labornetzteil, und versuche damit die Helligkeit zu steuern, so von 8V bis zu deinen 17V. Wobei bei 17V DC eigentlich die LEDs abbrennen müßten, wenn der LED-Strom mit einfachen Vorwiderständen eingestellt wird. Schau dir dabei auch den Strom an.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Hallo,

    ich habe heute weiter experimentiert. Ich habe die PWM mal auf echte 7-Bit "aufgebohrt", also in Stufen von 0 bis 127. Diese 127 Stufen habe ich in 10 Helligkeitslevel eingeteilt wie im Link von Thegons empfohlenen mit einer Abstufung mit Potenz 2,2. Und es wurde tatsächlich besser. Aber es ist noch weit von dem entfernt was ich mir vorgestellt habe.

    Ich habe also, wie von euch vorgeschlagen, die LED-Strahler mal direkt ans Labornetzteil gehängt und an der Spannung gedreht um zu sehen ob die Strahler überhaupt verschiedene Helligkeiten können. Die Spannung habe ich von ca. 8 Volt auf 15V rauf und runter gedreht. Hier das Ergebnis:

    http://www.car-mp3.de/RNetz/RGB_rot.zip

    Es ist also nicht unmöglich die Lampen zu dimmen. Jetzt muss ich es nur noch schaffen das mit meiner PWM im Atmel hinzubekommen. Meint ihr der Gleichrichter, oder die unbekannte Schaltung in der Halogen-Birne pfuscht mir da ins Werk der PWM? Würdet ihr eine Glättung (z.B. mit einem Kondensator) probieren?
    Auf jeden Fall werde ich jetzt mal mehr Stufen ausprobieren. Ich denke ich fange mal mit 10 Bit PWM an und schaue was ich damit hinbekomme.
    Den restlichen Feierabend habe ich heute damit verbracht meinen Quarz auf 8 MHz zu erhöhen (schneller hatte ich nicht da) um die 10-Bit-PWM auch mit entsprechender Frequenz erzeugen zu können. Und ich habe den Tiny2313 auf einen Tiny4313 getauscht, da mir sonst der Flash für die 10 Bit-PWM-Stufen nicht gereicht hätte. Jetzt reichts erst mal. Morgen gehts weiter.

    Viele Grüße
    Andreas

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Hallo mal wieder,

    ich wollte noch einen kleinen Bericht abliefern. Kurz vor dem Umstellen auf die 10-Bit-PWM habe ich noch einen Fehler in der Formal bemerkt. Nach dessen Korrektur ließen sich die LEDs auch mit der PWM dimmen. Lediglich wie im Link beschrieben ab ca. 70% Helligkeit ist nicht mehr viel Unterschied zu sehen.
    Die 10 Stufen, die mit der 7 Bit PWM möglich sind funktionieren zwar, sind aber ganz schön grob. Mit 20 Stufen, die eine 10-Bit PWM erforrdern, ist es schön "smooth". Ich werde noch mit Zwischenschritten experimentieren, bin aber erst zufrieden. (Mit der Funktion zumindest)

    Womit ich nicht zufrieden bin ist die Leuchtstärke. Die 1W-LED-Strahler sind einfach viel zu schwach. Auf bis zu 4W könnte ich noch problemlos mit dem gleichen Trafo hoch gehen. Aber ich finde keine passenden Strahler. Das "größte" was ich gefunden habe sind 2W Strahler. Dummerweise finde ich zu meinen jetztigen 1W-Funzeln keine Angabe über die Lumen um mal etwas vergleichen zu können.

    Viele Grüße
    Andreas

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Hallo Andreas,
    ich würde die Widerstände noch etwas ändern. Das Gate vom Mosfet kann sich zwar sehr schnell entladen über den Transistor, aber das Aufladen über den 10K dauert und macht die Flanke krum.
    Ich hab das mal simuliert. Siehe Anhang. Ebeso würde ich den Basisvorwiderstand veringern. Ich hab beide mal auf 1K gesetzt.
    Das ändert aber vermutlich nichts an dem Verhalten der Schaltung oder Lichtausbeute Es hatte mich nur grad interessiert und so habe ich das mal simuliert,
    mit 10K und 1K am Gate des Mosfet.
    mfg. Siro
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Gate_10K.jpg   Gate_1K.jpg  

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Hallo Siro,

    danke für den Hinweis und die Arbeit mit der Simulation. Da habe ich tatsächlich noch gar nicht dran gedacht. Ich habe den Schaltungsteil 1:1 aus einem anderen Projekt kopiert. Dort war es aber eine Batterieanwendung und der IRF wurde nur als Schalter "Mißbraucht". Da musste er alle paar Minuten mal eine Last einschalten. Geschwindigkeit war da nicht nötig, sondern stromsparende Schaltung. Die kommt hier natürlich nicht so gut. Ich werde die Widerstände bei Gelegenheit tauschen, auch wenn es tatsächlich nicht sooo schlimm aussieht in der Simu.

    Viele Grüße
    Andreas

Ähnliche Themen

  1. Halogen LED-Spots per PWM ansteuern
    Von Bumbum im Forum Elektronik
    Antworten: 0
    Letzter Beitrag: 17.02.2013, 13:06
  2. RGB LED PWM mit Timer2
    Von mameise im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 09.02.2011, 23:51
  3. RGB-LED, PWM ohne Programmieren :)
    Von jcrypter im Forum Elektronik
    Antworten: 8
    Letzter Beitrag: 16.03.2010, 13:03
  4. SMD RGB LED´s mit PWM; ATmega168 / Probleme mit dem EEprom
    Von Klingon77 im Forum Software, Algorithmen und KI
    Antworten: 78
    Letzter Beitrag: 26.05.2009, 19:54
  5. RGB Led PWM Benutzerfreundlich Ansteuern
    Von Lenox im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 18.02.2007, 22:39

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus