建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块
092947bevjlmiytnwwd8ky.jpg IoT全栈成长计划 【乘风破浪赋能学习季】物联网应用开发实战,课程+微认证,荣耀30手机等你咯~ 2020年华为云IoT云享专家
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

ttking

发帖: 150粉丝: 11

级别 : 外部版主

发消息 + 关注

发表于2020年07月31日 16:35:47 218 5
直达本楼层的链接
楼主
显示全部楼层
[干货分享] stm32编码器模式——获取编码器转动角度

>本贴使用小熊派开发板+欧姆龙的E6B2-CWZ3E编码器,通过转动编码器,获取正转或者反转的角度并在串口中显示 ## 一、准备工作 - 在串口打印的基础上进行,可查看-[单片机串口格式化打印(非重定向printf)](https://bbs.huaweicloud.com/forum/thread-67804-1-1.html) - 小熊派开发板+编码器(欧姆龙E6B2-CWZ3E,为1000线,即选择一圈产生1000个脉冲) - MDK\CubeMX\串口调试助手 ## 二、添加编码器模式 >我们将定时器2设置为编码器模式 ``` STM32L431RCTC的定时器有 1.高级定时器:TIM1 2.通用定时器:TIM2 TIM15 TIM16 3.基本定时器:TIM6 TIM7 4.低功耗定时器:LPTIM1 LPTIM2 ``` ### 1.?编码器模式有什么作用 编码器模式使用两个通道,捕获编码器的AB相脉冲。按照编码器的工作原理,正转时A相超前。设置stm32捕获AB相的上升沿、下降沿,stm32的编码器模式可以自动的消除干扰(比如抖动带来的干扰),如果正转,计数器向上计数,反则向下计数。 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202007/26/192218tpf7c3f9bkz1tk6e.png) ### 2.配置定时器2(TIM2) >打开定时器模式,设置TF1\TF2都捕获,不分频(此时,旋转一圈将计数1000*4=4000),计数值为20000。 **注意的是,我们设置的上升沿捕获,并不是只捕获上升沿,而是从上升沿开始捕获。** ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202007/26/192703munp6g5yctiad9vr.png) ### 3.打开定时器2中断 >我们希望计数值溢出时进行相应的处理,因此打开定时器2全局中断 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202007/26/1930198wzq0wfrqtnzy7u3.png) **最后,生成代码就OK了** ## 三、编写相应代码 ### 1.设置初始计数值10000 注意,这是一个巧妙的处理。上面提到,编码器向前,计数值向上加;编码器向后,计数值向下减。问题就来了,一开始计数值为0,不是一减就溢出了吗?因此我们手动设置为10000,即ARR的1/2.(__HAL_TIM_SET_COUNTER(&htim2,10000);) ### 2.更新中断回调函数 >进入更新中断后,进行判断是向上计数还是向下计数,从而获取计数的次数 ```c unsigned int AllCnt = 0; unsigned int EveCnt = 0; void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim == &htim2) { if((htim2.Instance->CR1&0x10) == 0x10)//向下计数 { UsartPrintf(&huart1,"up is overload\r\n"); EveCnt--; } else if((htim2.Instance->CR1&0x10) == 0x00)//向上计数 { UsartPrintf(&huart1,"down is overload\r\n"); EveCnt++; } UsartPrintf(&huart1,"get HAL_TIM_PeriodElapsedCallback\r\n"); __HAL_TIM_SET_COUNTER(&htim2,10000); AllCnt = EveCnt * 10000 + __HAL_TIM_GET_COUNTER(&htim2); //AllCnt = EveCnt * 10000 + htim2.Instance->CNT; } } ``` ### 3.main函数 >extern tim.c中的AllCnt、EveCnt 。打开编码器中断,设置其实CNT为10000 ```c while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ //if(AllCnt == 0) //HAL_Delay(1000); while(FirstTime + 1000 != HAL_GetTick()); FirstTime = HAL_GetTick(); BMQCnt = __HAL_TIM_GET_COUNTER(&htim2); Diretion = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2); //__HAL_TIM_SET_COUNTER(&htim2,4000); if(Diretion == 0) { UsartPrintf(&huart1,"编码器正转 脉冲:%d,%d\r\n",BMQCnt,Diretion); } else { UsartPrintf(&huart1,"编码器反转 脉冲:%d %d\r\n",BMQCnt,Diretion); } //UsartPrintf(&huart1,"0.1编码器输出脉冲个数为:%d \r\n",__HAL_TIM_GET_COUNTER(&htim2)); //else //UsartPrintf(&huart1,"0.2编码器输出脉冲个数为:%d \r\n",AllCnt/4); //HAL_Delay(1000); } /* USER CODE END 3 */ } ```
举报
分享

分享文章到朋友圈

分享文章到微博

andyleung

发帖: 465粉丝: 26

级别 : 外部版主

发消息 + 关注

发表于2020年08月02日 08:49:32
直达本楼层的链接
沙发
显示全部楼层

学习到不少东西 非常感谢~

点赞 评论 引用 举报

Tianyi_Li

发帖: 212粉丝: 53

级别 : 外部版主

发消息 + 关注

发表于2020年08月11日 07:25:20
直达本楼层的链接
板凳
显示全部楼层

实用

点赞 评论 引用 举报

极客潇

发帖: 268粉丝: 19

级别 : 外部版主

发消息 + 关注

发表于2020年08月11日 08:42:04
直达本楼层的链接
地板
显示全部楼层

太专业了,学习下

点赞 评论 引用 举报

scu-w

发帖: 132粉丝: 5

级别 : 外部版主

发消息 + 关注

发表于2020年08月13日 21:34:02
直达本楼层的链接
5#
显示全部楼层

厉害!感谢分享!

点赞 评论 引用 举报

柠檬PH=2

发帖: 125粉丝: 32

级别 : 外部版主

发消息 + 关注

发表于2020年08月13日 22:05:15
直达本楼层的链接
6#
显示全部楼层

辛苦,感谢整理

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册