Forum: Mikrocontroller und Digitale Elektronik Arduino/Teensy: LedPWM-Driver WS2803 Problem


von David S. (elektro-david)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich bin am verzweifeln und durchsuche das gesamte Internet nach einer 
Lösung :P

Es geht um den WS2803 IC als PWM Led Driver.
Kurzer Überblick:
-2x14Pol DIP IC,
-schafft 18 x 8Bit PWM OUTPUT.
-Der Ausgangsstrom wird noch über einen widerstand am Iref Pin 
eingestellt.
-wird über 2 Wirres gesteuert: CLK & DATA.

-Das funktioniert so: sobald der Clock-Pin mehr als 500 us LOW war, wird 
die interne IC-Logik resetet und dann mit Steigender Taktflanke auf 144 
Pulse (18x8Bit!) gewartet. Dann werden die Outputs gelatched und data 
und clock auf die "daisyChain"-ausgänge des ws2803 gesetzt.

DAS ist alles!!! Zumindest meiner Meinung nach ;) also recht simpel.
Hier das Datenblatt:

http://www.noodlehed.com/ebay/datasheets/WS2803.pdf

(falls ich mich täusche).


Nun ich habe ein Bild angehängt das meine Schaltung zeigt.
Doch diese müsste eigentlich stimmen.

Hier nun mein (ARDUINO-)Code:
1
const int clock = 25;
2
const int data = 24;
3
4
byte led[18]={ 0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x4A};
5
6
void setup(){
7
  pinMode(clock,OUTPUT);
8
  pinMode(data,OUTPUT);
9
}
10
11
void loop(){
12
13
  digitalWrite(clock,LOW);
14
  delayMicroseconds(500);
15
16
  for (int j=0;j<18;j++){
17
    for (int i=0;i<8;i++){
18
      digitalWrite(clock,LOW);                                  //CLK - 0
19
20
      if ((led[j]>>i)&1)digitalWrite(data,HIGH);         //DATA - 1
21
      else digitalWrite(data,LOW);                            //Oder  - 0
22
23
      digitalWrite(clock,HIGH);                                 //CLK - 1
24
    }
25
  }
26
27
}

So ich kann einfach nirgends einen Fehler finden, ich habe das ganze 
bereits in 1000 Variationen ausprobiert.
zbsp data nur high lassen, mehr us verzögern... etc
alles Denkbare.

Ich habe auch alle ausgänge durchgemessen. es tut sich rein NICHTS...

ich verstehe das nicht ist mein chip kaputt??
hat jemand eine Idee???
ich habe ein großes Projekt vor und der ws2803 wäre I-d-e-a-l für meine 
LEDs ich will keinen TLC5940 ausprobieren müssen...

Vielen Dank für jede Idee / Hilfe!!

David

von Joachim .. (joachim_01)


Lesenswert?

5.3 MEGABYTE?
Ey, du Volltrottel. Hier sind Leute mit'm Smartphone und Prepaid-Karte 
unterwegs. Weist du, was du denen antust?

von David S. (elektro-david)


Angehängte Dateien:

Lesenswert?

Oops, ich volltrottel!
hier die smartphone-verison!

von Joachim .. (joachim_01)


Lesenswert?

So. Nachdem das mit der Bildgröße geklärt ist, können wir anfangen.

Prüf das mal Schritt für Schritt.

Haste mal geschaut ob an deinen beiden Clk- und Data-Leitungen die 
Signale kommen? Kannst ja mal ne LED dranhängen und das ganze endlos 
laufen lassen, dann muß auch was rauskommen und die LEDs glimmen.

Meines Wissens muß man doch eigentlich das SPI-Modul erst einschalten. 
Bei den PICs ist das so, bei den AVRs wird's wohl genauso sein. 
Zumindest hab ich immer gesehen, daß es vier verschiedene SPI-Modi gibt 
von denen man erst einen festlegen muß. Und dazu verwendet man doch auch 
bei der Arduino-Umgebung die Defs aus einer entsprechenden Header-Datei, 
oder? Ich glaube das ist die SPI.h. Schau mal bei arduino.cc unter SPI 
nach da steht bestimmt mehr darüber.

von Joachim .. (joachim_01)


Lesenswert?

