1.1 毛刺产生与消除 毛刺是如何产生的? 对于剔除毛刺的类型不同,需要做的逻辑运算不同: 剔除高电平采用“与”逻辑运算 剔除低电平采用“或”逻辑运算 以下为消除高电平毛刺与低电平毛刺的原理图: 图片 图片 根据上图分别给出消除高电平毛刺和低电平毛刺的 二、抖动消除电路 1.1 消抖电路原理 消抖电路与毛刺消除很相似,都是滤除不需要的信号。但是前者消除的是单边毛刺,而抖动的信号需要滤除的是双边信号,所以上文的单边毛刺信号滤除不适用在抖动消除电路中。 图片 例如在设计按键部分通常会用到按键消抖部分: 图片 如上图所示,按键的输入信号存在抖动现象,其前后沿抖动时间一般在5ms~10ms之间。 所以设计出输入消抖是十分有必要的!
1 竞争与冒险 当一个逻辑门的输入有两个或两个以上的变量发生改变时,由于这些变量是经过不同路径产生的,使得它们状态改变的时刻有先有后,这种时差引起的现象称为竞争(Race)。 避免冒险的最简单的方法是同一时刻只允许单个输入变量发生变化,或者使用寄存器采样的办法。 2.毛刺的产生与危害 信号在FPGA 器件中通过逻辑单元连线时,一定存在延时。 3.毛刺的消除 毛刺是数字电路设计中的棘手问题,它的出现会影响电路工作的稳定性、可靠性,严重时会导致整个数字系统的误动作和逻辑紊乱。 可以通过以下几种方法来消除毛刺: 3.1 输出加D触发器 这是一种比较传统的去除毛刺的方法。原理就是用一个D触发器去读带毛刺的信号,利用 D 触发器对输入信号的毛刺不敏感的特点,去除信号中的毛刺。 (2)状态机控制 使用状态机也可以实现信号的同步和消除毛刺的目的。
因此,必须加上抖动消除电路,除去短脉冲。 常见的消抖方法可分为软件和硬件方式两大类。软件消抖通过计数器对键值进行判断,当某一键值保持一段时间不变时,才确认其为有效值。 简单的硬件消抖主要通过电容的充放电来消除按键的毛刺。对于稳定性要求比较高的应用则需要借助专门的防抖芯片来实现消抖。不同开关的最长抖动时间也不同。 在实现时需要注意计数器门限的取值,如果门限值太大,即采样时间过长,将漏掉正确的信号;如果计数器的门限值过小,即采样时间太短,则会将毛刺误认为是正确信号。 因此稳定时间大于50ms的信号为正确信号,而稳定时间小于50ms的为毛刺。因此计数器的门限值n为:50ms/系统采样时钟周期。
当S1没有被按下时,P004与VCC相连,输出高电平。当按钮按下时,1与2串联,VCC接地短路,P004输出低电平。 S1在开发板上也做了标注。 按键消抖可分为硬件消抖和软件消抖。 硬件消抖 硬件消抖就是在按键上并联一个电容,如图所示,利用电容的充放电特性来对抖动过程中产生的电压毛刺进行平滑处理,从而实现消抖。 软件消抖 软件消抖分为堵塞式消抖和非堵塞式消抖。 堵塞式消抖: 缺点:阻塞式消抖会让程序堵死在while,对CPU的资源浪费,而且会让我们无法执行 其他程序。 */ 读取端口R_IOPORT_PinRead() 与写入不同的是,第三个参数需要填一个变量,用来存储读取到的电平。 如果是查看P411,就输入BSP_IO_PORT_04_PIN_11 *参数3: 返回的电平数值,这个需要自己定义。 */ 为了能在检测按键的时候保持闪烁,我选择非堵塞式按键消抖。
打拍、握手等在什么场合需要); 异步fifo,空满判断; 亚稳态的成因,危害,解决方法; 低功耗常见设计方法,动态/静态功耗计算和分析,门控时钟、电源门控等; 竞争和冒险的区别、成因、危害、处理方法; 毛刺的成因 ; 手撕代码 懂原理,会手撕,并且根据题目要求写出不同变种的代码,比如怎么写资源占用最少等; 异步fifo; 同步fifo; 格雷码及格雷码和二进制的互相转换; 除法器; 超前进位加法器; 边沿检测,输入消抖 ,毛刺消除; 异步复位同步释放; 三种计数器。 CMOS与TTL电平,相互驱动关系; Cordic算法; FPGA的基本资源与内部构造,对于FDCE,LDCE的实现; FPGA的时钟资源及构造; 同步时钟和异步时钟。 他们的输入输出,使用的注意点等等; 计算机网络常识。
本节内容介绍 1、HAL库GPIO输入模式在cubemx中的配置及注意事项; 2、HAL库GPIO输入模式操作详解与结构介绍; 3、利用GPIO输入功能实现基本按键及多功能按键代码移植; 源码地址:https 模式、GPIO上下拉等,本节输入模式有很多相同之处,节省时间,小飞哥就简单介绍一下 GPIO选择与配置 依然是先来看看我们的Alios 开发板上的按键硬件连接,总共有3个用户按键,分别挂在GPIOE11 接下来在之前led的任务中,对按键状态进行测试,这里涉及到按键的消抖,所谓“消抖”就是: 当检测到按键状态变化时,不是立即去响应动作,而是先等待闭合或断开稳定后再进行处理。 即为按键消抖 按键消抖:可分为硬件消抖和软件消抖。 硬件消抖就是在按键上并联一个电容,如图 8-11 所示,利用电容的充放电特性来对抖动过程中产生的电压毛刺进行平滑处理,从而实现消抖。 绝大多数情况下,我们是用软件即程序来实现消抖的 延时消抖 最简单的消抖原理,就是当检测到按键状态变化后,先等待一个 10ms 左右的延时时间,让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同
模块结构 本次采用了三个模块,一个顶层模块,一个按键消抖模块和蜂鸣器控制面模块。 按键消抖 消抖,即消除抖动。 若不消除抖动,则显得过于灵敏,在短时间内会多次反复触发。 output reg key_flag, //按键数据有效信号 output reg key_value //按键消抖后的数据 (delay_cnt == 32'd1) begin //当计数器递减到1时,说明按键稳定状态维持了20ms key_flag <= 1'b1; //此时消抖过程结束 sys_rst_n, //复位信号,低电平有效 input key_flag, //按键有效信号 input key_value, //消抖后的按键信号 ** //** main code //***************************************************** //例化按键消抖模块
---- 限幅滤波法(又称程序判断滤波法) A、方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A) 每次检测到新值时判断: 如果本次值与上次值之差 <=A,则本次值有效 如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值 B、优点: 能有效克服因偶然因素引起的脉冲干扰 C、缺点: 和采样周期较短的系统 C、缺点: 对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号 不能迅速反应系统当前所受干扰的严重程度,滤波效果差 消抖滤波法 可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动 C、缺点: 对于快速变化的参数不宜 如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统 限幅消抖滤波法 A、方法: 相当于“限幅滤波法”+“消抖滤波法” 先限幅,后消抖 B、优点: 继承了“限幅”和“消抖”的优点 改进了“消抖滤波法”中的某些缺陷
<=A,则本次值有效 如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值 B、优点: 能有效克服因偶然因素引起的脉冲干扰 C 和采样周期较短的系统 C、缺点: 对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号 不能迅速反应系统当前所受干扰的严重程度,滤波效果差 9、消抖滤波法 关跳动或显示器上数值抖动 C、缺点: 对于快速变化的参数不宜 如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统 10、限幅消抖滤波法 A、方法: 相当于“限幅滤波法”+“消抖滤波法” 先限幅,后消抖 B、优点: 继承了“限幅”和“消抖”的优点 改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统 C、缺点: 对于快速变化的参数不宜 第11种方法:IIR 数字滤波器 A.
和采样周期较短的系统 C、缺点: 对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号 不能迅速反应系统当前所受干扰的严重程度,滤波效果差 9、消抖滤波法 关跳动或显示器上数值抖动 C、缺点: 对于快速变化的参数不宜 如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统 10、限幅消抖滤波法 A、方法: 相当于“限幅滤波法”+“消抖滤波法” 先限幅,后消抖 B、优点: 继承了“限幅”和“消抖”的优点 改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统 C、缺点: 对于快速变化的参数不宜 第11种方法:IIR 数字滤波器 A. ,count<N;COUNT++) { sum += value_buf[count]*coe[count]; } return (char)(sum/sum_coe);} 9、消抖滤波法
<=A,则本次值有效;如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。 } for (count=0,count<N;count++) sum += value_buf[count]*coe[count]; return (char)(sum/sum_coe); } 9、消抖滤波法 { count++; if (count>=N) return new_value; delay(); new_value = get_ad(); } return value; } 10、限幅消抖滤波法 A、方法: 相当于“限幅滤波法”+“消抖滤波法”,先限幅,后消抖。 B、优点: ①.继承了“限幅”和“消抖”的优点 ②.改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统 C、缺点: 对于快速变化的参数不宜 D、 示例 参考 1、 9 发布者:全栈程序员栈长,转载请注明出处
如果本次值与上次值之差<=A,则本次值有效 b. 如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值 2、优点: 能有效克服因偶然因素引起的脉冲干扰 3、缺点 无法抑制那种周期性的干扰 平滑度差 /* A值根据实际调,Value有效值 count++) { sum += value_buf[count] * coe[count]; } return (char)(sum/sum_coe); } 九、消抖滤波法 count >= N) return new_value; new_value = get_ad(); } return value; } 十、限幅消抖滤波法 1、方法: 相当于“限幅滤波法”+“消抖滤波法” 先限幅,后消抖 2、优点: 继承了“限幅”和“消抖”的优点 改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统 3、缺点: 对于快速变化的参数不宜
2、中位值滤波法 3、算术平均滤波法 4、递推平均滤波法(又称滑动平均滤波法) 5、中位值平均滤波法(又称防脉冲干扰平均滤波法) 6、限幅平均滤波法 7、一阶滞后滤波法 8、加权递推平均滤波法 9、消抖滤波法 10、限幅消抖滤波法 程序默认对int类型数据进行滤波,如需要对其他类型进行滤波,只需要把程序中所有int替换成long、float或者double即可。 A、名称:消抖滤波法 B、方法: 设置一个滤波计数器,将每次采样值与当前有效值比较: 如果采样值=当前有效值,则计数器清零; 如果采样值<>当前有效值,则计数器+1,并判断计数器是否 A、名称:限幅消抖滤波法 B、方法: 相当于“限幅滤波法”+“消抖滤波法”; 先限幅,后消抖。 C、优点: 继承了“限幅”和“消抖”的优点; 改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统。 D、缺点: 对于快速变化的参数不宜。
但是和所有的数字电路一样,FPGA 电路中也存在毛刺问题。它的出现会影响电路工作的可靠性、稳定性,严重时会导致整个数字系统的误动作和逻辑紊乱。下面就来讨论交流一下FPGA 的竞争冒险与毛刺问题。 ? (与分立元件不同,由于 PLD 内部不存在寄生电容电感,这些毛刺将被完整的保留并向下一级传递,因此毛刺现象在 PLD、FPGA 设计中尤为突出)。毛刺的累加,将会影响整个设计的可靠性和精确性。 接下来我们就要考虑如何消除冒险,消除冒险的方式有以下几种: 1、利用冗余项消除毛刺函数式和真值表所描述的是静态逻辑,而竞争则是从一种稳态到另一种稳态的过程。因此竞争是动态过程,它发生在输入变量变化时。 此时,修改卡诺图,增加多余项,在卡诺图的两圆相切处增加一个圆,可以消除逻辑冒险。但该法对于计数器型产生的毛刺是无法消除的。 2、采用格雷码我们可以通过改变设计,破坏毛刺产生的条件,来减少毛刺的发生。 8、在设计中对所有模块的输入时钟、输入信号、输出信号都用D触发器或寄存器进行同步处理,即输出信号直接来自触发器或寄存器的输出端。这样可以消除尖峰和毛刺信号。 注:仿真结果和实际综合的电路的不一致性。
首先要检测到图像帧与帧之间的运动方向。 角点检测 图像中的任何一个物体都通常含有独特的特征,但往往由大量的像素点构成。角点是能够准确描述这个物体的一个数量较少的点集。 但在视频防抖需求中,我们需要关心的只有3个信息:水平位移、竖直位移和旋转角度。从矩阵中抽出相应的值,可以得到如下运动轨迹曲线。曲线中大量的“毛刺”就是我们要消除的抖动。 Kalman滤波 Kalman滤波在控制类场景中运用较多,使用前面的运动来预测下一个运动,消除采样噪声。 由于Kalman只依赖前面的数据,所以更适合软件实时防抖。 在防抖场景中的缺点是对结果缺乏掌控。 image.png image.png image.png 修复运动计算 平滑轨迹与原始轨迹做差即可获得修复运动参数。 变换方式与矩阵参数的一些基本形式如下图。 image.png 结果输出 视频内容 其它示例 视频内容 视频内容 视频内容
02 硬件消抖 要解决抖动问题,我们可以通过对硬件进行一定的修改,设计一个RC积分电路进行消抖。 ? 由于RC积分电路有延时处理的问题,所以我们可以利用这个特性进行抖动消除。 所以硬件消抖只能从一定程度上解决问题,并不能根本上解决问题。 03 软件去抖 中断消抖 单片机中,一般消抖处理可以通过这样的方式进行,第一次产生中断后,然后在中断函数中去读取按键的电平,如果判决确实是按键按下时的电平,然后再过10ms再读一次电平。 多点采样方案消抖 于是,我们提出了多次取点采样的方案进行设计。 04 总结 本文详细描述了一个机械按键如何去处理按键抖动的问题,在以后设计程序的时候,也需要充分的考虑产品的稳定性与合理性,一定需要提高用户体验。
NO.1 限幅滤波 1 方法 根据经验判断两次采样允许的最大偏差值A 每次采新值时判断:若本次值与上次值之差<=A,则本次有效;若本次值与上次值之差>A,本次无效,用上次值代替本次。 count=0;count<N;count++) sum+=value_buf[count]*coe[count]; return(char)(sum/sum_coe); } NO.9 消抖滤波 count>=N) return new_value; new_value=get_ad(); } return value; } NO.10 限幅消抖滤波 1 方法 先限幅,后消抖。 2 优缺点 融合了限幅、消抖的优点 避免引入干扰值,对快速变化的信号不宜 3 代码 #defineA 10 #defineN 12 char value; char filter(){ char
一、限幅滤波 1、方法 根据经验判断两次采样允许的最大偏差值A 每次采新值时判断:若本次值与上次值之差<=A,则本次有效;若本次值与上次值之差>A,本次无效,用上次值代替本次。 ()取绝对值函数 return new_Value; } 五、中位值平均滤波 1、方法 采样N个值,去掉最大最小 计算N-2的平均值 N= 3~14 2、优缺点 融合了中位值,平均值的优点 消除脉冲干扰 for(count=0;count<N;count++) sum+=value_buf[count]*coe[count]; return (char)(sum/sum_coe); } 九、消抖滤波 new_value) { count++; if(count>=N) return new_value; new_value=get_ad(); } return value; } 十、限幅消抖滤波 1、方法 先限幅 后消抖 2、优缺点 融合了限幅、消抖的优点 避免引入干扰值,对快速变化的信号不宜 3、代码 #define A 10 #define N 12 char value; char filter
上篇文章:STM32按键消抖——入门状态机思维,以按键消抖功能,介绍了状态机的基本原理与使用方法。 上篇的状态图如下: 由于只检测按下与松开,并具备按键消抖功能,因此用到了如上的4个状态,按下抖动和松开抖动是两个独立的状态,并且这两个抖动的状态,也是可以在多次循环中连续运行的,这个状态机的循环周期设置的为 10ms,当在抖动状态连续检测到某一电平5次后,即认为消抖完成,进入下一个稳定状态。 1 消抖状态简化 1.1 状态图 将按下抖动与松开抖动共用一个抖动状态来表示,同时需要将状态机的循环周期设置为50ms,这样,抖动状态只需经过一次,通过电平高低即可判定是否真的为按键抖动。 (文末阅读原文直达~) 2.2 简化的状态图 下面再来看简化消抖状态的具体长按功能的状态机图: 对比可以发现,简化的状态图,状态可以少一个,不过抖动的状态,会有更多的输入和输出,因为目前每隔状态都有经过这个状态
竞争和冒险 在组合逻辑中,由于门的输入信号经过了不同的延时,导致到达该门的时间不一致叫竞争,产生的毛刺叫冒险,如果布尔式中有相反的信号则可能产生竞争和冒险。 由于逻辑门的延迟作用,竞争冒险现象主要由一个输入信号同时向相反的逻辑电平跳变所生的。 FPGA设计中最简单的避免方法就是尽量使用时序逻辑同步输入和输出。解决方法: 1、 加滤波电容,消除毛刺的影响。 2、 加选通信号,避开毛刺。 3、增加冗余项,消除逻辑冒险。(怎么做?) 消除竞争冒险的原则是增加逻辑函数的冗余项,冗余项的加入并不改变元逻辑函数的逻辑值,但是冗余项的加入却可以有效的消除竞争和冒险。 在卡诺图上,加上一个与两个相切的卡诺圈相交的一项,破坏卡诺圈的单独相切性能,加上此圈后,逻辑函数多了一个冗余项,从而消除了冒险。