基于定时中断的实时按键任务处理设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于定时中断的实时按键任务处理设计
符潇天, 黄明,彭召敏,张轩,崔进宝
(北方工业大学电子信息工程学院,北京 100144)
摘 要: 设计一种接收传感数据、转换、回传上位机的高速度、高质量实时按键任务处理方法。根据定时器抽样扫描设计思路,构建按键扫描逻辑框图,进而构建按键事件处理逻辑框图,在STM32、AVR单片机硬件环境和C语言软件环境下进行评测。在长按、短按各3组测试中,每组100次按键输入检测准确率为100%,有效规避了按键抖动和外部干扰。此外,对多按键识别中可能造成的逻辑错误特例进行了分析,给出了改进的时序图。该设计具有较大的应用优势。关键词: 定时中断;实时按键;按键消抖;外部干扰
中图分类号:TP 302 文献标识码:A 文章编号
:2095-8412 (2018) 02-024-05工业技术创新 URL : http: // DOI : 10.14103/j.issn.2095-8412.2018.02.007
引言
工业监控设备在工作时,要求CPU 主程序实时、不间断地接收、处理和显示来自多个传感器的数据并回传上位机。接收传感数据、转换、回传上位机的过程,不仅需要高速度,也需要高质量,这对主程序实现用户按键检测、提高用户操作体验提出了较高要求:一是要处理按键防抖,稳定、准确识别用户按键,不能一键多判;二是要实时处理,不能漏判用户按键操作。
本文提出一种基于定时器中断的实时按键后台缓冲检测方法,可以在占用少量CPU 资源的情况下准确、可靠地实现按键的实时检测;也可以在不影响CPU 处理高速传感数据和进行高速数据传输的情况下,简化低速按键信号的实时识别处理过程。
1 定时器抽样扫描
定时器抽样扫描可以改善单片机编程在一个主程序中常用按键检测的缺点,其中重点引入了缓冲队列设计,以对接高速CPU 和低速输入设备,保证按键事件不漏判。
图1 按键时序图
1.1 设计思路
使用定时器产生一个定时中断,每当检测到中
断,就对按键进行一次抽样[1,2]。判断此时按键的抽样值,当判断到按键按下时,记录按键时间;当判断到按键抬起时,将该段时间送入到单一深度的按键事件队列等待处理。
图1记录了该方法的基本时序,其中定时器中断为上升沿有效。可以看出,按键时长可由定时器设定的时间长度和时长计数计算得出。时长计数器在按键弹起后很快清空,而事件队列则会等待至该按键事件被处理时清空。这个队列设计在程序运行一周,当时长大于定时器抽样时长时,仍然可以保证程序能稳定地处理按键事件,但事件处理和按键动作之间会产生较大的延时,这个延时的长度是由程序的运行时长决定的。
1.2 按键扫描
要实现按键扫描,每个按键需要两个变量:Button_Time 和Button_Event ,前者用于记录按键按下的时间,后者作为一深度按键事件队列。当定
符潇天,等:基于定时中断的实时按键任务处理设计
图2 按键扫描逻辑框图
时器中断到来时,对按键进行抽样判决:若判断按键为按下状态,无论此前此后按键的动作如何,都对Button_Time 变量加1,当定时器中断为T ms 时,Button_Time 变量即作为一个T ms 精度的计时器,记录按键按下的时间;若判断按键为弹起状态,无论此前此后按键的动作如何,判断Button_Time 变量是否为0,若不为0,则将其值送入事件队列Button_Event 中,并将Button_Time 清零,以等待下次按键计数。图2所示为按键扫描的逻辑框图。此方法中,中断仅包含两个简洁判断和一个计数累加,可避免因中断过长而干扰主程序的运行逻辑。
2 按键事件处理
2.1 实现方法
经过章节1.2的方法进行扫描后,按键的按下时间已经被记入按键事件队列中等待处理。当主程序需要检查按键输入时,将会调用按键事件处理函数来排除外部干扰、判断按键的长短按。处理按键事件时,通过判断Button_Event 的值来确定按键是否被按下过,并确定按下时间的长短。长短按判决条件为人为设置的时间门限。以20 ms 计时器为例,可将0、1两值判定为按键未按下,此举可以进一步提高按键抗干扰性能;将2~25的值(500 ms 以下)判定为短按;25以上的值(500 ms 以上)判定为长按。在实际测试中可以发现,短按时间一般在100~160 ms (对应5~8的值),500 ms 的判定较为合适。图3为按键事
件处理的逻辑框图。经过章节1.2和2.1的处理,用户按键可以被实时检测,不会丢失。
2.2 按键消抖与外部干扰消除
在单片机使用到独立/矩阵按键时,按键消抖也是必须要考虑的因素,但本文介绍的方法无需额外处理。一般按键抖动时间在5~10 ms 之间[3],只要定时器设定抽样时间大于这个值,按键抖动就不会对计数判断产生影响。图4反映了按键抖动时的计数器动作,其中定时器中断为上升沿有效。由时序图可知,本方法可能会在按键抖动期间产生一个±1的计数误差。
该误差在进行短按判决时可通过设定判决门限剔除,而在长按时,由于误差通常低于计时精度,因此不会影响到长按判决。但是该误差可能会引起队列中被错误地置入一个1计数时长的按键事件,因而在判决按键未按下时,应当设定一定的下限来提高可靠性,这也正是章节2.1中将0、1判决为按键未按下的主要原因。
3 评测
3.1 评测环境
(1)硬件环境:单片机STM32F103RBT6和A VR ATmega32u4-MU ;
(2)软件环境:C 语言,关键代码见附录[4]。
3.2 评测方案
使用AVR 单片机随机产生100个100~300 ms
的
2018年第02期
工业技术创新Industrial Technology Innovation 图4 带有按键抖动的时序图
图3 按键事件处理逻辑框图
低电平模拟按键按下,在电平下降沿加入5个2 ms 电平翻转模拟按键抖动,每两次按键模拟之间插入500~1 500 ms 的随机间隔,输入到STM32的GPIO 口,STM32在GPIO 口上进行按键检测。STM32主程序中驱动一块LCD 显示屏,实时显示检测到的按键次数,并将当前按键次数通过串口返回PC 记录。每100次按键模拟完成后,复位STM32单片机,重复以上测试3组。
将低电平时长延长至700~1 000 ms ,以模拟长按动作,每组模拟100次,重复以上测试3组。
3.3 评测结果
共计6组测试中,STM32均能准确检测到100次按键输入。证明了该方法可靠有效,实时性良好。
4 多按键识别特例
在多按键识别问题中,为每个按键配备一个单
一深度事件队列来处理多个按键的输入,当多个按键事件产生后,主程序仅在需要时识别单一按键事件,此举可以有效降低按键事件处理的工作量[5],但此时必须清空全部按键事件队列以避免一个严重
的逻辑错误。下面通过一个简单的例子来解释这个错误。
设计一个程序,当Button1按下时进入一个任务,该任务自动重复执行,且在每次执行完成后检测Button2,若Button2被按下则停止此任务。图5a 为此程序的时序图。
假设该程序在处理Button1事件时仅清空Button1事件队列,当Button2先于Button1被按下时,此处会产生一个致命的逻辑错误,该错误使得用户未按下Button2而任务却自动结束,这显然违背的用户的操作意图。图5b 为此错误的时序图。
若程序在处理Button1事件时清空了Button1和Button2事件队列,则程序可以达到设计目的。图6为程序纠正逻辑错误后的运行时序。
5 讨论与结论
(1)本方法可以在多种单片机上使用,经过在STM32、AVR 单片机上的测试,此方法对按键的识别比采用阻塞式按键消抖的循环扫描更加灵敏,且具有良好的抗干扰、抗机械抖动的能力。
(2)按键事件处理方法在简单的程序和复杂的程序上均表现出优良的稳定性:在复杂的程序中,中断与队列的设计保证了无论按键何时按下,程序总能在运行到按键检测时准确地获得按键事件;在简单的程序中,按键检测不会占用CPU 过多时间,提高了主程序的运行速度,也不会影响到前台其他功能,在CPU 任务繁重时具有极高的应用优势。
总而言之,在工业互联网、物联网发展的时代,解决传感数据的准确采集很重要,是后端数据处理的关键源头。在复杂环境中工作的单片机,本文研发的较精准实时按键任务处理设计具有一定的参考价值。基金资助
本课题受到北方工业大学电子信息工程学院、北京市大学生科学研究与创业行动计划项目的资助
与支持。