Forum: Mikrocontroller und Digitale Elektronik Problem mit WS2812B per PWM&DMA auf STM32


von Rene B. (themason) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo Forum,

ich habe mal eine Frage. Ich versuche schon seit einigen Wochen den 
WS2812 an einen STM32 anzukorken.
Als IDE benutze ich STM32CubeMX und SystemWorkbench. Ich habe einen 
Timer als PWM Kanal konfiguiert und per DMA angesteuert.
Nach etlichen Problemen mit den Pegeln (ein Levelshifter mit Transistor 
bzw FET hat nichts gebracht) habe ich nun tabula rasa gemacht und einen 
74HC14 Schmitt-Trigger als Levelshifter verwendet. Die Pegel kommen nun 
sauber an.
Der DMA funktioniert nach mehreren Anläufen nun auch (fast).
Allerdings habe ich beim DMA noch ein Problem wo ich im Moment nicht 
weiß wo es her kommt.
Ich bereite die Pulse für den WS2812 in einem Array vor. 
Sicherheitshalber habe ich noch zu anfang einige 0-Zeiten (also Pause) 
ausgegeben. Allerdings schleicht sich da immer ein Puls zusätzlich ein 
von dem ich nicht weiß wo er her kommt. Dieser Puls versaut mir 
anscheinend die Anteuerung. Im Prinzip klappt das alles, nur manchmal 
wird eine Falsche LED angesteuert. Anbei mal den Code und ein Foto vom 
Oszi wo man den zusätzlichen Puls sehen kann.
Ich habe ein wenig die Vermutung das der DMA angestoßen wird während der 
Timer noch läuft, und dadurch ein Puls ausgegeben wird (das der also 
nicht wartet bis der letzte PWM Zyklus "durch" ist und dann erst die 
Übertragung startet.
Kleine Info noch : Ich habe das Signal softwareseitig Invertiert damit 
nach dem Schmitt-Trigger wieder "normal" 0 ausgegeben wird.

Edit :
Die Pause von dem zusätzlichen Puls am anfang bis zur eigentlichen 
Übertragung ist immer etwas unterschiedlich. Um wieviel genau es 
variiert kann ich leider nicht sagen. Ich schätze zw 2-3 PWM Zyklen.

: Bearbeitet durch User
von Marco H. (damarco)


Lesenswert?

Die Lösung ist du ja schon fast selbst geschrieben.  Du musst aufpassen 
wie sich der PWM Ausgang verhält wenn du keine CC Werte mehr nach 
schiebst. Im Normall Fall gibt dieser die letzten Wert weiter aus(PWM) 
so lange du den Timer nicht stoppst oder einen CC vorgibst der das 
Signal Low hält. Der Trick ist ja das CC Value immer nur eine Periode 
laufen zu lassen und dann sofort das neue zu laden.  Zwischen den Frames 
muss das Signal einen definierten zustand haben. Es sieht so aus das der 
Timer aktiviert wird und es eben 2-3 PWM Perioden dauert bis der DMA den 
CC Value lädt.

Es kann aber auch sein das du den Pointer zum DMA falsch übergibst und 
somit immer ein falsches CC Value geladen wird.

: Bearbeitet durch User
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.