Считывание выходных данных квадратурного энкодера с использованием 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?

0 ответов

Другие вопросы по тегам