数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 4442|回复: 15

[STM] STM32用EC11问题 编码器容易出现跳动或没反应

[复制链接]
发表于 2022-4-13 22:06:40 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
各位坛友,最近玩STM32F030配EC11做频率和音量调整,编码器正反转容易出现跳动或者没反应,比如说转动1格数字不增加或者增加2,哪位高手能指点一下?


EC12Code_Scan函数放到定时器中断里面,主函数里面通过彩屏显示 ec11.Freq和ec11.Volu的值,定时时间从1-200ms都试过都不能正常

void EC12Code_Scan(void)
{
        static uint8_t isEC12StartActive=0;

        if(A_EC12==Bit_RESET && B_EC12==Bit_RESET)
        {
                isEC12StartActive = 1;
        }
        if(A_EC12==Bit_RESET && B_EC12!=Bit_RESET && isEC12StartActive)
        {
                ec11.Freq+=1; ec11.Volu+=1;
        }        
        if(A_EC12!=Bit_RESET && B_EC12==Bit_RESET && isEC12StartActive)
        {
                ec11.Freq-=1; ec11.Volu-=1;        
        }
}


初始化后循环显示
        while (1)
  {                        
                LCD_ShowxNum(0, 100, RED, BACK_COLOR, ec11.Freq,  6, 24, 0);
                LCD_ShowxNum(0, 150, GREEN, BACK_COLOR, ec11.Volu,  6, 24, 0);
  }

发表于 2022-4-14 00:04:04 | 显示全部楼层
不要用定时器中断, 用GPIO的外部中断, 比如用A相作为中断输入, 一旦发生边沿跳变,就触发中断, 在中断程序里,检测B相的电平, 再根据波形图判断旋转方向

当然纯软件判断也可以, 做成子程序放在主程序里循环扫描A相, B相的电平

相比中断更好些

检测程序是否完全正确, 也很简单, 标记一个位置, 正转10圈, 再反转10圈, 看看计数值是不是回到初始值, 只要不是,一定有漏

打赏

参与人数 2家元 +60 收起 理由
chenghelin + 50 熱心助人
家睦 + 10

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2022-4-14 00:44:58 | 显示全部楼层
1.没必要放中断里处理,不过,对STM32这种资源丰富的芯片来说,中断里处理也不会明显增加CPU负担,我一般在主循环中1mS读取一次,只要不转太快还跟得上。
2.读I/O时最好做短时间消抖,如十几个微秒消抖,我一般多读几次,取超过一半的状态为当前状态。
3.时序处理有问题,要根据厂家提供的时序图编写。
4.转动信息没有及时处理,一般转太快或者处理时间间隔过长引起。


打赏

参与人数 2家元 +60 收起 理由
chenghelin + 50 熱心助人
家睦 + 10

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-4-14 20:23:49 | 显示全部楼层
楼上说的挺好
回复 支持 反对

使用道具 举报

发表于 2022-4-14 21:40:35 | 显示全部楼层
编码器输出波形如下图。

可以这样简单处理:从A、B电平相同开始检测A、B变化沿(上升、下降均可),检测到两个变化沿后根据变化先后就知道旋转方向了。如上图假设a点是A、B同为高电平,b点处B变先为低电平,等A变为低电平后即认为有一次顺时针旋转动作。检测方法可以用边沿中断,也可以定时查询。

实际编码器输出有抖动,如下图。


一般只考虑图中的t1、t3,磨损严重的编码器才会出现t2情形,可以简单多次读取来减少误判。
如:
  1. #define        C_READ_TIMES        10

  2. unsigned char read_count,terminal_a_high,terminal_b_high;

  3.         read_count=C_READ_TIMES;
  4.         do
  5.         {
  6.      if(A高电平)
  7.                      {
  8.                                   terminal_a_high++;
  9.                      }
  10.                
  11.                      if(B高电平)
  12.                      {
  13.                                   terminal_b_high++;
  14.                      }
  15.         }while(--read_count);

  16.         if(terminal_a_high>=(C_READ_TIMES+1)/2)
  17.         {
  18.                      A=高电平;
  19.         }
  20.        
  21.         if(terminal_b_high>=(C_READ_TIMES+1)/2)
  22.         {
  23.                      B=高电平;
  24.         }
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2022-4-16 10:48:47 来自手机浏览器 | 显示全部楼层
你这有刷屏,估计放主程序里会有漏检现象,如果能用外部中断是最好了。实在不行还真的要在定时中断里检测,差不多1ms检测一次。引脚最好有对地电容消抖。电容值选择合适的。
回复 支持 反对

使用道具 举报

发表于 2022-4-17 08:25:50 | 显示全部楼层
中断处理比较可靠,轮询容易出问题
回复 支持 反对

使用道具 举报

发表于 2022-4-17 21:33:47 | 显示全部楼层
我原来用stm32是只加不减,后来按这个https://zhuanlan.zhihu.com/p/453130384写代码好了
回复 支持 反对

使用道具 举报

发表于 2022-6-27 15:51:56 | 显示全部楼层
不但要用中断,而且用两个中断。
在IO边沿中断里做正反转判断,拿一端做IO边沿中断,一端做电平判断,一共四种组合,其中两种是正转、两种是反转。然后设置一个位数足够大的全局变量,16位或者32位的。这个边沿中断里就做旋转方向判断然后增大或者减小变量值。
在主程序里,需要调用编码器的时候再开启定时器中断,以固定时间读取那个变量的值,把最近两次的值做比较就知道编码器是怎么旋转,旋转了多少了。
这样一个好处是通过设置合理的定时器时间间隔,能自然屏蔽掉抖动,在这段时间内不管它抖了几次,我们得到的是这段时间从开始到结束这边量的差值。
回复 支持 反对

使用道具 举报

发表于 2022-6-30 06:04:53 | 显示全部楼层
不知道要不要做消抖处理
回复 支持 反对

使用道具 举报

发表于 2022-6-30 08:34:34 来自手机浏览器 | 显示全部楼层
如果程序没问题那是不是硬件消抖电容用大了,还有就是编码器是一定位一脉冲还是两定位一脉冲要确定
回复 支持 反对

使用道具 举报

发表于 2022-6-30 10:58:25 | 显示全部楼层
用的比较多的是F103/105,有用过定时器正交编码输入模式,初始化之后直接读定时器CNT就可以。硬件自动计数,无需CPU干预,可识别正反转进行加减操作,可识别旋转速度进行不同增量的加减。
看你用的F030有没有编码器输入模式。
回复 支持 反对

使用道具 举报

发表于 2022-6-30 11:03:23 | 显示全部楼层
用F105定时器编码器输入模式,接入伺服电机驱动器的编码器信号,几百K都能正常识别,建议用硬件资源。
回复 支持 反对

使用道具 举报

发表于 2022-6-30 11:13:52 | 显示全部楼层
在学校做电赛的时候用ATMEGA16,用外部中断识别小车电机光栅,没有出现这类问题。
你这个是旋转编码器,手动转速也不快,可以考虑分别在A/B相加电容消抖滤波,103/104之类的电容,具体要看你接的上拉电阻多大。
再者,可以把编码器识别中断优先级设置为最高,反正在中断里计数耗时可以忽略,对你系统其他任务几乎没有影响。
回复 支持 反对

使用道具 举报

发表于 2022-6-30 13:42:24 | 显示全部楼层
我觉得主要问题应该是要加硬件消抖,试试并两个0.1uF的电容器。
回复 支持 反对

使用道具 举报

发表于 2022-6-30 15:30:57 | 显示全部楼层
njchenmin 发表于 2022-6-30 06:04
不知道要不要做消抖处理

硬件消抖比较好,可靠简单
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-19 13:02 , Processed in 0.265200 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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