Forum: Mikrocontroller und Digitale Elektronik STM32F01RC Input Capture Problem


von Dustin M. (db1234)


Lesenswert?

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
  }
}
}

von Stefan F. (Gast)


Lesenswert?

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.

von pegel (Gast)


Lesenswert?

Habe das jetzt nur kurz überflogen, aber warum setzt Du nicht:

Polarität       : Both Edges

? Das dürfte die ganze Rechnerei erleichtern.

von pegel (Gast)


Lesenswert?

Du könntest bei fallender Flanke den Zähler, wenn er nicht anderweitig 
gebraucht wird, auf Null setzen. Dann entfallen die Übertrag 
Berechnungen.

von Johannes S. (Gast)


Lesenswert?

Oder mit integer Zeitstempel rechnen, das macht die Überlauf Klimmzüge 
auch überflüssig.

von Dustin M. (db1234)


Lesenswert?

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
von Dustin M. (db1234)


Lesenswert?

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
von pegel (Gast)


Lesenswert?

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;

von Stefan F. (Gast)


Lesenswert?

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.
von Dustin M. (db1234)


Lesenswert?

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
von pegel (Gast)


Lesenswert?

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