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 :)
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...)
Ist zwar nicht für deinen Controller, aber ich denke, den Grundgedanken kannst du übernehmen: http://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM http://www.mikrocontroller.net/articles/AVR_PWM http://www.mikrocontroller.net/articles/Soft-PWM Schöne Grüße, Kai
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
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.
vielen dank für eure hilfe! werde es mal so versuchen wie es matthias beschrieben hat :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.