Übrigens, dein Array ist um eins zu klein, du kannst da nen häßlichen 
Speicherüberlauf bekommen. Ich hab das mal bei mir auf nem LCD-Modul 
beobachtet... ;-)

von Joachim .. (joachim_01)


Lesenswert?

Sorry, hab mich verzählt. Das mit dem Array passt. Mea culpa.

von M. G. (looking)


Lesenswert?

Schon mal probiert, die 500 us LOW für CLK zu vergrößern?

von David S. (elektro-david)


Lesenswert?

Hi leute,
also danke schonmal!

@joachim Leds hatte ich schon dran, schaut komplett richtig aus, die 
glimmen bzw wenn ich datapin testweise HIGH lasse dann eben die led die 
ganze zeit an...

Des mit der SPI-libary is n guter tip, des probier ich mal morgen 
nochmal intensiver aus, ich hab halt gedacht es geht auch komplett ohne 
libary wenn ich die pins selber "von hand" so schalte wie ich se 
brauch..
aber ich werds mal noch ausprobieren!!

@ M.G.
ja habe ich probiert: 550 us/1ms/2sek alles mögliche
die chiplogik ist also davor immer auf jeden fall "zurückgesetzt" 
worden..

Also ich glaub das bis jetzt noch nicht die lösung dabei war, aber ich 
bin ganz zuversichtlich!
Nochmal: ich wäre euch und diesem Forum/community wahnsinnig dankbar 
wenn das klappt!

...

von Arduino (Gast)


Lesenswert?

Hi

Für den Arduino gibt es eine Library. Allerdings ist diese für den 
WS2801 mit 3 PWM Kanälen. Meiner Meinung nach sollte diese aber auch mit 
einem 03er funktionieren. Mit dieser werden jeweils n Pixel mit RGB 
Werten beschickt. Da macht es keinen Unterschied, ob man einen 03er oder 
sechs 01er ansteuert. Andernfalls lässt sich die Lib sicher leicht 
anpassen.

BTW: Wo hast Du die 2803er her? Ich konnte bis jetzt in Europa, bzw CH, 
nur den 2801er beschaffen.

von David S. (elektro-david)


Lesenswert?

SPI library sowie Ws2801 library habe ich noch nicht geschafft, probier 
ich aber noch!
ich glaub aber nach wie vor dass es ohne library gehen sollte...

den ws2803 hab ich auf ebay gesucht, bin dann auf nooelec gestoßen die 
ham mir 5stk als DIP für ca 14 euro mit porto geschickt!!

...

von Axel T. (honx)


Lesenswert?

moin,

ich glaube, du hast das falscherum verdrahtet. der ws2803 hat current 
sink outputs, heisst, die LEDs muessen an VCC, die pins des ws2803 sind 
dann GND. (wobei es auf dem foto so aussieht, als wuerden manche LEDs in 
GND und manche in VCC stecken.)

dein arduino-source sollte gehen....sieht auf den ersten blick 
jedenfalls richtig aus.

hier noch ein test-source den ich gerade nochmal mit einem arduino uno 
und einem ws2803 getestet habe:
1
// 8 CLK
2
const int pinCLK = 8;
3
4
// 9 CLK Data
5
const int pinDATA = 9;
6
7
8
void setup() {
9
    Serial.begin(57600);  
10
  pinMode(pinCLK, OUTPUT);
11
  pinMode(pinDATA, OUTPUT);
12
13
  digitalWrite(pinCLK, HIGH);
14
  digitalWrite(pinDATA, LOW);
15
}
16
17
byte val = 0;
18
19
void loop () {
20
21
  byte c; 
22
  int digit;
23
  
24
  delayMicroseconds(600);
25
26
  val+=2;
27
  
28
  for(c=0; c<= 17;c++) {
29
    for(digit=7;digit >=0;digit--) {
30
    if(val & (1 << digit)) {
31
       digitalWrite(pinDATA, HIGH);
32
    } else {
33
     digitalWrite(pinDATA,LOW);
34
    }
35
    digitalWrite(pinCLK, HIGH);
36
    digitalWrite(pinCLK, LOW);
37
    }
38
  }
39
40
}

von David S. (elektro-david)


Lesenswert?

Liebes Forum!

Mein Problem ist gelöst! ich bin gerade im Moment so begeistert!!
Vielen Dank euch allen für die Beiträge ich finds einfach nur noch geil, 
dass man hier so schnell brauchbare spezifische Informationen und Hilfe 
bekommt!

Speziell @ Axel:
Ich hab mir deinen Code reibkopiert, bisschen was geändert(pins) und 
BOOOM!!
es läuft!!!!! (ERSTMAL Luftsprung!!!!)
dann hab ich natürlich ewig geschaut was an meinen mikrigen Zeilen nicht 
gepasst hat und ich glaub es war die Art wie die Clock gesteuert wird 
bei mir so:


CLk auf 0,
bla bla bla code
data pin entsprechend setzen
bla bla bla code
CLk auf 1,

Bei dir:

bla bla bla code
data pin entsprechend setzen
bla bla bla code
CLK auf 1,
Clk auf 0,

um daten reinzuschieben!
Im nachhinein viel logischer und besser!

ICH bedanke mich tausend mal bei dir ich hatte schon die ganze zeit 
schlechte laune weil ich kein lust auf den tlc5940 hatte!!
Problem gelöst! platinen warten!!!

Ich hab ein großes Projekt vor, und werd wenn ich fertig bin dass auch 
hier posten, dann könnt ihr auch sehen warum ich mich so aufgeregt 
habe!!! ;)

Gruß & nochmal Vielen Dank an ALLE!

David

von Axel T. (honx)


Lesenswert?

David S. schrieb:

moin,

schoen das es geht!

ein wenig merkwuerdig: ich habe deinen source jetzt auch nochmal auf 
meinem arduino getestet (einzige aenderng sind die pin-nummern) und auch 
der geht bei mir. ich habe mir das von deinem source generierte signal 
dann mal aufm oszi angeguckt und auch da siehts OK aus und die flanken 
haben auch ausreichenden zeitlichen abstand.

insofern wird es nicht direkt an den sourcen liegen. ich glaube eher, 
dass der WS2803 einfach ein bisschen empfindlich/hakelig ist. ich hatte 
das schon an anderer stelle gelesen. man darf auch wohl auf keinen fall 
auf einen entkopplungskondensator verzichten.

ich hatte es schon mit dem gleichen source, dass die ansteuerung eine 
ganze zeit gingt und dann irgendwann zwischendurch kurz nicht. 
komplettes strom abschalten half jeweils, danach ging alles wieder.

anyways..es geht..you can't argue with results :)

bin gespannt auf dein projekt. ich hatte mir die ws2803 damals zur 
ansteuerung fuer einen LED-wuerfel gekauft...

tty, axel

von David S. (elektro-david)


Angehängte Dateien:

Lesenswert?

Hi axel,

ja komisch ich dacht es lag daran.. aber ich hab davor auch noch bissl 
hin und herprobiert..
wer weiß... naja jetzt hab ich auf jeden fall schön alles sauber 
erledigt gekriegt...

hast du des eigentlich mit einem teensy probiert?!?! vielleicht ist s 
beim arduino anders?

Ähm, wo meinst du müsste der entkopplungskondensator hin? an beide cli & 
data - PINs???
Damit kenn ich mich auch noch nicht so gut aus, naja ich google des auch 
mal noch bisschen, im Moment funktionierts ja..

Übrigens Platine wurde heute schon mal fertig gelötet.. ;)

gruß

von David S. (elektro-david)


Angehängte Dateien:

Lesenswert?

Hi Leute,

leider krieg ich des "daisyChain"-en von den ws2803s nicht so gut hin...

Einzeln angeschlossen funktionieren sie immer perfekt ( kein flackern 
und nix),

4 stk in Daisy Chain schaut dann auch immer mal kurz gut aus aber dann 
flimmert nur noch alles und irgendwo gehen wohl bits verloren (!?!)..

Des hat sicher was mit dem Entkopplungskondensator zu tun!?!

naja ich setz mich die nächsten Tage nochmal hin dann bekomm ich s 
vielleicht raus ;)

gruß

von David S. (elektro-david)


Lesenswert?

David S. schrieb:
> Ähm, wo meinst du müsste der entkopplungskondensator hin? an beide cli &
> data - PINs???

