使用去抖逻辑减少瞬变信号
当开关打开和关闭时,在开关完全转移到开或关状态之前,开关触点会有轻微的弹跳。弹跳动作会产生瞬变信号,而这并不是代表真正状态更改的信号。因此,进行开关逻辑建模时,务必使用去抖算法滤除瞬变信号。
在 Stateflow® 图中进行控制器建模时,您肯定不希望开关逻辑过度运作,对所接收到的每个瞬变信号进行打开和关闭开关的响应。要避免过度响应,可以设计一个 Stateflow 控制器,使用时序逻辑对输入信号去抖并确定开关实际上是打开还是关闭。
如何实现信号去抖
可以借助 Stateflow 通过两种方式实现信号去抖:
通过使用
duration时序运算符滤除瞬变信号。注意
duration运算符仅在 Simulink® 模型中的 Stateflow 图中受支持。使用中间图形状态过滤掉瞬变信号。将中间图形状态用于高级过滤技术,例如故障检测。
使用 duration 运算符进行信号去抖
此示例描述了使用 duration 运算符滤除瞬变信号的设计构型。

Debouncer 图包含 Off 和 On 状态。

状态逻辑
此模型的初始状态为 Off。通过使用 duration 运算符,您可以根据开关信号 sw 为负值或非负值的时长来控制哪个状态处于激活状态。
当
sw处于非负值状态的时长超过 0.01 秒时,开关就会从状态Off切换到状态On。当
sw处于负值状态的时长超过 0.01 秒时,开关就会从状态On切换到状态Off。
运行去抖器
打开模型。
打开 Scope 模块。
打开 Stateflow 图 Debouncer。
对模型进行仿真。示波器显示去抖器如何将瞬变信号与噪声输入信号隔离。

使用故障检测实现信号去抖
此示例描述了使用中间状态隔离瞬变信号的设计构型。去抖器设计使用 after 运算符实现绝对时间时序逻辑。借助此设计构型,还可以检测故障并给系统一定时间进行故障恢复。

Debouncer 图包含 Off、Debounce 和 On 几种状态

状态逻辑
去抖器图包含一个名为 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) |