Guten Tag, ich habe einen STM32F091RC und möchte ein 5ms Signal via Input Capturing erfassen. Für das Progamm verwende ich die HAL-Libary Für das Input-Capturing verwende ich den Timer14 mit Folgenden Parametern: Clock/Prescaler : 1000 Hz Counterperiode : 65535 (16-bit) Polarität : Risisng edge minimale Frequenz = Clock / Counterperiode = ~0,015 HZ Ich will nun mit steigender Flanke t1 und mit fallender Flanke t2 einlesen. Die Differenz müsste die Einheit ms haben. Problem: Ich erzeuge mittels Frequenzgenerator einen Pulse von 5ms breite und einer Frequenz von 1Hz. Bei dem ersten Pulse beträgt die Differenz 5, was 5 ms entspricht. Bei dem zweiten bis n-ten Pulse erhalte ich 1005, was 1005 ms entsprechen würde. Ich erkenne einfach den Fehler nicht, wie ab dem zweiten Durchlauf die 1005 ms zustande kommen anstatt der 5 ms. Kann mir wer dabei weiterhelfen? void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { // check interrupt source if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { if (Is_First_Captured==0) // rising edge detected? { // capture rising edge value IC_Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); //set polarity as rising edge __HAL_TIM_SET_CAPTUREPOLARITY(&htim14,TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); Is_First_Captured =1; // set the first value captured as true } else if (Is_First_Captured==1) // falling edge detected? { // capture falling edge value IC_Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); if (IC_Value2 > IC_Value1) { // calculate the difference (normal) Difference = IC_Value2-IC_Value1; } else if (IC_Value2 < IC_Value1) { // calculate the difference (overflow) Difference = IC_Value2 + 0xffff - IC_Value1 + 1; } else { Error_Handler(); } //set polarity as falling edge __HAL_TIM_SET_CAPTUREPOLARITY(&htim14,TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); Is_First_Captured = 0; // reset capturing } } }
Ich finde ziemlich auffällig (aber auch nicht verwunderlich) dass die allermeisten Fragen zu STM32 eigentlich Fragen zur HAL sind. Mein Tipp dazu: Um die HAL mit ihrer äußerst mageren Doku zu verstehen, muss man erst einmal den Mikrocontroller kennen lernen. Und zwar ohne HAL, anhand des Referenzhandbuches. Danach wirst du die knappen Sätze in der HAL Doku viel besser verstehen und auch imstande sein, im Zweifelsfall in dessen Quelltext zu schauen.
Habe das jetzt nur kurz überflogen, aber warum setzt Du nicht: Polarität : Both Edges ? Das dürfte die ganze Rechnerei erleichtern.
Du könntest bei fallender Flanke den Zähler, wenn er nicht anderweitig gebraucht wird, auf Null setzen. Dann entfallen die Übertrag Berechnungen.
Oder mit integer Zeitstempel rechnen, das macht die Überlauf Klimmzüge auch überflüssig.
Es ist doch maximal nur 1 Überlauf (während eines Pulses) möglich? Den ziehe ich schon in Betracht oder sehe ich das falsch? Der Zähler wird noch anderweitig benötigt, das zurücksetzen ist leider nicht möglich.
:
Bearbeitet durch User
Stefan ⛄ F. schrieb: > Ich finde ziemlich auffällig (aber auch nicht verwunderlich) dass die > allermeisten Fragen zu STM32 eigentlich Fragen zur HAL sind. > > Mein Tipp dazu: Um die HAL mit ihrer äußerst mageren Doku zu verstehen, > muss man erst einmal den Mikrocontroller kennen lernen. Und zwar ohne > HAL, anhand des Referenzhandbuches. > > Danach wirst du die knappen Sätze in der HAL Doku viel besser verstehen > und auch imstande sein, im Zweifelsfall in dessen Quelltext zu schauen. Verstehe deine Antwort auf meine Frage nicht ganz?
:
Bearbeitet durch User
Dustin B. schrieb: > Es ist doch maximal nur 1 Überlauf (während eines Pulses) möglich? Den > ziehe ich schon in Betracht oder sehe ich das falsch? Simuliere doch mal diese Rechnung mit uint16_t Variablen: volatile uint16_t i1; volatile uint16_t i2; volatile uint16_t i3; i1=50; i2=34; i3=i1-i2; i1=3; i2=65534; i3=i1-i2;
Dustin B. schrieb: > Verstehe deine Antwort auf meine Frage nicht ganz? Macht nichts, es war ja auch nur eine unpassende Meinungsäußerung.
Beitrag #6514063 wurde vom Autor gelöscht.
pegel schrieb: > Dustin B. schrieb: >> Es ist doch maximal nur 1 Überlauf (während eines Pulses) möglich? Den >> ziehe ich schon in Betracht oder sehe ich das falsch? > > Simuliere doch mal diese Rechnung mit uint16_t Variablen: > > volatile uint16_t i1; > volatile uint16_t i2; > volatile uint16_t i3; > > i1=50; i2=34; > i3=i1-i2; > > i1=3; i2=65534; > i3=i1-i2; Okay, wäre eine Option. Vielen Dank für den Tipp ;) Aber wie die 1005 zustande kommen kann sich keiner zusammen reimen?
:
Bearbeitet durch User
Dustin B. schrieb: > Aber wie die 1005 zustande kommen kann sich keiner zusammen reimen? Ich würde auf die Both Edges tippen.
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.