STM32F01RC Input Capture Problem

OP #6513909
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
  }
}
}
Gast #6513912
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.
OP #6514031
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?
Gast #6514038
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;
Beitrag #6514063 wurde von einem Moderator gelöscht.
OP #6514066
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren