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

了解编码器,参考资料: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;
	 }
}
  • 13
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值