了解编码器,参考资料:https://blog.csdn.net/yx1302317313/article/details/80381001
编码器模式的实现
编码器模式默认使用定时器的通道1和通道2,通道3和通道4不能使用。以下为编码器模式的配置,编码器线数为1024,检测双通道的上升沿。
HAL_TIM_Encoder_Start(&htim5,TIM_CHANNEL_ALL);//编码器模式启动,写ALL为开始该定时器(TIM5)的通道1和通道2(编码器模式可自动计算)。使用编码器模式不用输入捕获
写上之后连接好编码器,电机转动后监视TIMER5的寄存器即可看到TIM_CNT向上/向下计数。通过TIM5->CNT(编码器线数)来提取计数器的值最终用CNT的值除以编码器的分辨率再乘以360来确定所转动的角度。
输入捕获实现编码器模式
原理:一个通道捕获上升沿,一个通道做IO输入。在上升沿捕获中断中进行上升沿的计数;检测IO的电平高低。当检测到上升沿,IO口电平为低时,正转;检测到上升沿,IO口电平为高时,反转。
使用定时器4的3通道来进行输入捕获,PD15检测另一波形的电平的HAL配置
定时器配置:
IO配置:
若是想要在检测到上升沿时进行中断计数,需要打开中断
HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_3);//开启输入捕获且捕获后进入中断
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//1000线的编码器//定时器捕获中断回调函数
{
if(i == 0)//编码器的零点
{
if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_15) != GPIO_PIN_RESET)//读取IO,正转/反转
{
i = 1000;
}
}
if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_15) == GPIO_PIN_RESET)
{
i++;//正转
}
else
{
i--;//反转
}
if(i == 1000)
{
i = 0;
}
}