[应用相关] STM32驱动_旋转编码器EC11

[复制链接]
 楼主| hehhehee 发表于 2022-7-27 18:41 | 显示全部楼层 |阅读模式
STM32驱动_旋转编码器EC11

前言:经过做项目了解了旋转编码器的原理,大白话讲就是正反旋转输出两种相位差不同的波形,我们程序解析这段波形就可以了
波形如图:使用示波器和逻辑分析仪采集波形都印证这个图是正确的


6388662e1163700565.png


 楼主| hehhehee 发表于 2022-7-27 18:41 | 显示全部楼层
分析这个图,找一种最简便的方法采集和判断(只用一个定时器即可),判断这个变化过程就可以知道此时是正转还是反转
说明:使用定时器中断只能判定是正转还是反转,如果需要采集当前的旋转数字具体是多少,需要在main函数中判断
5768862e1166e37f24.png
 楼主| hehhehee 发表于 2022-7-27 18:42 | 显示全部楼层
  1. void TIM4_IRQHandler(void)   //3ms定时器定时中断(自己随意设定2ms~10ms应该都可以)
  2. {
  3.         static int a = 0,b = 0,c = 0,d = 0;
  4.         if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  
  5.         {
  6.                 TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
  7.                 {
  8.                         c = SCENE_KEY1;  //读取编码器引脚状态
  9.                         d = SCENE_KEY2;  //读取编码器引脚状态
  10.                         if(a == 0 && b == 0)
  11.                         {
  12.                                 if(c == 1 && d == 0)
  13.                                 {
  14.                                         Ec_status = 1;//正转
  15.                                 }
  16.                                 if(c == 0 && d == 1)
  17.                                 {
  18.                                         Ec_status = 2;//反转
  19.                                 }
  20.                         }
  21.                         a = c;           
  22.                         b = d;  //a,b保存前一次引脚采集到的状态
  23.                 }
  24.         }
  25. }

  26. //实际在main函数中使用时
  27. int main()
  28. {
  29.         int Ec_count = 0;  //旋转编码器当前的数值(取值范围0~10)
  30.         while(1)
  31.         {
  32.                 if(Ec_status == 1)
  33.                 {
  34.                         Ec_count++;
  35.                         if(Ec_count > 10)
  36.                         {
  37.                                 Ec_count = 10;
  38.                         }
  39.                 }
  40.                 else if(Ec_status == 2)
  41.                 {
  42.                         Ec_count--;
  43.                         if(Ec_count < 0)
  44.                         {
  45.                                 Ec_count = 0;
  46.                         }
  47.                 }
  48.                 delay_ms(5);
  49.         }
  50. }
 楼主| hehhehee 发表于 2022-7-27 18:43 | 显示全部楼层
旋转编码器硬件电路也需要注意几点
1、旋转编码器旋转过程中也是有毛刺需要消抖的,软件消抖或是硬件消抖(建议是硬件,加个电容即可)
 楼主| hehhehee 发表于 2022-7-27 18:43 | 显示全部楼层
2、以下是参考电路,加了那个100NF的电容之后,使用示波器观察,几乎看不到抖动的毛刺,软件就简单了,不需要消抖
 楼主| hehhehee 发表于 2022-7-27 18:44 | 显示全部楼层
 楼主| hehhehee 发表于 2022-7-27 18:44 | 显示全部楼层
gaoyang9992006 发表于 2023-9-5 21:02 | 显示全部楼层
dingy 发表于 2023-9-5 23:42 | 显示全部楼层
楼上降维打击
Undshing 发表于 2023-9-7 23:04 | 显示全部楼层
消抖的电容容量有什么讲究吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

1251

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

88

主题

1251

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部