uC-Code fürs faden

Gast #1407913
Lesenswert?

hi zusammen,

ich hab mir mal so ne RGB-Led-ansteuerung gebastelt mit einem PIC18F2520 
und einem ULN2003. wird vom pic aus ein "high" an einen der eingänge des 
ULN2003 angelegt, so schaltet der den entsprechenden ausgang auf gnd, 
und an den ausgängen sin die leds angeschlossen.

so, alles funktioniert wie es soll. ich kann problemlos die einzelnen 
farben ansteuern etc.

nun zu meiner frage: wie realisiere ich am besten/einfachsten den code 
damit ich ein schönes faden hinbekomme? ich hab da diverses mit PWM 
gelesen, aber so wirklich ahnung wie das geht hab ich nicht^^ ich bin 
eigentlich noch ein noob aber ich hoff ihr könnt mir helfen :)

ps: ich weiss nich ob ich noch was vergessen habe, sonst fragt einfach 
:)
#1407920
Lesenswert?

PWM ist einfach ein Rechtecksignal das, wenn du es glättest (dh der 
Durchschnittswert) einen Analogwert darstellt. Soll heißen bei PWM ist 
der Anteil von "An-Zeit" zu "Aus-Zeit" äquivalent zum Analogwert.
(Um eine LED zu faden brauchst du das ganze natürlich nicht glätten. das 
war nur zum Verständnis gedacht... Es reicht wenn das PWM-Signal schnell 
genug ist damits nicht flackert)

Faden funktioniert also, indem du den PWM-Wert langsam verringerst.
Ich weiß nun nicht wie das mit PWM bei den PIC controllern aussieht, 
aber da gibts bestimmt auch eine automatische Erzeugung, die sich nutzen 
lässt (dh wo du einfach nur deinen digitalwert 0...255 reinwirfst und an 
nem pin wackelt die PWM raus...)
#1408118
Lesenswert?

Hi Iain,

ich habe mir diesletzt auch eine RGB-LED an einen µC angeschlossen.
Ich habe die LED allerdings an einem Atmega32. Aber vom Prinzip musst du 
das gleiche programmieren.

Der Atmega hat zwar einen integrierten PWM-Generator (wenn man das so 
nennen kann), aber ich hab das Signal selbst ein einem Timer-Interrupt 
erzeugt.

Dabei habe ich eine 8bit Integer, die bei jedem Interruptaufruf zuerst 
einmal inkrementiere (Werte zwischen 0 und 255). Danach wird der 
Sollwert der jeweiligen Farbe mit dem aktuellen Wert der 8bit Integer 
verglichen. Ist der Sollwert kleiner, so wird der Ausgang auf GND 
gezogen (LED leuchtet), ist der Sollwert der jeweiligen Farbe größer als 
der Wert der 8bit Integer, so wird der Ausgang auf +5V gelegt (LED aus). 
Diese Vergleiche machst du für jede Farbe (Rot, Grün, Blau), und du 
kannst die einzelnen Farben dimmen.

Dann musst du zum Faden nur noch den Sollwert der Farben generieren, das 
ist aber normalerweise kein Problem.

Gruss
Matthias
Gast #1408199
Lesenswert?

Ich hab sowas (Soft-PWM mit 16 Kanaelen, 200 Hz, weisse LEDs, R8C)
mal mit 3 Software-Ebenen gebaut:

- Unterste Ebene:
  Erzeugt die PWM aus einer Tabelle mit Zeiten/Zeitdifferenzen und 
Bitmustern fuer die Ausgabeports. Beim Timer-Interrupt werden aus der 
Tabelle die Ports auf den neuen Wert gesetzt und der Timer neu 
aufgezogen, das geht sehr schnell. Die Tabelle gilt fuer einen Zyklus 
und ist ein Doppel-Puffer, d.h. ein Teil wird abgearbeitet, der andere 
erzeugt (s.u.), beim Zykluswechsel wird im Interrupt umgeschaltet. Ist 
aehnlich wie der letzte Teil im Soft-PWM Tutorial.

- Mittlere Ebene:
  Erzeugt die Tabelle fuer die Interruptroutine aus Sollwerten fuer das 
Tastverhaeltnis.

- Obere Ebene:
  Erzeugt die Sollwerte der mittleren Ebene gemaess eigenen Sollwerten 
und macht bei Aenderungen Fading (oder schaltet die Helligkeit hart um 
wenn's gewuenscht ist).

Mittlere und obere Ebene bestehen aus einzelnen Tasks, die nacheinander 
von einem einfachen Scheduler abgearbeitet werden. Das muss vor Ende des 
Zyklus fertig werden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren