Forum: Mikrocontroller und Digitale Elektronik STM32 Timer Encoder Mode mit nur einem Kanal?


von Bert S. (kautschuck)


Lesenswert?

Hi,

Ich versuche auf einem STM32 einen einkanaligen Inkrement-Encoder 
auszulesen, jedoch bekomme ich das einfach nicht hin, ohne den zweiten 
Kanal hinzuzunehmen.

Der Encoder-Ausgang wird direkt über 2 parallele 100Ohm Widerstände auf 
2 GPIO Pins geleitet, welche als Combined Channels Encoder Mode gesetzt 
sind. Wenn ich nun den Encoder auslese über TIMx->CNT, dann bekomme ich 
die doppelte Anzahl an Pulse, die der Encoder eigentlich hätte.

Der Encoder Mode ist als Encoder Mode TI1 gesetzt, es sollte also nur 
ein Kanal ausgewertet werden und der zweite zur Drehrichtungsbestimmung, 
aber dem scheint nicht so zu sein.
1
  htim22.Instance = TIM22;
2
  htim22.Init.Prescaler = 0;
3
  htim22.Init.CounterMode = TIM_COUNTERMODE_UP;
4
  htim22.Init.Period = 65535;
5
  htim22.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
6
  htim22.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
7
  sConfig.EncoderMode = TIM_ENCODERMODE_TI1;
8
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
9
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
10
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
11
  sConfig.IC1Filter = 0;
12
  sConfig.IC2Polarity = TIM_ICPOLARITY_FALLING;
13
  sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
14
  sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
15
  sConfig.IC2Filter = 0;
16
  if (HAL_TIM_Encoder_Init(&htim22, &sConfig) != HAL_OK)
17
  {
18
    Error_Handler();
19
  }
20
21
  HAL_TIM_Encoder_Start(&htim22, TIM_CHANNEL_1);

Bin ich da völlig auf dem Holzweg, wenn ich nur einen Kanal auslesen 
will? Ich habe auch schon versucht, den internen Pull-Down für den 
zweiten Kanal anzuwenden und den Kanal vom Encoder-Ausgang durch den 
Widerstand getrennt, jedoch gibt es mir seither nur noch Müll aus.

von Thosch (Gast)


Lesenswert?

Bert S. schrieb:
> Wenn ich nun den Encoder auslese über TIMx->CNT, dann bekomme ich
> die doppelte Anzahl an Pulse, die der Encoder eigentlich hätte.

Dann mach doch einfach
1
schritte = TIMx->CNT / 2;

von Bert S. (Gast)


Lesenswert?

Naja, habe ich mir auch gedacht, aber ich möchte keine Pulse verlieren, 
wenn beide Flanken quasi-gleichzeitig ansteigen und somit der Encoder 
evtl. Kanal B als Low statt High erkennt.

von Bert S. (kautschuck)


Lesenswert?

Habe es rausgefunden (external clock mode 1 mit Trigger Source TI1_ED):

https://community.st.com/s/question/0D50X00009XkaNXSAZ/using-a-timer-to-count-pulses-on-stm32f7

: Bearbeitet durch User
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.