一种单片机裸机系统开入量消除抖动的软件实现方法
下面介绍一种开关量消除信号抖动的方法,是我刚开始单片机编程时学到的,下面分享给大家,如有不足之处,请大家指正。
1、定义开关量结构体
typedef struct
{
uint32_t temp_value; //消除抖动前开关量过程值
uint8_t nonjitter_times; //无抖动计数值
uint8_t value; //消除抖动后开关量最终值
}virtualinput;
2、定义并初始化实际开关量变量
virtualinput input[9];//注意此处定于了9个开关量变量,实际工程中读取9个开关量
//数据初始化
void input_init(void)
{
int i;
for (i = 0; i < 9; i++)
{
input[i].nonjitter_times = 0;
input[i].temp_value = 0;
input[i].value = 0;
}
}
这里注意消除抖动前的开关量过程值
初始化开关量结构体变量
3、开关量的读取及移位保存图解
对应第五部分代码的第一部分数据的读取及保存
数据的移位保存过程
4、开关量消抖过程
对应第五部分代码的第二部分开关量的消除抖动
当读取开关量过程值的最后两位相同时,·证明输入的开关量信号没有改变(即没有抖动),因此需要取过程值input[i].temp_value的最后两位,分两种情况,结果为3(二进制11,即读取到开关量前后两次均为1)结果为0(二进制00,即读取到开关量前后两次均为0),则无抖动计数值加1,即input[i].nonjitter_times++;
当读取开关量过程值的最后两位不同时,无抖动计数值赋值为5,随后input[i].nonjitter_times--;注意无抖动值减小为0后自动赋值为5。
当无抖动计数20次时,此信号有效。
5、附录开关量信号读取函数
//开关量读入并消抖函数
void input_cortrol(void)
{
uint8_t i;
//第1部分数据的移位及存储
//对9个开关量结构体变量的过程值进行移位保存
for (i = 0; i < 9; i++)
{
input[i].temp_value <<= 1;
}
//新读到的开关量值存在开关量结构体末位
input[0].temp_value += (((GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_0) & 0x01) >> 0) & 0x01);
input[1].temp_value += (((GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_1) & 0x02) >> 1) & 0x01);
input[2].temp_value += (((GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_2) & 0x04) >> 2) & 0x01);
input[3].temp_value += (((GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_3) & 0x08) >> 3) & 0x01);
input[4].temp_value += (((GPIOPinRead(GPIO_PORTC_AHB_BASE, GPIO_PIN_5) & 0x20) >> 5) & 0x01);
input[5].temp_value += (((GPIOPinRead(GPIO_PORTC_AHB_BASE, GPIO_PIN_6) & 0x40) >> 6) & 0x01);
input[6].temp_value += (((GPIOPinRead(GPIO_PORTC_AHB_BASE, GPIO_PIN_7) & 0x80) >> 7) & 0x01);
input[7].temp_value += (((GPIOPinRead(GPIO_PORTA_AHB_BASE, GPIO_PIN_1) & 0x02) >> 1) & 0x01);
input[8].temp_value += (((GPIOPinRead(GPIO_PORTG_AHB_BASE, GPIO_PIN_0) & 0x01) >>0) & 0x01);
//第2部分,数据的消抖
//消除信号抖动
for (i = 0; i < 9; i++)
{ //前后两次数据检测的相同,计数加1
if ((input[i].temp_value & 0x03) == 0x00 || (input[i].temp_value & 0x03) == 0x03)
{
if (input[i].nonjitter_times < 20)
{
input[i].nonjitter_times++;
}
}
else
{
//数据发生变化
if ((input[i].temp_value & 0x06) == 0x00 || (input[i].temp_value & 0x06) == 0x06)
{
input[i].nonjitter_times = 5;
if (input[i].nonjitter_times > 0)
{
input[i].nonjitter_times--;
}
}
}
//计算20次,认为信号有效
if (input[i].nonjitter_times == 20)
{
input[i].value = ~(input[i].temp_value) & 0x01;
}
if (input[i].nonjitter_times == 0)
{
input[i].nonjitter_times = 5;
}
}
单片机学习——按键消抖
简单的说,进入了电子,不管是学纯模拟,还是学单片机,DSP、ARM等处理器,或者是我们的FPGA,一般没有不用到按键的地方。按键:人机交互控制,主要用于对系统的控制,信号的释放等。因此在这里,FPGA上应用的按键消抖动,也不得不讲!
通常的按键所用开关为机械弹性开关。由于机械触电的弹性作用,按键在闭合及断开的瞬间均伴随有一连串的抖动。键抖动会引起一次按键被误读多次。为了确保CPU对键的一次闭合仅作一次处理,必须去除抖动。 消除抖动的方法有硬件和软件两种方法。硬件方法常用RS触发器电路。软件方法是当检测出键闭合后执行一个10ms~20ms的延时程序,再一次检测键的状态,如仍保持闭合状态,则确认真正有键按下。
一、为什么要消抖动
如上图所示,在按键被按下的短暂一瞬间,由于硬件上的抖动,往往会产生几毫秒的抖动,在这时候若采集信号,势必导致误操作,甚至系统崩溃;同样,在释放按键的那一刻,硬件上会相应的产生抖动,会产生同样的后果。因此,在模拟或者数字电路中,我们要避免在最不稳定的时候采集信号,进行操作。
对此一般产用消抖动的原理。一般可分为以下几种:
(1)延时
(2)N次低电平计数
(3)低通滤波
在数字电路中,一般产用(1)(2)种方法。后文中将详细介绍。
二、各种消抖动
1. 模拟电路按键消抖动
对于模拟电路中,一般消抖动用的是电容消抖动或者施密特触发等电路,再次不做具体介绍。
2. 单片机中按键消抖动
对于单片机中的按键消抖动,本节Bingo根据自己当年写过的单片机其中的一个代码来讲解,代码如下所示:
unsigned char key_sCAN(void)
{
if(key == 0) //检测到被按下
{
delay(5); //延时5ms,消抖
if(key != 0)
retrurn 0; //是抖动,返回退出
while(!key1); // 确认被按下,等下释放
delay(5); //延时5ms,消抖
while(!key1); //确认被释放
return 1; //返回按下信号
}
return 0; //没信号
}
针对以上代码,消抖动的顺序如下所示:
(1)检测到信号
(2)延时5ms,消抖动
(3)继续检测信号,确认是否被按下
a) 是,则开始等待释放
b) 否,则返回0,退出
(4)延时5ms,消抖动
(5)确认,返回按下信号,退出
当然在单片机中也可以循环计数来确认是否被按下。
相关问答
单片机 按键怎么消抖-ZOL问答按键消除抖动用硬件的方法是单稳态电路,或者采用专用芯片,而单片机本身是智能芯片,用软件消除抖动是最佳选择,这样性价比高,可靠性也高,多用一个器件就多一份成...
51 单片机 ,用按键实现外部中断,软件如何去抖?定时中断里设置一个记录按下时间的static变量t按下按键则将t++(注意不要加到溢出)松开按键,检测tt定时中断里设置一个记录按下时间的static变量t按下...
单片机 控制强电设备时,如何防止干扰?像PLC一样供电独立出来输入输出使用光耦继电器进行隔离单片机的防抖动像PLC一样供电独立出来输入输出使用光耦继电器进行隔离单片机的防抖动
51 单片机 按键释放时候为什么不用消抖?释放就释放了,程序只管往下走,抖动又有什么关系由于按键按下有消抖,所以按键释放的抖动绝对不会又被当作按键按下的信号按键按实了,就不会抖动既然检测...
单片机 复位电路,按下k键电容C11为什么能放电?我是电子及工控技术,我来回答这个问题。作为单片机最小系统之一的复位电路在单片机中占有很重要的位置,今天我就和朋友们聊聊这方面的事。复位电路介绍一般来...
如何提高 单片机 程序的可靠性、实时性、测量准确性?题主提到的单片机程序的可靠性、实时性,软件架构起着决定性的作用,单片机程序的软件架构有以下几点需要考虑:1)分层分模块单片机程序至少分为三个层次,包...
51 单片机 中断唤醒-ZOL问答2、加按键去抖动(延时)3、中断返回不用return图,代码。光是这么空口说无法判断。看看以前的问题与解答,也许有帮助。键入:STC89系列单片机掉电模式或者休...
单片机 如何驱动数码管?(...设置全局变量a,把a拆成个位十位以参数形式传给数码管显示函数。按键:方法1:主函数中查询K1、K2是否被按下(注意消抖)。if(K1==0){delay();//...
车停放久了后启动时 抖动 是怎么回?车子停了一个星期启动很抖一般是机油老化变质,油路出现气阻导致的,刚刚启动的时候出现抖动是正常现象,更换一下机油机滤,深踩几脚油门将油路中的气阻排出,就...
请问 单片机 的按键信号输入为什么都有加一个电容?是延迟作用...按键下去的时候会产生抖动,如果你单片机程序没有规避的话,加一个电容是很好的选择,在你采集信号的时候会保证不出错。电阻加电容并联在按键两端,是硬件消抖其...