我将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 的 PWM 输出来馈送输入(GPIO 的 A6 和 A7)。这样,我希望 TIM3 计数器开始向上/向下计数,但没有任何反应。我注意到当我将信号连接到 A6 或 A7 时,它会退化,这可以解释为什么没有检测到上升沿。用直流万用表测量这些输入上的电阻,我得到大约 40 欧姆,这对于输入端口来说非常低。
如何正确设置定时器和 GPIO 才能读取编码器信号并让 TIM3 计数器开始计数?