41363|54

180

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

大家有什么好的外部中断按键去抖的方法吗??都快崩溃了。。。 [复制链接]

 
大家有什么好的外部中断按键去抖的方法吗??因为比赛的需要,要让输出步进可调,所以打算在外部中断里面改输出值,但是按键抖个不停啊,已经软件延时消抖了,还是抖啊。用的是stm32f407。
代码如下,有什么需要改的吗??
  1. void EXTI2_IRQHandler(void)
  2. {
  3.   EXTI->IMR&=~(1<<2);
  4.   if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)==0)         
  5.   {
  6.     delay_ms(30);
  7.     if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)==0)
  8.     {
  9.       vtg-=200;
  10.       DAC_SetVol(vtg);
  11.     }
  12.   }
  13.   EXTI_ClearITPendingBit(EXTI_Line2);  
  14.   EXTI->IMR|=1<<2;
  15. }
复制代码

此帖出自stm32/stm8论坛

最新回复

觉得42楼和52楼说的才是重点,网上都是千篇一律的查询方法,重点是如果一定要在掉电模式下用外部中断中唤醒然后去抖,之后的操作又不影响主程序中采样的连续性的方法,这也是我想知道的,但没有人发这方面的详细解释。如果是定时器轮询或利用程序延时的方法我想信很多人都或多或少知道一点。  详情 回复 发表于 2018-8-11 20:44
点赞 关注
 

回复
举报

4997

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
改用扫描方式,或在端口上并联个104看看,也可以用示波器看看,抖动时间为多少,然后在用相应的软件延时取抖。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 
中断IO口设置有问题吧?
此帖出自stm32/stm8论坛

点评

不是吧,帮忙看看呢。  详情 回复 发表于 2015-4-29 17:55
 
 

回复

1149

帖子

3

TA的资源

五彩晶圆(初级)

4
 
一个按键给一个中断好浪费是说,在其他任务里面定时(比如100ms)查询一次多好
此帖出自stm32/stm8论坛

点评

本来是想在定时器中断里面查询的。。。但是频繁进中断会不会对正在运行的程序产生影响??  详情 回复 发表于 2015-4-29 18:00
 
个人签名construction complete!
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

5
 
楼主的 " 软件延时消抖 " 的延迟时间再调长一些。
此帖出自stm32/stm8论坛

点评

估计要多长呢。。。  详情 回复 发表于 2015-4-29 17:59
 
 
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

6
 
Study_Stellaris 发表于 2015-4-29 17:34
中断IO口设置有问题吧?

不是吧,帮忙看看呢。
  1. void Key_Init()
  2. {
  3.   GPIO_InitTypeDef GPIOC_InitStruct;
  4.   GPIOC_InitStruct.GPIO_Mode=GPIO_Mode_IN;
  5.   GPIOC_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  6.   GPIOC_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
  7.   GPIOC_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  8.   GPIO_Init(GPIOC,&GPIOC_InitStruct);
  9. }
复制代码
  1. void Exti_Init()
  2. {
  3.   NVIC_InitTypeDef NVIC_InitStruct;
  4.   EXTI_InitTypeDef EXTI_InitStruct;
  5.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
  6.   SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource0);
  7.   SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource1);
  8.   SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource2);
  9.   SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource3);
  10.   
  11.   EXTI_InitStruct.EXTI_Line=EXTI_Line0|EXTI_Line1|EXTI_Line2|EXTI_Line3;
  12.   EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
  13.   EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
  14.   EXTI_InitStruct.EXTI_LineCmd=ENABLE;
  15.   EXTI_Init(&EXTI_InitStruct);
  16.   
  17.   NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0
  18.   NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级3
  19.   NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  20.   NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  21.   NVIC_Init(&NVIC_InitStruct);//配置
  22.        
  23.        
  24.   NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn;//外部中断1
  25.   NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级3
  26.   NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  27.   NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  28.   NVIC_Init(&NVIC_InitStruct);//配置
  29.        
  30.        
  31.   NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn;//外部中断2
  32.   NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1
  33.   NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  34.   NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  35.   NVIC_Init(&NVIC_InitStruct);//配置
  36.   
  37.   NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;//外部中断3
  38.   NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1
  39.   NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  40.   NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  41.   NVIC_Init(&NVIC_InitStruct);//配置
  42.   
  43. }
复制代码


此帖出自stm32/stm8论坛
 
 
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

7
 
dontium 发表于 2015-4-29 17:51
楼主的 " 软件延时消抖 " 的延迟时间再调长一些。

估计要多长呢。。。
此帖出自stm32/stm8论坛

点评

根据情况决定去抖时间。但一般要长一0.1S才对,--------- 自己可以感觉一下,按一次键的时间会有多长,保证长于最短时间  详情 回复 发表于 2015-4-29 21:07
 
 
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

8
 
