我正在使用NUCLEO-F072RB板与X2C一起读取直流电机编码器的输出,以测量其速度。根据数据表,使用定时器TIM2和TIM3可以执行此读取。为此,我按照this和this来源编写了以下代码:
/** - 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计数器开始计数?