使用去抖逻辑减少瞬变信号
当开关打开和关闭时,在开关完全转移到开或关状态之前,开关触点会有轻微的弹跳。弹跳动作会产生瞬变信号,而这并不是代表真正状态更改的信号。因此,进行开关逻辑建模时,务必使用去抖算法滤除瞬变信号。
在 Stateflow® 图中进行控制器建模时,您肯定不希望开关逻辑过度运作,对所接收到的每个瞬变信号进行打开和关闭开关的响应。要避免过度响应,可以设计一个 Stateflow 控制器,使用时序逻辑对输入信号去抖并确定开关实际上是打开还是关闭。
如何实现信号去抖
可以借助 Stateflow 通过两种方式实现信号去抖:
通过使用
duration
时序运算符滤除瞬变信号。使用中间图形状态过滤掉瞬变信号。将中间图形状态用于高级过滤技术,例如故障检测。
duration
运算符仅在 Simulink® 模型中的 Stateflow 图中受支持。
使用 duration
运算符实现信号去抖
此示例描述了使用 duration
运算符滤除瞬变信号的设计模式。
去抖器图包含以下逻辑。
状态逻辑
此模型的初始状态为 Off
。通过使用 duration
运算符,您可以根据开关信号 sw
为负值或非负值的时长来控制哪个状态处于激活状态。
当
sw
处于非负值状态的时长超过 0.01 秒时,开关就会从状态Off
切换到状态On
。当
sw
处于负值状态的时长超过 0.01 秒时,开关就会从状态On
切换到状态Off
。
运行去抖器
打开模型。
打开 Scope 模块。
打开 Stateflow 图 Debouncer。
对模型进行仿真。示波器显示去抖器如何将瞬变信号与噪声输入信号隔离。
使用故障检测实现信号去抖
此示例描述了使用中间状态隔离瞬变信号的设计模式。去抖器设计使用 after
运算符实现绝对时间时序逻辑。借助此设计模式,还可以检测故障并给系统一定时间进行故障恢复。
去抖器图包含以下逻辑。
状态逻辑
去抖器图包含一个名为 Debounce
的中间状态。此状态通过检查信号 sw
是保持正值或负值,还是在规定时间段内在过零点之间波动,来隔离瞬变输入。
当
sw
处于正值状态的时长超过 0.1 秒时,开关就会切换到状态On
。当
sw
处于负值状态的时长超过 0.1 秒时,开关就会切换到状态Off
。当
sw
在过零点之间波动的时长超过 0.3 秒时,开关就会切换到状态Off.Fault
,从而将sw
隔离为瞬变信号并给它一定时间进行故障恢复。
运行去抖器
打开模型。
打开 Scope 模块。
打开 Stateflow 图 Debouncer。
对模型进行仿真。示波器显示去抖器如何将瞬变信号与噪声输入信号隔离。
使用基于事件的时序逻辑
作为绝对时间时序逻辑的替代,您可以应用基于事件的时序逻辑,使用 after
运算符来确定去抖器图中的真正状态。关键字 tick
在图唤醒时指定并隐式生成一个局部事件。
sf_debouncer
模型中的 Error Generator 模块每 0.001 秒生成一个脉冲信号。因此,要将 Debouncer 图中指定的绝对时间时序逻辑转换为基于事件的逻辑,需要将 after
运算符的参数乘以 1000,如下表所示。
基于绝对时间的逻辑 | 基于事件的逻辑 |
---|---|
after(0.1,sec) | after(100,tick) |
after(0.3,sec) | after(300,tick) |
after(1,sec) | after(1000,tick) |