OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3020|回复: 7

自创的编码器消抖算法,效果很不错

[复制链接]

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2020-6-30
在线时间
19 小时
发表于 2020-8-22 10:35:49 | 显示全部楼层 |阅读模式
编码器一般分为AB两项,我们可以通过外部下降沿中断检测A项,同时在中断响应函数中检测B项的电平状态,若为高,则累加,若为低,则递减。
中断检测A项的下降沿往往会遇到毛刺干扰,硬件消抖,一般可以加上104电容。软件消抖:在下降沿中断触发时,可以通过延时消抖,这里没有任何问题,
但是大家往往会忽略A项上升沿时产生的错误下降沿抖动,若此时继续检测B项电平,则会导致编码器计数错误。本人设计了一中编码器消抖算法,
实验效果非常好。
中断中代码如下:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
        if(GPIO_Pin == Encoder_exti_Pin)               
        {
                HAL_Delay(1);                                                 //==使用延时不能过长,否则当电机速度较快时会出错
                if(HAL_GPIO_ReadPin(Encoder_exti_GPIO_Port,Encoder_exti_Pin) == GPIO_PIN_RESET)       //==核心是这句话,延时过之后,重新检测中断引脚的电平,以保证是正常触发,而不是抖动触发
                {
                        if(HAL_GPIO_ReadPin(Encoder_input_GPIO_Port,Encoder_input_Pin) == GPIO_PIN_SET)
                        {
                                if(encoder_inf.Encoder_speed < 0) encoder_inf.Encoder_speed = 0;
                                encoder_inf.Encoder_accum++;
                                encoder_inf.Encoder_speed++;
                        }
                        else
                        {
                                if(encoder_inf.Encoder_speed > 0) encoder_inf.Encoder_speed = 0;
                                encoder_inf.Encoder_accum--;
                                encoder_inf.Encoder_speed--;
                                if(encoder_inf.Encoder_accum <= 1)encoder_inf.Encoder_accum = 1;
                        }
          }               
        }
}

一点小心得,分享给大家。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2020-6-30
在线时间
19 小时
 楼主| 发表于 2020-8-27 15:11:27 | 显示全部楼层
大家一口咬住中断里不能加Delay()。能不能加难道不是根据系统的实际情况?如果这Delay影响到了那自然是不能加的
回复 支持 1 反对 0

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4504
金钱
4504
注册时间
2018-5-14
在线时间
962 小时
发表于 2020-8-22 11:27:49 | 显示全部楼层
中断里面加Delay(1),赞
回复 支持 反对

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2020-8-22 13:00:26 | 显示全部楼层
姚先起 发表于 2020-8-22 11:27
中断里面加Delay(1),赞

没有办法, 跑得快嘛.
回复 支持 反对

使用道具 举报

6

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2020-5-18
在线时间
165 小时
发表于 2020-8-22 13:02:23 | 显示全部楼层
你这思路就有问题啊,编码器任一路电平变化都会引起计数变化的,按你说的在A路里检测B路的电平来计数,换句话说就是当A不变,B变时你是不计数的了?这计数还能准确吗?
回复 支持 反对

使用道具 举报

0

主题

26

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-8-25
在线时间
4 小时
发表于 2020-8-26 15:56:53 | 显示全部楼层
回复 支持 反对

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2020-8-26 17:27:56 | 显示全部楼层
这只能算伪消抖。而且中断里使用Delay是大忌。
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-4-15
在线时间
18 小时
发表于 2020-8-27 10:48:55 | 显示全部楼层
也不知道使用delay 你这程序会有多少中断嵌套。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 13:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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