zqjqq88 发表于 2015-4-29 17:38
一个按键给一个中断好浪费是说,在其他任务里面定时(比如100ms)查询一次多好

本来是想在定时器中断里面查询的。。。但是频繁进中断会不会对正在运行的程序产生影响??
此帖出自stm32/stm8论坛

点评

你哥while循环能有多长呀,假如100ms查询一次只是转态而已,很快滴~  详情 回复 发表于 2015-4-30 09:07
 
 
 

回复

3414

帖子

0

TA的资源

纯净的硅(高级)

9
 
不嫌硬件麻烦的话
外加锁存器或者触发器
此帖出自stm32/stm8论坛
 
个人签名

So TM what......?

 

 

回复

954

帖子

0

TA的资源

纯净的硅(初级)

10
 
有硬件消抖电路啊
此帖出自stm32/stm8论坛
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

11
 
触发器硬件去抖动
此帖出自stm32/stm8论坛
 
个人签名最近研究STM32,会对库函数的源代码进行解读,会陆续更新
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

12
 
jianping-sun 发表于 2015-4-29 17:59
估计要多长呢。。。

根据情况决定去抖时间。但一般要长一0.1S才对,--------- 自己可以感觉一下,按一次键的时间会有多长,保证长于最短时间
此帖出自stm32/stm8论坛
 
 
 

回复

449

帖子

0

TA的资源

纯净的硅(中级)

13
 
真是麻烦透顶,为何要用中断?只有需要快速响应的地方才会用中断,按键这种地方不但不需要快速响应,响应快了反而会带来更多问题。别用中断了,改用扫描吧。每几十ms读一次,每两次值一样时才当成一次正确的值。
此帖出自stm32/stm8论坛

点评

额。。。其实是AGC电路要快速调整输出电压,而且需要步进,所以才在中断里面处理的,在主函数里面两个while(1)死循环  详情 回复 发表于 2015-4-29 22:56
 
 
 

回复

3471

帖子

11

TA的资源

五彩晶圆(高级)

14
 
可以不用中断判断,主循环中,查询,检测到按键按下,延时0.1s判断一次,如果符合,再延时0.1s判断一次。
此帖出自stm32/stm8论坛

点评

主要问题是主函数两个子函数都是死循环  详情 回复 发表于 2015-4-29 22:56
 
 
 

回复

1万

帖子

142

TA的资源

版主

15
 
50--100mS后再次读,然后比较数值,必要时可连续判断两次。这是常规消抖算法,如果还有问题,说明要么你编程有误,要么开关有问题。
此帖出自stm32/stm8论坛

点评

要50-100ms那么久啊。。。。我可以保证中断进去了  详情 回复 发表于 2015-4-29 22:54
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

16
 
chunyang 发表于 2015-4-29 22:45
50--100mS后再次读,然后比较数值,必要时可连续判断两次。这是常规消抖算法,如果还有问题,说明要么你编程有误,要么开关有问题。

要50-100ms那么久啊。。。。我可以保证中断进去了
此帖出自stm32/stm8论坛
 
 
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

17
 
Aragorn 发表于 2015-4-29 21:24
真是麻烦透顶,为何要用中断?只有需要快速响应的地方才会用中断,按键这种地方不但不需要快速响应,响应快了反而会带来更多问题。别用中断了,改用扫描吧。每几十ms读一次,每两次值一样时才当成一次正确的值。

额。。。其实是AGC电路要快速调整输出电压,而且需要步进,所以才在中断里面处理的,在主函数里面两个while(1)死循环
此帖出自stm32/stm8论坛

点评

只要是人按的,再快也快不到哪里去。你拿个按键试下,你1秒钟能不能按10次?即便能按10次,每次也才100ms。给你建议如下: 1. 系统里面做一个周期定时中断,比如1ms定时一次,用一个变量在定时中断中做加1计数,  详情 回复 发表于 2015-4-30 11:09
 
 
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

18
 
ienglgge 发表于 2015-4-29 21:50
可以不用中断判断,主循环中,查询,检测到按键按下,延时0.1s判断一次,如果符合,再延时0.1s判断一次。

主要问题是主函数两个子函数都是死循环
此帖出自stm32/stm8论坛

点评

尽量不要用死循环。这样容易使系统卡死。可以设置一个限制。每部分都有最大执行时间,超过,就退出。  详情 回复 发表于 2015-4-30 21:08
 
 
 

回复

4005

帖子

0

TA的资源

版主

19
 
别死循环,看,记状态,去干别的,再看,比较出结果
此帖出自stm32/stm8论坛
 
 
 

回复

1792

帖子

0

TA的资源

五彩晶圆(初级)

20
 
同意上面大部分人的意见,使用扫描法,中断里最好不要加延时
你的程序框架不是很好,可以学习下时间片编程
此帖出自stm32/stm8论坛

点评

时间片编程是啥???有什么资料参考的么  详情 回复 发表于 2016-1-25 15:55
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表