【《硬件架构的艺术》读书笔记】08 消抖技术
8.1 简介
在电子设备中两个金属触点随着触点的断开闭合便产生了多个信号,这就是抖动。消抖使用来确保每一次断开或闭合触点时只有一个信号起作用的硬件设备或软件。(说人话就是每次断开闭合只对应一个操作)。
抖动在某些模拟和逻辑电路中可能产生问题,因为这些电路反应太快会将开关脉冲误当作数据流。
时序逻辑数字电路特别容易收到触点抖动的影响。开关抖动产生的电压波形干扰正常逻辑电路的振幅和时序规格要求。结果是亚稳定性、竞争、小脉冲和故障等问题导致电路失效。
8.2 开关行为
若开关用于开灯或启动风扇马达,则触点抖动基本没有影响,但是用作数字计数器、个人计算器或微处理器等设备的输入,由于触点抖动就会产生问题。计数器会多次计数而不是一次计数。
原因:触点停止抖动所化时间大约是毫秒级,数字电路能在ms甚至ns内响应。
通常的解决方法:消抖设备或软件可以确保在一个给定时间内(ms级)仅有唯一数字信号记录。
8.3 开关种类
上面是常见的一些开关种类,看一下了解一下就行了。
8.4 消抖
8.4.1 RC消抖
和一个一阶RC低通滤波器差不多,通过电容充放电实现了滤掉高频信号的功能。这种电路可以承受某些抖动但不完全消除它们。
通过调节RC可以在开关断开时,使电压在抖动停止前一直低于门电路的逻辑1。潜在的副作用:如果时间常数过大则对快速断开或闭合可能无法反应。合上开关反之同理。
若没有R2,也能很好的消除抖动。但是由于时间常数(RC)变小,充放电更快,会导致抖动。R2使电容器慢速充电,达到更好的滤波效果。电阻同样限制了流经开关触点的电流,防止电容器瞬间大量电涌烧坏触点。
最后,开关的状态信息实际上不是数字的,因此使用它控制类似于开关集成电路的电路不会很有效。为了正确使用开关状态信息,需要基本的AD转换。
逻辑门电压有某个电压阈值,滤波后抖动也有可能超过阈值范围,导致消抖不成功。
使用施密特触发器,电压降至第一个阈值以后触发,但是电压上升要到另外一个阈值才会改变(也就是滞回比较器)。施密特触发器降低了对开关抖动的灵敏度。
电容放电公式:
RC应使得Vcap直到开关停止抖动始终高于使门电路转换的阈值电压。
电容充电公式:
下图在RC消抖电路中加一个二极管,即使出现R1+R2<R2等错误导致之滞回压呈现不同值时也能正确运行。(没搞懂)在此情况下,二极管形成一个捷径将R2短路,所有电流从R1流过。
该电路断开和闭合时的状态:
断开时,通过R1和C充电。开关闭合,通过R2放电。
没有R2,开关闭合时电容器会短路。断开时如果没有二极管,R1和R2将增加电容的充电时间,降低电路的速度。另一个选择是将R1变小,但是在开关闭合时R1接在电源线两端会导致不必要的电流浪费。
8.4.2 硬件消抖电路
图中使用了一对与非门制作了一个交叉耦合闩,该电路完全消抖而不用考虑延时限制。
开关处于a,门电路1为高;开关处于b,门电路2为高。当开关在触点间移动并不在两点间区域短暂停止,由于门电路2将逻辑0回送到门1使其保持稳定。保证了锁存器输出非抖动。
把两个触点上拉至CPU的输入引脚,同样可以通过将这种电路通过软件实现。
8.4.3 软件消抖电路
方案A:在足以让抖动停止的时间后读出开关
每400~500ms读出开关,任何好的开关都会在这个时间内消除抖动,每500ms输出一次采样的结果。缺点:响应时间慢。
该方法不提供EMI(电磁干扰)保护。可以通过软件在500ms内多次读取输入,寻找一个稳定的信号,拒绝大多数EMI。
方案B:开关启动时中断CPU并在中断服务程序(ISR)中消抖
激活触点时,通常计算机会产生中断,调用一个子程序(中断服务程序)。汇编消抖程序:
消抖程序必须于硬件相匹配,开关和继电器随着年限增长将会失去弹性,使得触点停止都懂的时间增长。在键盘崭新时运行良好的消抖代码一两年后可能就失灵了。
方案C:使用计数器消除噪声并验证开关状态
C代码:
思路:到达某个逻辑开始计数,等计数超过某个值再判定电流脉冲为有效脉冲。
8.4.4 消抖指南
消抖只能占用计算机一小部分资源,应该选择使CPU开销最小的方法。消抖应当遵循的指南:
1、与消抖相关的CPU开销应当最小化。
2、未消抖开关必须连接已编程序的IO引脚,绝不能连接至CPU的中断。(可能导致多重中断)
3、ISR(中断服务程序)延时不能容忍。与开关状态有关的中断不应作为时钟或触发器的数据信号,因为可能违反最小时钟宽度或SH要求。
4、开关输入采样频率不应与外界时间同步,否则会产生周期性的EMI。
5、系统对开关输入立即响应。
6、使用定期器有规律间隔地中断CPU,而不是用延时来等待输入稳定,否则每次时钟频率改变都需要改变等待状态。
8.4.5 在多重输入下消抖
所以开关可以一起处理且占用CPU很少。
程序目的:确保输入稳定50ms而没有触点抖动。
输入switches_inputs为0,则输出保持为1;输入为1,则立马输出为0.
推荐通过时钟中断触发Debounces-switches,而不是固定的50ms,使设计具有可移植性。
8.5 现有的解决方法
采用外部消抖集成电路。
MAX681x系列接受一个或多个来自机械开关地抖动输入,并且在短暂的预制限制延时后产生一个完全的数字输出。
芯片内部只有当输入在整个限定周期内稳定时才会使能计数器计时,更新输出。
欠电压锁定电路当加压时输出正确,电压低于低电压阈值时,消抖电路保持通透,输出就等于没有延时的原始输入。