- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 24

Thema: RGB-Farbregelung mit 3 LEDs

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Anzeige

    Powerstation Test
    Also ich hab mal mit Paint und exel gespielt und das kam raus:
    Sättigung 240
    Helligkeit 128
    Hier der Rotanteil wie man sieht keine Kurve, mit einigen if bedingungen sollte man die Übergägne so hinbekommen. Unten der Farbverlauf.

    MFg Moritz
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken rot.gif   farbe.gif  

  2. #12
    JanB
    Gast
    Hallo,
    Guck mal hier rein:

    http://www.led-tech.de/produkt-pdf/rainbow.pdf

    Dort findest du ein Datenblatt zu einer
    sogenannten Rainbow-Fading-LED.
    Das ist eine LED, die selbständig nacheinander
    alle Farben des Spektrums "durchläuft".
    In dem Datenblatt sind an Schluß die Timingcharts
    für die drei R, G und B LEDS angegeben.
    Timingchart 2 oder 3 müsste das richtige für dich sein sein.
    Diese Effkt-LED sieht übrigens Suuuper aus.
    Hab ich an den Rotorblatt-Enden meines Modellhubschraubers,
    für Nachtflug.

    Gruß Jan

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    09.10.2004
    Beiträge
    54
    Danke erst einmal für die Zahlreichen Antworten.

    Also das mit der Farbmischung ist soweit erst mal klar für mich. Mein Problem ist jetzt noch - wie bekomme ich 3 PWMs in einem Timer unter?

    Ich hab das probieren jetzt garade aufgegeben. Oder muss ich da mehrere Timer nehmen. Soweit ich weiß kann ich z.B. nur immer einen Timer0 nehmen?
    Das mit der Kurvenberechnung hab ich jetzt nicht so recht verstanden, könnte mir da evtl. jemand ein Beispiel geben.
    Wie schon gesagt, mit zwei LEDs habe ich die Regelung hinbekommen, abder die dritte will da nicht so richtig mitmachen.

    Grüße und danke
    Enrico

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

    ich habe mir jetzt mal die Mühe gamacht und alle 255 Werte für das komplatte Farbspecktrum in eine Excel-Liste mit Diagramm zu fassen.
    Die Datei findet ihr im Anhang. Also so müsste das im Endeffekt aussehen, leider bin ich mir nicht im klaren darüber we ich das mit einem Timer realisieren soll?

    Die 3 PWMs habe ich jetzt übrigens hinbekommen. Hier mal mein jetziger Code:

    $regfile = "m8def.dat"
    $crystal = 3686400

    On Timer0 Ontimer0
    Dim Led1 As Byte
    Dim Led2 As Byte
    Dim Led3 As Byte

    Ddrc = &B00000000
    Admux = &B01100000
    Adcsr = &B11101111

    Sreg.7 = 1

    Config Pinb.1 = Output
    Config Pinb.2 = Output

    Tccr0 = &B00000010
    Timsk.toie0 = 1

    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
    Config Timer2 = Pwm , Compare = Clear , Prescale = 1

    Do
    Compare1a = Led1
    Compare1b = Led2
    Ocr2 = Led3
    Loop

    Ontimer0:
    Led1 = Adch
    Led2 = Adch
    Led3 = Not Adch
    Return
    End

    Das funktioniert soweit erst einmal.
    Wenn jetzt noch jemand eine Idee hat - immer her damit

    Grüße und danke
    Enrico
    Angehängte Dateien Angehängte Dateien
    • Dateityp: xls rgb.xls (26,0 KB, 16x aufgerufen)

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Aber du kannst den PWm auch selber schreiben, du nimmst dir einen Timer der relativ schnell nen Interrupt auslöst, im Interrupt zählst du in einer Variablen (i) bei jedem interrupt immer +1, von 0 bis 255, nach dem Wert für die entsprechende LED wird die Led dann ausgeschaltet, bei i = 0 werden die die Leds eingeschaltet. So hast du einen PWM und den Vorteil, dass du quasi beliebig viele PWMs aus einem Timer generieren kannst.

    MFG Moritz

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

    kannst du mir dafür ein Beispiel geben.
    Mein Verständnisproblem liegt momentan darin, dass ich nur einen Eingang (Potentiometer) habe, welcher Werte zwischen 0 und 255 annehmen kann. Wenn ich jetzt 3 verschiedene PWMs habe müssen diese wie im Diagram dargestellt geregelt werden.
    Für mich heist das, dass sich 6 verschiedene Kombinationen ergeben (240 / 40 = 6), eigentlich sind es 8, aber alle LEDs an und alle LEDs aus will ich jetzt mal weglassen.
    Ich habe also für jede Kombination 40 Schritte (vom Potentiometer) mit denen ich das PWM-Signal von 0 - 240 in 6er-Schritten regeln muss.

    Ich hatte mir da folgenden Code gedacht:
    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400
    
    On Timer0 Ontimer0
    Dim Led1 As Byte
    Dim Led2 As Byte
    Dim Led3 As Byte
    
    Dim D1 As Byte
    Dim D2 As Byte
    Dim D3 As Byte
    Dim D4 As Byte
    Dim D5 As Byte
    Dim D6 As Byte
    Dim D2_1 As Byte
    Dim D4_1 As Byte
    Dim D6_1 As Byte
    
    Ddrc = &B00000000
    Admux = &B01100000
    Adcsr = &B11101111
    
    Sreg.7 = 1
    
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    
    Tccr0 = &B00000010
    Timsk.toie0 = 1
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
    Config Timer2 = Pwm , Compare = Clear , Prescale = 1
    
    Do
     Compare1a = Led1
     Compare1b = Led2
     Ocr2 = Led3
    Loop
    
    D1 = Adch
    D2_1 = Adch - 40
    D2 = Not D2_1
    D3 = Adch - 80
    D4_1 = Adch - 120
    D4 = Not D4_1
    D5 = Adch - 160
    D6_1 = Adch - 200
    D6 = Not D6_1
    
    Ontimer0:
      If Adch <= 40 Then
       Led1 = 240
       Led2 = D1 * 6
       Led3 = 0
      Else
      If Adch <= 80 Then
       Led1 = D2 * 6
       Led2 = 240
       Led3 = 0
      Else
      If Adch <= 120 Then
       Led1 = 0
       Led2 = 240
       Led3 = D3 * 6
      Else
      If Adch <= 160 Then
       Led1 = 0
       Led2 = D4 * 6
       Led3 = 0
      Else
      If Adch <= 200 Then
       Led1 = D5 * 6
       Led2 = 0
       Led3 = 240
      Else
      If Adch <= 240 Then
       Led1 = 240
       Led2 = 0
       Led3 = D6 * 6
      Else
      End If
      End If
      End If
      End If
      End If
      End If
    Return
    
    End
    Leider funktioniert das so nicht, die LEDs gehen so mehr oder minder schlagartig an und aus, wenn ich am Poti drehe.

    Also für weitere Hilfe bin ich sehr dankbar.

    Grüße
    Enrico

  7. #17
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    HM... also komeltt schreiben kann ichs dir wohl nicht, aber mal einen Anfang machen. Leider hab ich hier kein Bascom, es könnte also sein, das ein par Fehler drin sind, oder Dinge die leicht umgeschrieben werden können:

    Code:
    Config Timer0 = Timer , Prescale = 8 
    On Timer0 Timer_irq 
    Const Timervorgabe = 100 'Je nachdem wie hoch die PWM rate sein soll, musst du hier andere Werte setzen
    Enable Timer0 
    Enable Interrupts 
    
    Dim i as byte
    
    Do
    Led1
    Led2
    Led3
    'Hier werden die Werte für den PWM berechnet, wenn du nur Wert von 0 bis 240 hast, musst du unten einfach nur sagen dass i ab 240 wieder auf null geht.
    Loop
    end
    
    Timer_irq
    Timer0 = Timervorgabe 
    i++
    If i >= 255 Then
    i = 0 
    end if
    
    if i > Led1 then portx = 0 'Portx muss vorher definiert werden
    if i <= Led1 then portx = 1
    
    if i > Led2 then portx = 0
    if i <= Led2 then portx = 1
    
    if i > Led3 then portx = 0
    if i <= Led3 then portx = 1
    
    Return
    So sollte es gehen, der Vorteil, du musst halt nicht zwangsläufig bis 255 gehen, da das Farbchema ja nur bis 240 gehen, kannst du das besser anpassen. Außerdem brauchst du nur einen Timer.

    Wenn du eine PWM-Rate von 100Hz haben willst, müsstest du 8Mhz und Prescale 8 bei Timer0, außerdem einem PWM von 255 (mal gard nicht nicht 240) dann muss die Timervorgabe:

    8000000/8/255=3906,25
    Wenn der Timer jetzt bei 39 auslöst, hast du 100 Hz, Timervorgabe dann 256-39=217 sein.

    MFG Moritz

  8. #18
    Benutzer Stammmitglied
    Registriert seit
    09.10.2004
    Beiträge
    54
    Hallo nochmal,

    ich hab jetzt endlich die Lösung:

    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400
    $baud = 9600
    
    Ddrd = &B11100000
    Admux = &B01100000
    Adcsr = &B11101111
    
    Config Timer0 = Timer , Prescale = 8
    On Timer0 Timer_irq
    Const Timervorgabe = 237
    Enable Timer0
    Enable Interrupts
    
    Dim I As Byte
    Dim Led1 As Byte
    Dim Led2 As Byte
    Dim Led3 As Byte
    
    Dim D1 As Byte
    Dim D2 As Byte
    Dim D3 As Byte
    Dim D4 As Byte
    Dim D5 As Byte
    Dim D6 As Byte
    Dim D2_1 As Byte
    Dim D4_1 As Byte
    Dim D6_1 As Byte
    
    Do
    D1 = Adch
    D2_1 = Adch - 40
    D2 = Not D2_1
    D3 = Adch - 80
    D4_1 = Adch - 120
    D4 = Not D4_1
    D5 = Adch - 160
    D6_1 = Adch - 200
    D6 = Not D6_1
    
      If Adch <= 40 Then
       Led1 = 240
       Led2 = D1 * 6
       Led3 = 0
      Else
      If Adch <= 80 Then
       Led1 = D2 * 6
       Led2 = 240
       Led3 = 0
      Else
      If Adch <= 120 Then
       Led1 = 0
       Led2 = 240
       Led3 = D3 * 6
      Else
      If Adch <= 160 Then
       Led1 = 0
       Led2 = D4 * 6
       Led3 = 240
      Else
      If Adch <= 200 Then
       Led1 = D5 * 6
       Led2 = 0
       Led3 = 240
      Else
      If Adch <= 240 Then
       Led1 = 240
       Led2 = 0
       Led3 = D6 * 6
      Else
      End If
      End If
      End If
      End If
      End If
      End If
    Loop
    
    Timer_irq:
     Timer0 = Timervorgabe
     I = I + 1
    
     If I = 255 Then
      I = 0
     End If
    
     If I > Led1 Then Portd.5 = 0
     If I <= Led1 Then Portd.5 = 1
    
     If I > Led2 Then Portd.6 = 0
     If I <= Led2 Then Portd.6 = 1
    
     If I > Led3 Then Portd.7 = 0
     If I <= Led3 Then Portd.7 = 1
    
     Udr = Adch
    Return
    
    End
    Ob das nun die Endlösung ist wage ich mal zu bezweifeln, aber es funktioniert so wie ich es will und auch so wie es im Diagramm dargestellt ist.

    Wer jetzt noch Verbesserungsschläge hat - immer her damit.
    Ich habe z.B. festgestellt, dass die LEDs nie ganz aus sind, sie leuchten auch bei eingestelltem 0-Wert noch ganz schwach (kaum zu sehen). Woran könnte das liegen?

    Grüße und danke für eure Hilfe
    Enrico

  9. #19
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Also schön, wenn es so klappt, folgendes könntest du noch änder (minimal):

    Ich hab dir ja geschriben:

    If I > Led1 Then Portd.5 = 0
    If I <= Led1 Then Portd.5 = 1
    Sinniger wäre:

    If I >= Led1 Then Portd.5 = 0
    If I < Led1 Then Portd.5 = 1

    da sonst auch bei 0, da =0 immer ein Verhältniss von 1 zu 255 entsteht, auch bei Ledx = 0, aber ich glaube kaum dass das was ausmacht.

    MFG Moritz

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

    hattest recht, das hat auch was gebracht, jetzt sind die LEDs wirklich aus wenn sie auf 0 stehen. Nur wenn ADCH den Wert 255 hat (also wenn das Poti voll auf ist), leuchtet die 3. LED noch ganz leicht. Könnte das der Restwert von 240 auf 255 sein?

    Grüße
    Enrico

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests