Hallo zusammen, ich bin gerade dabei eine Aquarium LED Steuerung zu bauen. Eigentlich sollte es ein Weihnachtsgeschenk für meinen Vater werden, aber leider häufen sich die Fehler... Aktuell habe ich das Problem, wenn ich die 5630 LED- Stripes aufdimme und zeitgleich den WS2813b RGB- Stripe hochdimmen möchte, blitzen einzelne LED im Stripe auf!!! Es liegt scheinbar daran, dass das PWM Signal 16Bit störungen im WS2812b Stripe verursacht. Wenn die 5630- Stripes komplett an oder aus sind, also ohne PWM gibt es keine Probleme. Das Kabel hat keine Schiermung der Adern und ist schon vergossen... Kann mir vieleich jemand einen Tip geben ob ich da noch etwas machen könnte? Danke im voraus und einen lieben Gruß
Hallo, PWM-Steuerungen sind eben oft eine elende Störquelle. Gut, wenn es den Verursacher mal selber trifft. Wie wäre es den, die PWM durch eine analoge Dimmerschaltung zu ersetzen? Wenn es den unbedingt PWM sein muß, dann kann man versuchen, die Anstiegesgeschwindigkeit der Signalflanken etwas zu reduzieren, um so die Bandbreite der Abstrahlung zu verringern . Außerdem kann man die Signalübertragung zu den WS2812 mit mehr Leistung versehen (Lastwiderstände am Eingang, Terminierung der Leitungen). Manchmal sind aber auch nur fehlende oder zu schwach ausgeführte Abblock-C die Ursache für unzureichende Störfestigkeit. Gruß Öletronika
:
Bearbeitet durch User
Hast Du für die PWM einen extra Controller oder macht das auch der Controller der die WS2812b ansteuert? Kann es passieren das während der Datenübertragung zu den WS2812b ein Interrupt für die PWM auftritt und dadurch die Übertragung zumindest für eine LED aus dem Takt gerät?
Hallo und danke für die Antworten. Ich habe gestern noch ein geschirmtes Kabel als Steuerleitung für die WS2812 installiert und es war bis auf wenige störungen erfolgreich. Ich habe den Schirm von der Steuerleitung zwischen Platine und LED Stripe auf Masse gelegt. Das aufblitzen ist fast weg. Mit "Abblock-C" kann ich leider garnichts anfangen...??? Mit einem Vorwiderstand werde ich es noch ausprobieren... Bin gespannt. Gebaut habe ich die ganze Schaltung mit einem ATMEGA1284p. Da ich Anfänger bin habe ich mich vor einiger Zeit dafür entschieden den einstieg in die MicroController Technik mit Arduino zu starten. Ich verwende für den WS2811 Stripe die Fastled.h Libary und meine das sie sämtliche Interrups abschaltet? Hatte nähmlich anfänglich vor das Dimmen der 5630 via Timer Interrupt zu steuern und bin dann auch schnell auf Probleme gestossen....
ok, dann scheidet der Interrupt als Fehler aus wenn Du alles direkt im "Hauptprogramm" machst. Also während Du die Daten zu dem WS2812 Strip überträgst, läuft die PWM nicht?
Also, es soll beim aufdimmen der 5630 gleichzeitig die WS2812 mit aufdimmen um zB ein Sonnenaufgang zu simulieren... Sieht nur ziemlich blöd aus wenn ab und an einzelne LED`s hell aufblitzen...
Ja, das habe ich mir schon gedacht. Aber wie ist es programmiert? Also wie wird die PWM generiert? Per Timer (ohne Interrupt)? Mich interessiert nur, ob die PWM tatsächlich schaltet während Du Daten an die WS2812 überträgst. Wieviele LEDs sind es denn jeweils in den Strips ca.? Da können schon ganz schöne Strom/Spannungsspitzen entstehen. Hast Du die Versorgungsleitung vom Netzteil zu dem Strip den Du mit PWM dimmst getrennt von der Leitung zwischen Netzteil und Controller gemacht?
Ich habe den Timer1 so konfiguriert TCCR1A = (1 << COM1A1) | (1 << WGM11); TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); ICR1 = 65535; OCR1A = 0; Die 5630 schalten den Ausgang auf den nächst höheren Wert und anschließend schalten die WS2812 in einer for Schleife auf den nächst höheren Wert. Das geschieht dan abwechselnt bis zur eingestellten Helligkeit. WS2812 habe ich 51 an der Zahl. Wobei auf der Platine noch ein WS2811 in DIP Bauweise für eine Status LED verbaut ist und von deren Output gesteuert wird. Jeweils 100 Ohm befinden sich am WS2811 DIP IN und OUT.
Achso... Angeschlossen ist alles an einem 12v Schaltnetzteil. (5630 12V über IRLZ34N) Die 5V für den Controller und Peripherie wird über einen LM7805 und die 5V für die Stripes werden über ein LM2576-5.0 realisiert...
Hmmm... ok, wenn Du alles mit einem 12V Netzteil speist und schon getrennte Spannungsregler für Logik und WS2812 Strip hast, sollte ja eigentlich alles OK sein. Eine Lösung könnte evtl. sein, die 5630 PWM für die Zeit, wo Du die Daten zu den WS2812B überträgst, abzuschalten. Das sollte ja solange nicht sein (im einstelligen Millsekundenbereich).
Habe Dein Ratschlag befolgt. Leider ist die Zeit zum beschreiben der WS2812 so lange das das blinken der 5630 LED`s sehr deitlich sichtbar ist. Aber das blitzen war weg :-) Jetzt bin ich natürlich stutzig geworden ob ich die Fuses richtig gesetzt habe? Hier mal ein Auszug der Einstellungen mighty.name=Original Mighty 1284p 16MHz #####mighty.upload.protocol=stk500v1 mighty.upload.maximum_size=129024 #####mighty.upload.speed=57600 mighty.bootloader.low_fuses=0xf7 mighty.bootloader.high_fuses=0xdc mighty.bootloader.extended_fuses=0xfd #####mighty.bootloader.path=standard #####mighty.bootloader.file=ATmegaBOOT_1284P.hex #####mighty.bootloader.unlock_bits=0x3F #####mighty.bootloader.lock_bits=0x0F mighty.build.mcu=atmega1284p mighty.build.f_cpu=16000000L mighty.build.core=arduino:arduino #####mighty.build.core=standard mighty.build.variant=standard Außerdem ist mir aufgefallen, dass das blitzen der LED`s nur dann auftaucht, wenn ich in einem Zeitraum von 1 bis 5 Minuten dimme. Wenn ich den Timer auf 10 min bis 60 min stelle dann blitzt es nicht mehr. Wenn es aber so langsam dimmt, ist deutlich zu erkennen dass der Stripe jede zeite LED ansteuert und beim nächsten ansteuern dann die anderen LED`S. Das wechselt sich dann so lange ab bis die LED`s wahrscheinlich so hell sind das es nicht mehr auffällt?
Die Zeit zum Beschreiben der WS2812 berechnet sich ja so: Pro LED sind 24 Bit zu übertragen. Die Bitrate beträgt ca. 800 kbit/s. D.h. für die Übertragung der Daten wird eigentlich nur (1/800000) 51 24 = 1,5ms (!) benötigt. Kann man das wirklich sehen wenn Du für diese Zeit die 5630 LEDs ausschaltest? Was meinst Du damit dass nur jede 2. LED angesteuert wird? Ich dachte Du hast den 5630er Strip über EINEN Fet angesteuert der seinerseits durch den Timer 1 vom ATmega seine PWM erhält?
1 | TCCR1A = (1 << COM1A1) | (1 << WGM11); |
2 | TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); |
3 | ICR1 = 65535; |
4 | OCR1A = 0; |
Das sieht soweit OK aus. D.h. Du machst eine 16-Bit PWM mit dem Takt der CPU (Kein Prescaler). Hast Du das so gemacht, dass Du den Timer angehalten hast während Du die Daten zu den WS2812 übertragen hast oder hast Du ihn zurückgesetzt irgendwie? Anhalten kannst Du ja einfach in dem Du
1 | TCCR1B &= ~(1<<CS10); |
machst. Und fortsetzen entsprechend mit
1 | TCCR1B |= 1<<CS10; |
Du musst die Daten an die WS2812 ja nur übertragen wenn Du eine Änderung hast. Hast Du den ATmega mit einem externen Quarz(oszillator) getaktet? Der Interne Generator macht ja nur 8MHz. Ansonsten wundert mich echt, wie die PWM in die Datenübertragung einkoppeln kann, zumal hinter jedem WS2812 Pixel das Signal ja aufgefrischt wird. Vlt. nochmal an den Anfang des WS2812 Streifens in die Versorgungsspannung einen Elko mit 4,7µF oder mehr setzen? An jeder LED sollte ja sowieso ein Abblockkondensator im Streifen verarbeitet sein.
Also mit jeder zweiten LED im Stripe meinte ich den WS2812 Strip... Jetzt habe ich allerdings nochmal die Libary Adafruit_NeoPixel ausprobiertm, mit selbigen blitzen. Aber diese Libary schaltet jetzt zumindest alle 51 WS2812 gleich. Und nicht nur jede zweite im wechsel. Aus und wieder eingeschaltet habe ich die PWM Stripe`s mit digitalWrite LOW und anschießend wieder HIGH. Das blitzen war weg. Nur die Zeit während die 5630 ausgegangen sind war so ca 100 - 200 ms. Werde es aber gleich mal mit TCCR1B &= ~(1<<CS10); TCCR1B |= 1<<CS10; ausprobieren. Wie gesagt bin Anfänger. Das die 5630 24Bit benötigen und mit 800kHz laufen, wusste ich. Deshalb habe ich mich ja auch über die 100 - 200 ms gewundert?
Das die WS2812 24Bit benötigen und mit 800kHz laufen, wusste ich. Deshalb habe ich mich ja auch über die 100 - 200 ms gewundert?
Ja, das wundert mich auch. Sagmal kann es sein, dass der Controller nicht mit der richtigen Frequenz läuft? (allerdings würden dann die WS2812 eigentlich garnicht funktionieren). Aber nochmal die Frage: Was für ein (Arduino?) Board verwendest Du denn? Welchen Takt verwendest Du für die CPU? Also den internen Taktgenerator (8 MHz) oder den externen mit einem 16 MHz Quarzoszillator? Das Senden der Daten an die WS2812 darf niemals 100-200ms betragen, das ist viel zu lang.
Ich habe einen ATMEGA 1284p mit externen 16MHz Quarz. Ich habe dazu im Internet die Einstellung mighty-1284p-master für Arduino gefunden und versuch die Fuses anzupassen. Einstellung wie folgt mighty.name=Original Mighty 1284p 16MHz #####mighty.upload.protocol=stk500v1 mighty.upload.maximum_size=129024 #####mighty.upload.speed=57600 mighty.bootloader.low_fuses=0xf7 mighty.bootloader.high_fuses=0xdc mighty.bootloader.extended_fuses=0xfd #####mighty.bootloader.path=standard #####mighty.bootloader.file=ATmegaBOOT_1284P.hex #####mighty.bootloader.unlock_bits=0x3F #####mighty.bootloader.lock_bits=0x0F mighty.build.mcu=atmega1284p mighty.build.f_cpu=16000000L mighty.build.core=arduino:arduino #####mighty.build.core=standard mighty.build.variant=standard Ich benutze die Arduino IDE 1.0.5 r2 und den ISP Programmer AVRisp MkII. Wie gesagt befinde ich mich in der Lernphase, habe meinen Vater aber eine funktionierende Aquarium Licht Steuerung versprochen... Jetzt bereue ich`s :-) Getaktet ist der 1284p meines wissens nach auf 16MHz. Denke sonst würde die Libary für die WS2812 garnicht funktionieren...???
Habe es jetzt mit TCCR1B &= ~(1<<CS10); TCCR1B |= 1<<CS10; versucht. Gleiche Verhalten wie digitalWrite->Low und analogWrite->Hell... Schade... Wünsche allen noch ein frohes Fest
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.