Forum: Mikrocontroller und Digitale Elektronik STM32 Input Capture für PWM Signal


von Bert S. (kautschuck)


Angehängte Dateien:

Lesenswert?

Hi,

Ich habe ein wenig Probleme mit dem Input Capture des STM32F303K8T6:

https://www.st.com/content/ccc/resource/technical/document/programming_manual/6c/3a/cb/e7/e4/ea/44/9b/DM00046982.pdf/files/DM00046982.pdf/jcr:content/translations/en.DM00046982.pdf

Der Timer3, Channel 2 ist im "Input Capture Direct Mode" mit den 
Einstellungen von oben in CubeMX.

Nun möchte ich ein PWM Signal (Frequenz und Cycle) messen, wobei die 
Frequenz 0.977kHz beträgt mit zwei verschiedenen Dutycycles, wie im 
Anhang. Die Signale wechseln sich alle 8s ab.

Ich mache also folgendes:

0.) Timer initialisiert gemäss CubeMX

1.) Timer starten:
1
HAL_TIM_Base_Start(tim3);
2
HAL_TIM_IC_Start_IT(tim3,TIM_CHANNEL_2);

2.) Callback:
1
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
2
  if (htim->Instance == tim3->Instance) {
3
    __HAL_TIM_SET_COUNTER(tim3,0);
4
  }
5
}

3.) In einer Loop:
1
int count = __HAL_TIM_GET_COUNTER(&htim3);
2
int capture= __HAL_TIM_GET_COMPARE(&htim3,TIM_CHANNEL_2);

Das Resultat von count und capture ist im Anhang zu sehen und der 
counter springt ein bisschen zufällig herum. Die Messungen wurden alle 
500ms gemacht.

Edit: Ok, habe es hinbekommen, ich muss natürlich beide Edges messen. 
Das Problem ist nur, das die Werte noch zu ungenau sind. Mein Timer hat 
eine Frequenz von genau 1Mhz, also 1us Periodendauer. Nun entsprechen 
900 cycles also 900us -> 1111Hz und nicht 977Hz, wie mit dem Oszi 
gemessen. Jemand eine Idee was da mit der Umrechnung nicht stimmt?

: Bearbeitet durch User
von Bert S. (kautschuck)


Lesenswert?

Jemand eine Idee, warum der STM32 so weit neben der eigentlichen 
Frequenz ist mit Input Capture?

von Jonny O. (blubbrezn)


Lesenswert?

Hallo Bert,

Das Problem ist der Prescaler. Verständlicherweiße nimmt man an, dass 
der Prescaler ein Teiler ist. Also (CLK_FRQ) / (PSC) = (TIM_CNT_FRQ), 
dass ist aber falsch.

Der Prescaler ist ein Zähler, der sich sobald er den PSC-Wert erreicht 
auf 0 zurücksetzt und den eigentlichen Counter erhöht. Dementsprechend 
sind es von 0 bis 0, 9 Zählschritte bei einem PSC von 8 (0, 1, 2, 3, 4, 
5, 6, 7, 8, 0).

Um einen Teiler von 8 zu erhalten musst du den PSC auf 7 stellen.

In deinem Fall is der PSC 8 was bei einer Timerfrequenz von 8Mhz eine 
Zählfrquenz von 0.8889 Mhz ergibt. 900 Zählschritte entsprechen dann 
1us/0.8889 * 900 = 1.0125 ms -> 0.9877 KHz.

Das kommt schon sehr nah an das gemessene ran. Wenn du die interne Clock 
des stm verwendest würde ich darauf tippen das daher die restliche 
Abweichung kommt.

von Bert S. (kautschuck)


Lesenswert?

Jonny O. schrieb:
> In deinem Fall is der PSC 8 was bei einer Timerfrequenz von 8Mhz eine
> Zählfrquenz von 0.8889 Mhz ergibt. 900 Zählschritte entsprechen dann
> 1us/0.8889 * 900 = 1.0125 ms -> 0.9877 KHz.
>
> Das kommt schon sehr nah an das gemessene ran. Wenn du die interne Clock
> des stm verwendest würde ich darauf tippen das daher die restliche
> Abweichung kommt.

Danke dir, ich habe das mit dem Prescaler irgendwie vergessen, wohl zu 
lange nicht mehr verwendet. Jetzt klappt es tiptop.

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