找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1666|回复: 0
打印 上一主题 下一主题
收起左侧

STM32定时器中断扫描旋转编码器

[复制链接]
跳转到指定楼层
楼主
用定时器中断对编码器进行扫描
下面是两站编码器的波形图,前面这张是编码器反转的,后面这张是编码器正转的。在图中可以看到,编码器反转时,A的下降沿对应B的高电平,编码器正转时,A的下降沿对应B的低电平。利用外部中断可以对编码器进行读取,但是编码器在旋转的过程中,编码器可能存在抖动,为了在读取编码器的同时消除抖动,可以采用定时器中断的方法对编码器进行读取。

利用定时器中断,我们可以对编码器进行采样,即每间隔一定的时间对编码器两个引脚进行读取。编码器引脚A和引脚PA11相连,编码器引脚B和PA10相连,首先将引脚A的状态保存在一个变量中,然后刷新引脚A的状态,通过比较A引脚前后两次的状态来决定是否对B引脚进行读取。


定时器中断函数:
  1. void TIM2_IRQHandler(void)//定时器2中断函数
  2. {
  3.         if(TIM_GetITStatus(TIM2,TIM_IT_Update))
  4.         {
  5.                 Pin11_LastStatus=Pin11_NowStatus;//保存上一次A引脚状态
  6.                 Pin11_NowStatus=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11);//刷新A引脚状态
  7.                 if(Pin11_LastStatus==1 && Pin11_NowStatus==0)//如果引脚上一次为高电平,这一次为低电平
  8.                 {
  9.                         if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0)//判断引脚B的状态
  10.                         {
  11.                                 i++;
  12.                                 if(i>20)i=0;
  13.                         }else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==1)//判断引脚B的状态
  14.                         {               
  15.                                 i--;
  16.                                 if(i<0)i=20;
  17.                         }
  18.                 }
  19.         }
  20.         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
  21. }
复制代码





数码管&amp;编码器.7z

1.06 MB, 下载次数: 33, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表