Считывание выходных данных квадратурного энкодера с использованием NUCLEO-F072RB
Я использую плату NUCLEO-F072RB в сочетании с X2C для считывания выходного сигнала энкодера двигателя постоянного тока, чтобы измерить его скорость. Согласно данным, используя таймеры TIM2 и TIM3, можно выполнить это чтение. Для этого я использовал этот и этот источники для написания следующего кода:
/** - configure A6 for encoder input (T1) */
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_Init (GPIOA, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOA, GPIO_InitStruct.GPIO_Pin, GPIO_AF_1);
/** - configure A7 for encoder input (T2) */
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_Init (GPIOA, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOA, GPIO_InitStruct.GPIO_Pin, GPIO_AF_1);
/**********************************************/
/* Encoder input setup */
/* TIM3 clock enabled */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* TIM3 DeInit */
TIM_DeInit(TIM3);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_OCStructInit(&TIM_OCInitStructure);
/* Configure the timer TIM3 for encoder input */
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_SetAutoreload (TIM3, 0xffff);
/* TIM3 counter enable */
TIM_Cmd(TIM3, ENABLE);
Здесь я использую альтернативную функцию 1 для обоих входов, которая, согласно данным, соответствует TIM3. Насколько я понимаю, при такой настройке каждый раз, когда на T1 имеется нарастающий фронт (в данном случае GPIO A6), счетчик TIM3 увеличивается на 1, а когда на T2 (A7) нарастает фронт, счетчик уменьшается одним.
В целях отладки я установил значение для переменной, которую я могу отслеживать. Если счетчик равен 1 или больше, значение равно INT16_MAX
устанавливается, в противном случае 0
установлено.
if (TIM_GetCounter(TIM3) > 0x0) {
Inports.Encoder_Input = INT16_MAX;
} else {
Inports.Encoder_Input = 0;
}
Перед использованием фактического энкодера я попытался использовать переключатель для ручной генерации нарастающих фронтов и выход ШИМ от другого GPIO для подачи на входы (AIO и A7 GPIO). Таким образом, я ожидаю, что счетчик TIM3 начнет считать вверх / вниз, но ничего не происходит. Я заметил, что когда я подключаю сигнал к A6 или A7, он ухудшается, что может объяснить, почему не обнаруживаются нарастающие фронты. Измеряя мультиметром постоянного тока сопротивление этих входов, я получаю примерно 40 Ом, что очень мало для входного порта.
Как правильно настроить таймер и GPIO, чтобы они могли считывать сигнал датчика и начать отсчет счетчика TIM3?