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 ?
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.
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 ??
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.