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