-         
+ Antworten
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 24

Thema: RGB-Farbregelung mit 3 LEDs

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.10.2004
    Beiträge
    54

    RGB-Farbregelung mit 3 LEDs

    Hallo,

    ich habe vor mir eine RGB-Farbsteuerung zu bauen. Diese will ich mit einem µC von AVR realisieren. Ich hatte mir das vorerst so gedacht, dass ich ein Potentiometer habe und 3 LEDs. Wenn ich jetzt am Poti drehe sollen die einzelnen LEDs mittels PWM angesteuert werden, aber alle mit einer anderen Pulsweite - so dass ich am Ende das gesamte Farbspecktrum durchlaufen kann (theoretisch!).

    Ich habe das ganze bis jetzt nur mit 2 LEDs hinbekommen, leider fällt mir nichts mehr ein, wie ich da noch eine dritte reinbekommen soll. Hier ist mal mein bisheriger Code in Bascom:

    Code:
    $regfile = "m8def.dat"                                   
    $crystal = 3686400                                         
    $baud = 9600                                            
    
    On Timer0 Ontimer
    On Adc Onadc
    
    Dim Helligkeit As Byte
    
    Ddrd = &B01100000
    Ddrc = &B00000000
    
    Tccr0 = &B00000100
    Timsk.toie0 = 1
    
    Admux = &B01100000
    Adcsr = &B11101111
    
    '--------------------------------
    
    Helligkeit = 255                      'Initial LED ganz hell
    Sreg.7 = 1
                                          'Interrupts global einschalten
    Do                                    'Hauptschleife
      Helligkeit = Adch                   'Neuer Helligkeitswert
    Loop
    
    '--------------------------------
    
    Ontimer:
      Portd.5 = Not Portd.5               'LED wechselnd an/aus
      Portd.6 = Not Portd.6
      If Portd.5 = 1 Then                 'Wenn LED gerade an
        Portd.6 = 0
        Timer0 = 256 - Helligkeit         'Timer zählt vorwärts!
      Else
        Portd.6 = 1                       'Wenn LED gerade aus
        Timer0 = Helligkeit               'Komplementäre Zeit
      End If
    Return
    
    Onadc:                                'ADC-Interrupt-Routine
      Udr = Adch                                              
    Return

    Für Hilfe wäre ich sehr dankbar.

    Grüße
    Enrico

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Ich hab ne wichtige Frage, wo ich gerade deinen Code sehe. Gibt es eine Möglichkeit quasi aus einem ADC einen Interrupt zu machen, der z.B. Änderungen am AD-Port meldet feststellt? Oder was meinen diese drei ausdrücke?
    On Adc Onadc
    Admux = &B01100000
    Adcsr = &B11101111
    Leider ist mir der AD unter Bascom nciht ganz geläufig, noch nicht

    Nun zu deiner Frage, wie soll der Farbverlauf denn aussehen, du müsstest vermutlich eine funktion erstellen, die dir sagt, wie hell du die entsprechenden Leds schalten sollst. Oder ist dein Problem quasi 3 PWMs zu erzeugen?
    Das kann man wie folgt lösen, du verwendest einen Timer mit möglichst niedrigem Prescaler, z.B. 8 und lässt den Timer relativ schnell überlaufen, so das du eine hohe Frequenz hast.
    In der Interrupt routine machst du 255 steps, eine beliebige Variable (z.B. I) die bei jedem Aufruf der Interruptroutine incrementiert. Nun kannst du für jede Led einen Wert setzen (Byte) zu beginn I = 0 sind alle Leds ein, je nachdem welchen Wert I erreicht gehen sie dann aus, halt ein PWm, der sich beliebig erreichen lässt.

    Bei 8Mhz hättest du bei einem 8-Bit-Timer den du nach 39 Schritten überlaufen lässt:

    8000.000/8 = 100.0000
    1000.000/39 = 25641
    25641/256 = ca 100Hz, dass sollte reichen.

    Ich hoffe ich erzähle dir hier nix was du schon weißt, nach Fachlatein was du in deinem Code benutzt hast, fürchte ich, dass es nicht so ist

    MFG Moritz

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    09.10.2004
    Beiträge
    54
    Hallo,

    also die Möglichkeit gibt es.
    Mit "On Adc Onadc" wird der Interrupt deklariert, welcher sich ja am Ende meines Codes befindet.

    Admux=&B01100000: mit Bit 7 und 6 wird festgelegt, dass als Referenzspannung AVcc verwendet werden soll (ca. 5V). Bit 5 besagt, dass ich eine Genauigkeit von 8 Bit haben möchte.
    Die genuen Kombinationen findest du auch im Datenblatt in einer recht übersichtlichen Tabelle.

    Adcsr=&B11101111: mit Bit 7=1 wird der A/D-Konverter eingeschalten, mit Bit 6 wird die Konvertierung gestartet (dieses Bit bleibt auf 1, bis die Konvertierung abgeschlossen ist). Bit 5 aktiviert den Freilaufmodus, d.h. es werden permanent Konvertierungen durchgeführt. Bit 3 schaltet den Interrupt an und die untersten 3 Bit (2,1,0) legen die Taktrate fest - in diesem Fall wird sie wie folgt berechnet: Adc-Takt = AVR-Takt/128


    Das Problem ist momentan nicht 3 PWMs zu erzeugen, sondern diese abhängig von meinem externen Signal (Potentiometer) zu steuern.
    Mal ganz einfach gesagt, würde ich mir das so vorstellen:


    Eingangsspannung (Ue) von Poti
    Ausgangssignal (PWM) an LEDs

    1.
    Ue = 0V
    PWM1 = 0V
    PWM2 = 2V
    PWM3 = 4V

    2.
    Ue = 2V
    PWM1 = 2V
    PWM2 = 4V
    PWM3 = 0V

    3.
    Ue = 4V
    PWM1 = 4V
    PWM2 = 0V
    PWM3 = 2V


    Das ganze müsste linear geregelt sein. Die Werte sind erst einmal frei gedacht. Mit 3 Potentiometern wäre das ganze ja kein Problem, aber mit nur einem...
    Mir fällt leider keine Möglichkeit ein - zumal ich mich noch voll und ganz zu den Anfängern im Bereich µC zähle.

    Grüße und danke
    Enrico

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.835
    Meinst du das so, daß du mit dem Poti durch den Regenbogen durchfahren willst ? mfg robert

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    09.10.2004
    Beiträge
    54
    genau so

    Grüße und danke
    Enrico

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Also du könntest doch mit dem ACD bestimmt Werte von 0-255 erhalten, warum erreichst du eigentlich nur 4V? dann nen par Berechnungen:

    Für PWM1:
    PWM1 = ADC 'linearer Ansieg

    Für PWM2:
    if ADC <= 128 then 'Anstieg von 128 auf 256
    PWM2=ADC+128
    else
    PWM2=255-((ADC-12*2) 'Abfallen von 256 auf 0
    end if

    Für PWm 3:
    if ADC <= 128 then
    PWM3=255-(ADC*2) 'Abfallen von 256 auf 0
    else
    PWM3=ADC-128 'Ansteigen von 0 auf 128
    end if

    Damit solltest du die Übergänge hinbekommen, sie reglen halt linear deine Übergänge. Ob du damit alle Farben hinbekommst, weiß ich nicht.

    Nun eine Bitte, könntest du mir mal ein kurzes beispiel für einen AD-Interrupt an ADC(4) schreiben, und ein wenig kommentieren, damit würdest du mir enorm weiterhelfen. Danke schon mal im Voraus.

    MFG Moritz

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.835
    Oh je, ich hab' befürchtet, daß du das sagen wirst. Da sind wir eigentlich in der Fernsehtechnik wegen den einzelnen faktoren, passende Bücher hab' ich jetzt nicht zur Hand
    Im Prinzip geht's darum: jede LED sendet irgendwelche nM als Wellenlänge aus ==> Datenblatt
    Poti regelt von Rot nach blau, also nM --> nM
    Die rote LED leuchtet also voll bei AD-Wert 0 (links) und is aus bei AD 255.
    Blau genau das Gegenteil.
    Grün is irgendwo dazwischen, und zwar mußt du das Verhältnis der Wellenlängen umrechnen auf 0-255
    Grün leucht' also am stärksten bei dieser Zahl, rechts und links is weniger bis Null.
    Du kannst dir auch am PC mit irgendeinem Zeichenprogramm die Farbmischung 0-255 für jede Farbe ansehen, Ganz perfekt wär dann eine Tabelle mit je drei RGB Werten für jeden AD-Input. Zumindest kannst du mit Stichproben deine Werte überprüfen
    Ich hoff', das hilft für's Erste mfg robert

    EDIT: falls irgendwo ein Wissender hinter einer Hecke sitzt, jetzt wär der richtige Moment für den Auftritt

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    So ists nennt sich glaub ich additive Farbmischung, und wird beim Fernseher etc, verwendet, beruht halt darauf, dass das menschliche Auge nur 3 farbrezeptoren hat und auf gewisse entfernungen nicht mehr sieht, ob da jetzt eine LEd oder drei sind.

    Ein Typ zu der Farbpallete, geh mal unter Paint/Farben/Palette bearbeiten/mehr farben
    Da findest du alle Farben und die entsprechenden RGBS, alerdings natürlich alle mit verschiedenen Sättigungen etc.
    VIELE FARBEN!

    MFG Moritz

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.835
    @RCO: weise und wahr gesprochen.
    Was ich nicht sicher bin ist, ob man die Farben der LED linear mischen kann oder ob man das mit irgendwelchen Kurven umrechenen muß.
    Ich hoff halt, für einmal gucken reicht's so.
    Am besten teilt man wahrscheinlich den Regenbogen auf, sagen wir, 16 Teile, schreibt sich diese Werte aus dem Paint-Farbmischer ab und dazwischen interpoliert man halt.
    Zu dumm, daß unsere 3 Rezeptoren nicht auch EU-normgerecht auf RBG empfindlich sind, sondern auf irgendwelche anderen seltsame Werte.

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Also vermutlich könnte man noch mit irgendwelchen Kurven rechnen, wenn man nicht die Sättigung hat. man nimmt sich ein par Punkte aus dem Farchema und holt sich halt alle Roten bildet daraus eine Funktion, dass sollte machbar sein, falls die Kurve nicht zu hart ist, aber dann noch die Sättigung dareinkriegen, dass iwrd schwierig.
    Allerdings hab ich bei HTML ja mal die Farben so angegen "AABBCC" für jede Farbe FF also 256 Werte. So könnte man das für die Farben leicht angeben.
    Mit einem Poti könnte man eh nur den farbverlauf bei einer bestimmten Sättigung machen, ist ja bezogen auf das Farbchema nur eindemesional.

    Also bei Paint eine sättigung einstellen, sich nacheinander ein par Punkte x = x ; y = Farbanteil holen eine Kurve basteln und berechnen lassen. Für x sollte man dann nach mäglichkeit 255 Werte haben, damit das mit dem PWM schön passt, wenn man den aber eh selber schreibt auch kein Ding.
    x ist dann der Wert des ADCs und mit den 3 Funktionen für RGB kannst du dann y berechenen... EASY.
    Ich hoffe ihr werdet daraus schlau

    @Enrico3: Bitte hilf mir bei dem ADC-Interrupt [-o<

    MFG Moritz

+ Antworten
Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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