STM32 基于HAL库的编码器模式实现

了解编码器,参考资料:https://blog..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;
	 }
}
经验分享 程序员 微信小程序 职场和发展