Hat sich erledigt, weiß jetzt wie sowas funktioniert, ich werds morgen 
ausprobieren blos den wert weiß ich nicht genau, google ich auch mal ich 
hab eh noch n haufen kondensatoren...

von Axel T. (honx)


Lesenswert?

moin,

generell sollte zwischen VCC und ein 100nF keramikkondensator geschaltet 
werden.

siehe auch hier:

http://www.mikrocontroller.net/articles/Kondensator#Entkoppelkondensator


zu deinen problemen:

bist du sicher, dass deine stromversorgung den notwendigen strom 
(sauber) liefern kann?

bei vier 2803ern sind das im maximalfall 4 x 18 LEDs zu je 20mA, also 
1440mA.

es kann gut sein, dass deine stromversorgung nicht in der lage diese 
menge strom (ausreichend stoerungsfrei) fuer die ws2803 bereit zu 
stellen.

ich wuerde dir zur fehlersuche folgendes vorschlagen:

- versuche es erstmal mit einer langsameren taktung, also z.B. 100
  mikrosekunden verzoegerung zwischen den taktflanken und zwischen den
  einzelnen bits.

  wenn das stoerungsfrei geht, gibt es vmtl tatsaechlich irgendwo ein
  problem mit der signaluebertragung...

- schalte in den bits die du sendest nur eine einzige LED ein (also 71 
LED
  aus, 1 ein). probiers am besten mehrmals hintereinander, in dem du
  jeweils eine andere LED aktiviert.

  wenns mit einer geht, mit vielen aber nicht, deutet das eher auf ein
  problem mit der stromversorgung hin..

von David S. (elektro-david)


Lesenswert?

Klingt alles nach sehr guten Vorschlägen!

Den Entkopplungs Kondensator werd bei nächster gelegnheit einbauen, und 
wenn das nicht hilft weiter auf fehlersuche unterwegs sein, aber dass 
das Flimmern an der Stromversorgung liegt kann ich ( denk ich mal ) 
ausschließen:

Erstens hatte ich bis jetzt nie mehr als ein paar LEDs angeschlossen, 
und auserdem immer noch ein externes Netzteil (5v,1A) mit angeschlossen.
Zusammen mit dem USB-Strom, Bei dem bin ich mir nicht ganz sicher aber 
schätz mal so zwischen 500mA bis 900 mA  (USB 3.0)...

und wie gesagt im moment zieht da eh noch nicht so viel...
aber decoupling capacitor klingt vielversprechend!!!

und auch die signalübertragung werd ich nochmal abchecken!

von Vlad T. (vlad_tepesch)


Lesenswert?

eine frage zwischendurch:
gibts auch eine Variante des WS2803 auch für größere Ströme?
so max 50 oder 60 mA?

von Matrix (Gast)


Lesenswert?

David S. schrieb:
> den ws2803 hab ich auf ebay gesucht, bin dann auf nooelec gestoßen die
> ham mir 5stk als DIP für ca 14 euro mit porto geschickt!!

Wie lange hat denn bei dir der Versand gedauert wenn man Fragen darf? 
Hab dort vor genau einem Monat 10 RGB Matrizen und 200 RGB LEDs bestellt 
und diese wurden auch auf den nächsten Tag verschickt mit Trackingnummer 
von USPS. Diese hört aber am 30 Sept auf.
Oder hängt mein Sach beim Zoll und ich habe noch keine Info bekommen? 
Ist ja auch schon vorgekommen das Sachen beim Zoll wochenlang lagen bis 
man eine Info bekommen hat.
Wäre um eine Antwort dankbar.

von David S. (elektro-david)


Lesenswert?

hi Leute,

mein Projekt mit dem WS2803 ist fertig, und ich wollte mich nochmal 
offiziell für eure Hilfe bedanken!! - Ich finds wirklich großartig wenn 
man sich in einem solchen Forum austauschen und Probleme beheben kann!!

Vielen Dank, für die Tipps&Hilfe!

Es gibt auch ein Demo-Video zu meinem Projekt. (aber man darf ja nicht 
verlinken :( wenn ihr es trotzdem sehen wollt tippt in youtube einfach 
"stomper controller" ein -> es müsste das erste sein.

nochmals Danke, auch ich werde versuchen meinen Teil der Forum Community 
beizutragen ;-)

Gruß

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.