Forum: Mikrocontroller und Digitale Elektronik STM32F303K8 Input Capturing via internen Komparator


von R. H. (breezer)


Lesenswert?

Hallo,

ich möchte gerne Pulse mit Lowpegel von ca. 1V und Highpegel von ca 2,2V 
messen.
Hierfür wollte ich den COMP2 des uC nutzen und den Ausgang intern direkt 
auf den Input-Capture-Eingang des Timer2 leiten.

Der Komparator funktioniert soweit gut, als Referenz nutze ich den DAC1, 
die Pegel werden sauber auf 0V und 3.3V umgesetzt.

Leider wird der Capture Eingang des Timers nicht getriggert, der Timer 
zählt aber im Capture-Register tut sich nix.

Ich nutze zur Konfiguration STM32CubeMX und die HAL Teiber...

Hat jemand ne Idee wo es hakt?


P.s. wenn ich eine Kabelbrücke vom Augangspin des Komparators zum 
IC-Eingangspin des Timer2 lege funktioniert es. Laut Datenblatt soll das 
aber auch intern funktionieren...

von Jammer Suse (Gast)


Lesenswert?

R. H. schrieb:
> Ich nutze zur Konfiguration STM32CubeMX und die HAL Teiber...

Warum fährt mein Auto gerade nicht?
Ich habe ein Auto von VW und tanke Benzin von Aral.

von Christopher J. (christopher_j23)


Lesenswert?

R. H. schrieb:
> P.s. wenn ich eine Kabelbrücke vom Augangspin des Komparators zum
> IC-Eingangspin des Timer2 lege funktioniert es. Laut Datenblatt soll das
> aber auch intern funktionieren...

Auch intern müssen gewissermaßen Kabelbrücken verlegt werden. Die hast 
du dann wohl vergessen.

von R. H. (breezer)


Lesenswert?

Hier noch der von CubeMX generierte Initialisierungscode für die 
entsprechende Peripherie.

Der Timer 2 mit Channel 4 ist auf Input Capturing direct konfiguriert 
und der Comparator 2 Ausgang auf den Timer 2 Channel 4

Vor der while(1) Schleife habe ich die beiden Module mit den Start 
Routinen gestartet:
1
  HAL_TIM_IC_Start (&htim2, TIM_CHANNEL_4);
2
3
  HAL_COMP_Start (&hcomp2);

1
static void MX_COMP2_Init(void)
2
{
3
4
  hcomp2.Instance = COMP2;
5
  hcomp2.Init.InvertingInput = COMP_INVERTINGINPUT_DAC1_CH1;
6
  hcomp2.Init.NonInvertingInput = COMP_NONINVERTINGINPUT_IO1;
7
  hcomp2.Init.Output = COMP_OUTPUT_TIM2IC4;
8
  hcomp2.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED;
9
  hcomp2.Init.BlankingSrce = COMP_BLANKINGSRCE_NONE;
10
  hcomp2.Init.TriggerMode = COMP_TRIGGERMODE_NONE;
11
  if (HAL_COMP_Init(&hcomp2) != HAL_OK)
12
  {
13
    _Error_Handler(__FILE__, __LINE__);
14
  }
15
16
}
1
static void MX_TIM2_Init(void)
2
{
3
4
  TIM_MasterConfigTypeDef sMasterConfig;
5
  TIM_IC_InitTypeDef sConfigIC;
6
7
  htim2.Instance = TIM2;
8
  htim2.Init.Prescaler = 0;
9
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
10
  htim2.Init.Period = 4294967295;
11
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
12
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
13
  if (HAL_TIM_IC_Init(&htim2) != HAL_OK)
14
  {
15
    _Error_Handler(__FILE__, __LINE__);
16
  }
17
18
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
19
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
20
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
21
  {
22
    _Error_Handler(__FILE__, __LINE__);
23
  }
24
25
  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
26
  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
27
  sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
28
  sConfigIC.ICFilter = 0;
29
  if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_4) != HAL_OK)
30
  {
31
    _Error_Handler(__FILE__, __LINE__);
32
  }
33
34
}

von R. H. (breezer)


Lesenswert?

Zur Info: Ich konnte das Problem lösen in dem ich beim Input Capture Pin 
(PA3) vom Timer 2 den Pull down aktiviere...

Leider war das im Datenblatt so nicht ersichtlich, ich habs letztendlich 
nur durch Zufall rausbekommen....

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.