Forum: Analoge Elektronik und Schaltungstechnik WS2812b und LED-Stripe 5630 im PWM Betrieb


von Jörg S. (trainer1081)


Lesenswert?

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ß

von U. M. (oeletronika)


Lesenswert?

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
von Markus M. (adrock)


Lesenswert?

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?

von Jörg S. (trainer1081)


Lesenswert?

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....

von Markus M. (adrock)


Lesenswert?

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?

von Jörg S. (trainer1081)


Lesenswert?

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...

von Markus M. (adrock)


Lesenswert?

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?

von Jörg S. (trainer1081)


Lesenswert?

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.

von Jörg S. (trainer1081)


Lesenswert?

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...

von Markus M. (adrock)


Lesenswert?

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).

von Jörg S. (trainer1081)


Lesenswert?

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?

von Markus M. (adrock)


Lesenswert?

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.

von Jörg S. (trainer1081)


Lesenswert?

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?

von Jörg S. (trainer1081)


Lesenswert?

Das die WS2812 24Bit benötigen und mit 800kHz laufen, wusste ich. 
Deshalb
habe ich mich ja auch über die 100 - 200 ms gewundert?

von Markus M. (adrock)


Lesenswert?

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.

von Jörg S. (trainer1081)


Lesenswert?

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...???

von Jörg S. (trainer1081)


Lesenswert?

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
Noch kein Account? Hier anmelden.