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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Rene B. (themason) Benutzerseite


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.