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.