龙空技术网

嵌入式C语言中输入信号检测的实现

嵌入式与汽车电子 830

前言:

此时我们对“怎么在c语言中打出矩阵”大概比较着重,各位老铁们都需要知道一些“怎么在c语言中打出矩阵”的相关内容。那么小编在网摘上搜集了一些对于“怎么在c语言中打出矩阵””的相关文章,希望你们能喜欢,姐妹们一起来了解一下吧!

汽车电子产品的输入信号,一般分为两种形式:

1、硬线输入

2、总线输入

硬线输入信号

所谓硬线输入,也叫硬线触发,就是外部直接输入高低电平数字信号。在乘用车12V供电电源系统中,12V电源正(B+)就是逻辑高电平,0V地(GND)就是逻辑低电平。外部的高电平需要进行电压变换,再交给单片机处理。如下图所示,

通过电阻分压将12V转成5V,这样单片机就可以直接处理了。还可以在输入口这里并个0.1微法的电容,既可以用来滤波,也可以防静电。

硬线触发一般也分为两种形式:状态触发和动作触发。

状态触发

所谓状态触发,就像自锁开关的输入信号,常态松开是低电平接入,按一下切换到另一个状态变成高电平,产生有效输入信号,也就产生了状态触发,并且开关自身一直维持这种状态,只到再次触发按键。

其实,车上很多开关是自锁开关。比如,车灯开关、雨刮开关等。雨刮开关检测API定义,

#define ChkWiperState()    (PIN_WIPER == 1)

动作触发

所谓动作触发,与状态触发不同。它是由状态的变化产生触发信号。我们还是以开关为例,但是动作触发对应的开关是自复位开关。假设自复位开关的常态是低电平接入,按下开关输入电平由低电平变为高电平,从而产生上跳沿的有效输入信号,也就产生了动作触发,松开开关,开关再次自动恢复到常态,也就是低电平接入状态。

其实,车上的自复位开关也挺多的。比如,车窗升降开关,电子驻锁开关等。车窗升降开关API定义,

#define ChkWinKeyUpState()    (PIN_UP == 1)#define ChkWinKeyUpLastState()    (PIN_UP_LAST == 1)#define ChkWinKeyUpAction()    (ChkWinKeyUpState() && (!ChkWinKeyUpLastState()))

根据定义,实际上在原有状态检测的基础上,增加了两个宏定义:

1、ChkWinKeyUpState():当前状态的检测,也就是现在状态的检测。

2、ChkWinKeyUpLastState():上个时基的状态检测,也就是过去状态的检测。关于“时基”的概念,我之前有文章专门谈到过。

3、ChkWinKeyUpAction():动作检测,实际上是同时检测当前状态和过去的状态组合,也就是检测状态的变化。

在汽车电子产品中,除了硬线信号输入,还有很多信号是从总线上输入的。

总线输入信号

汽车总线,主要是LIN总线和CAN总线。这里以CAN总线为例,

图中TJA1042是CAN收发器,一般都单片机都不带CAN的收发器,因此需要外扩。单片机出来的CAN总线是TX/RX,再由CAN收发器转换成CANH/CANL信号后,再在总线上传输。

其实,对于总线信号的处理,和硬线信号的处理差不多,只是信号来源不一样罢了。

比如,在CAN总线上检测ACC信号的动作,

#define ChkCanACCState()    (CAN_BCM_ACC)#define ChkCanACCLastState()    (CAN_BCM_ACC_LAST)#define ChkCanACCAction()    (CAN_BCM_ACC && (!CAN_BCM_ACC_LAST))

这里发现API定义和之前的其实差不多,只不过这里的CAN_BCM_ACC信号,不是直接来源于硬件IO口,而是来自于CAN总线信号矩阵的解析。

对于系统中的输入信号,实际上都存在一个很重要的问题,那就是针对输入信号的滤波。

输入信号滤波

硬线信号的滤波,也叫按键去抖。这在软件上有专门的处理逻辑,就是针对输入有效信号的判定,不直接检查跳变沿,不能做瞬时判定,而需要连续扫描检测。判定原理就是,当有效信号产生时,进入有效信号判定逻辑,连续扫描检测若干个时基,比方是40毫秒内,信号持续有效才判定为有效触发,否则判定为无效触发,并退出检测逻辑。这里的40毫秒就是我们说的去抖时间(debunce time)。

总线信号的滤波,则有所不同。一般以收到的帧数作为判定条件,比如连续收到3帧以上有效帧,才能判定为有效输入信号。如果收到两帧,或者不连续的3帧,这里当然指的是有效帧,都应该判定为无效输入信号。

标签: #怎么在c语言中打出矩阵 #c语言检测用户输入