mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 PWM Verständnis


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 Pete (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche gerade mir einen Einstieg in die STM32 Welt zu verschaffen. 
Dafür möchte ich gerne eine LED via PWM ansteuern und dimmen.
Aktuell habe ich leider keine HW auf der ich testen kann.

Im Anhang ist ein Codestück aus diesem Thread
Beitrag "STM32 Servoansteuerung PWM"

Ich würde gerne wissen ob ich alles richtig verstanden habe

---

Die Timer Peripherie läuft standardgemäß auf SystemClock/2.
Diese Frequenz kann durch TIM_PRESCALER weiter nach unten geteilt 
werden.
Im Beispiel wird der Takt um 1Meg geteilt.
Das hat zur Folge dass der Timer jede us einen Wert zum Zählregister 
addiert.
Mit TIM_PERIOD wird dann die Periodendauer festgesetzt.
In diesem Falle 20.000 * 1us = 20ms.
Das bedeutet wir bekommen schon einmal eine Frequenz unseres 
Rechtecksignals von 50Hz heraus.
TIM_PULSE ergibt die Anzahl der Punkte in denen das Signal "high" sein 
soll. Der Timer gibt also die ersten 1500 Punkte ein High Signal aus 
(1.5ms) und die restlichen 18500 Punkte ein Low (18.5ms). Dann fängt das 
ganze wieder von vorne an.

Ist das so richtig verstanden ?

---

Noch eine Frage:
Man sollte doch versuchen seine Periode so nah wie möglich an 16Bit 
(65535) zu legen damit man möglichst viel Auflösung gewinnt.
Wäre es nicht sinnvoller den Prescaler mit 2.5Meg zu teilen ?
Der Timer addiert dann jede 0,4us einen Wert.
TIM_PERIOD = 50.000 würde ebenfalls eine Frequenz von 20ms ergeben
TIM_PULSE  =  3.750 würde ebenfalls eine Impulsdauer von 1.5ms ergeben

---

Für das LED Fading habe ich folgende Seite gefunden
http://www.mikrocontroller.net/articles/LED-Fading

Nun brauche ich doch nur meine PWM mit einer Verweilzeit step_time mit 
allen Werten aus z.B. pwmtable_16 zu füttern und es sollte 
funktionieren.

Wie dimensioniert man die Verweilzeit step_time ?

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Pete schrieb:
> Die Timer Peripherie läuft standardgemäß auf SystemClock/2.
Je nachdem, was man im Initialisierungs-Code eingestellt hat! Das 
Maximum (wie in den meisten Beispielcodes so eingestellt) ist 
SystemClock für die Timer auf APB2 und SystemClock/2 für die auf APB1.
> Diese Frequenz kann durch TIM_PRESCALER weiter nach unten geteilt
> werden.
Ja.
> Im Beispiel wird der Takt um 1Meg geteilt.
Nein, der Prescaler geht nur von 0-65535. Der Prescaler wird so 
berechnet, dass der Timer bei 1 MHz läuft. Ist also z.B. 
SystemCoreClock=168000000, wird daraus also TIM_Prescaler = 83, d.h. der 
Takt wird durch 84 geteilt (0 zählt ja auch).
> Das hat zur Folge dass der Timer jede us einen Wert zum Zählregister
> addiert.
> Mit TIM_PERIOD wird dann die Periodendauer festgesetzt.
> In diesem Falle 20.000 * 1us = 20ms.
> Das bedeutet wir bekommen schon einmal eine Frequenz unseres
> Rechtecksignals von 50Hz heraus.
> TIM_PULSE ergibt die Anzahl der Punkte in denen das Signal "high" sein
> soll. Der Timer gibt also die ersten 1500 Punkte ein High Signal aus
> (1.5ms) und die restlichen 18500 Punkte ein Low (18.5ms). Dann fängt das
> ganze wieder von vorne an.
>
> Ist das so richtig verstanden ?
Dieser Teil ist völlig richtig.
> ---
>
> Noch eine Frage:
> Man sollte doch versuchen seine Periode so nah wie möglich an 16Bit
> (65535) zu legen damit man möglichst viel Auflösung gewinnt.
Prinzipiell ja. Aber dann kann man nicht so schön in glatten 
Mikrosekunden rechnen :)
> Wäre es nicht sinnvoller den Prescaler mit 2.5Meg zu teilen ?
> Der Timer addiert dann jede 0,4us einen Wert.
> TIM_PERIOD = 50.000 würde ebenfalls eine Frequenz von 20ms ergeben
> TIM_PULSE  =  3.750 würde ebenfalls eine Impulsdauer von 1.5ms ergeben
Klar. Aber ein oller Modellbauservo hat sowieso bestimmt keine Auflösung 
von 2000 Schritten (bei 0.5-2.5ms Pulsen und 1µs Auflösung), weswegen 
man auch genausogut in Mikrosekunden rechnen kann...


Für LED Fading wäre es eventuell schlauer einen Up&Down-Counting Modus 
zu verwenden, damit die Phasenlage immer gleich ist. Und natürlich eine 
viel höhere Frequenz als 50Hz, damit man das Flimmern nicht mehr sieht.

von MT (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Bei dem oben verlinkten Beitrag
http://www.mikrocontroller.net/articles/LED-Fading

im Text und in den Excel Sheets ist immer die Rede von einem "Faktor".
Wofür ist der gut, bzw. was sagt er aus ??

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.