Folgendes Problem:
Ich habe mit STM32CubeMX Init-Code für PWM Ausgabe mit TIM3 generiert.
Danach die PWM Ausgabe mit "HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);"
aktiviert. Der Ausgang ist aber dauernd HIGH. Wenn ich im TIM3 -> CNT
Register von Hand Werte grösser/kleiner als CCR4 einsetze, wird der Pin
ein- oder ausgeschaltet. Der Wert von CNT ändert sich aber nicht von
selber. Was mache ich falsch?
Timer Initialisierung:
Robert B. schrieb:> Period = 0??????
Ne, habe schon viele verschiedene probiert - ohne Erfolg
hp-freund schrieb:> Was mir noch aufgefallen ist,anders als das Listing der main.c> oben ist> in deinem angehängten Projekt in der main.c das zu finden: while (1)> {> TIM3 -> CNT = 10;> TIM3 -> CNT = 20000;> int x = HAL_TIM_PWM_GetState(&htim3);> }
Ja, da habe ich getestet, was passiert, wenn ich das CNT Register
manuell setze. Dann schaltet der Pin! Aber eigentlich sollte der Timer
ja selber zählen...
hp-freund schrieb:> Wie soll er denn zählen wenn Du ihm endlos einen Zählwert aufzwingst?
Das war nur ein Test, weil es nicht ging. Ich wollte schauen, ob er
nicht zählt, oder nicht schaltet, wenn der Wert erreicht ist...
Ich habe das jetzt mal ausprobiert.
Meine erste Vermutung war schon richtig.
Wenn das Pin nicht als Ausgang konfiguriert ist kommt auch nichts raus!
Ich wäre auch nie auf die Idee gekommen die Konfiguration einfach
wegzulassen, deshalb meine Zweifel.
Beim Nucleo F030 liegt TIM3 PWM Ch4 an PB1, also braucht es:
hp-freund schrieb:> Ich habe das jetzt mal ausprobiert.> Meine erste Vermutung war schon richtig.> Wenn das Pin nicht als Ausgang konfiguriert ist kommt auch nichts raus!>> Ich wäre auch nie auf die Idee gekommen die Konfiguration einfach> wegzulassen, deshalb meine Zweifel.>> Beim Nucleo F030 liegt TIM3 PWM Ch4 an PB1, also braucht es:>>
1
>/*Configure GPIO pin : PB1 */
2
>GPIO_InitStruct.Pin=GPIO_PIN_1;
3
>GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;
4
>GPIO_InitStruct.Pull=GPIO_NOPULL;
5
>GPIO_InitStruct.Speed=GPIO_SPEED_LOW;
6
>HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
7
>
8
>
> in der MX_GPIO_Init. Dann läuft es...
Vielen Dank, aber das war es nicht! In hal_msp.c ist diese
Initialisierung nämlich drinnen! Das eigentliche Problem war viel
einfacher:
Die Zeile
htim3.Init.Period = 0;
macht NICHT, dass der Timer jedes mal mit 0 Startet, sondern dass er von
0 bis 0 zählt... Mit dem richtigen Wert dort funktioniert es!
@Robert heul! Wie konnte ich deine Antwort übersehen? Erst nachdem ich
das geschrieben habe ist sie mir aufgefallen!
Danke euch!
LG, Sean
Sean G. schrieb:> @Robert heul! Wie konnte ich deine Antwort übersehen? Erst nachdem ich> das geschrieben habe ist sie mir aufgefallen!
Häh? Du hast Robert sogar eine Antwort geschickt:
> Robert B. schrieb:>> Period = 0??????>> Ne, habe schon viele verschiedene probiert - ohne Erfolg
Alle Timer stehen still, when we don't register fill.
TimHandle.Init.Period = 0
Macht keinen Sinn. Es sei denn beim steuern einer Rampe für einen Motor
geht die Puls runter auf Null. Auf dem Oszi kann man das Phasengeschiebe
übrigens gut beobachten.
TimHandle.Init.Period füllt das Auto-Reload Register (gut möglich, daß
der Selbstladevorgang vom 8051 abgespickelt wurde).
sConfigTIM_OC.Pulse = TimHandle.Init.Period/2
erzeugt zB. eine Pulsweite von 50%.
Übrichens: sConfigTIM_OC.Pulse muß immer kleiner sein als
TimHandle.Init.Period, sonst gibt'S kein Signal am Pin.
Eric schrieb:> Sean G. schrieb:>> @Robert heul! Wie konnte ich deine Antwort übersehen? Erst nachdem ich>> das geschrieben habe ist sie mir aufgefallen!>> Häh? Du hast Robert sogar eine Antwort geschickt:>> Robert B. schrieb:>>> Period = 0??????>>>> Ne, habe schon viele verschiedene probiert - ohne Erfolg
Ah stimmt. Jetzt ists mir eingefallen: Ich dachte Period = Duty Cycle!