DTC_debounce去抖
DEM 模块提供了两种主要的 Debounce 算法:基于计数器的 Debounce 算法和基于时间的 Debounce 算法。
一、基于计数器的 Debounce 算法
原理:
通过计数器来确认事件的状态。每次事件触发时,根据检查结果(通过或失败),计数器会增加或减少一定的步长(N)。当计数器达到失败阈值时,事件被标记为失败;当计数器达到成功阈值时,事件被标记为通过。
特点:
可以设置“jump-down”和“jump-up”功能,分别在计数器达到失败或成功阈值后,将计数器重置为初始值。
适用于需要通过多次连续检查结果来确认事件状态的场景
故障计数器范围(Fault Detection Counter):计数器的取值范围为-128到127。
失败阈值(Failed Threshold):当计数器达到此值时,事件状态变为Failed。
成功阈值(Passed Threshold):当计数器达到此值时,事件状态变为Passed。
增加步长(Increment Step Size):每次事件报告为PreFailed时,计数器增加的步长。
减少步长(Decrement Step Size):每次事件报告为PrePassed时,计数器减少的步长。
Jump Down功能:当计数器达到失败阈值后,是否将计数器重置为一个特定值(Jump Down Value)。
Jump Up功能:当计数器达到成功阈值后,是否将计数器重置为一个特定值(Jump Up Value)。
上图可参考学习
当一个事件上报一次PREFAILED状态,那么计数器会按步长增加1,当达到设定的Failed限值时,故障状态就变成Failed
当一个事件上报一次PREPASSED状态,那么计数器按步长减少1,当达到设定的Passed限值时,故障状态就变成Passed
二、基于时间的 Debounce 算法
原理:通过计时器来确认事件的状态。每次事件触发时,启动一个计时器,根据检查结果(通过或失败),计时器达到相应的时间阈值后,事件被标记为失败或通过。
特点:
时间阈值的设置决定了事件状态的确认时间。
适用于需要在固定时间间隔内确认事件状态的场景
DemDebounceTimeFailedThreshold:从PREFAILED状态跳转到FAILED状态所需的时间阈值
DemDebounceTimePassedThreshold:从PREPASSED状态跳转到PASSED状态所需的时间阈值
三、两种算法的区别
| 特性 | 基于计数器的 Debounce | 基于时间的 Debounce |
|---|---|---|
| 核心机制 | 通过计数器的增减来确认事件状态 | 通过计时器的延时来确认事件状态 |
| 适用场景 | 需要多次连续检查结果来确认事件状态 | 需要在固定时间间隔内确认事件状态 |
| 灵活性 | 可以设置“jump-down”和“jump-up”功能 | 时间阈值固定,较为简单 |
| 配置参数 | 成功/失败阈值、步长、是否启用跳变功能 | 成功/失败时间阈值 |
四、去抖机制的实现流程
1、故障检测:
应用程序检测到潜在故障(如传感器信号异常),
调用Dem_PreSetEventStatus进行预处理
2、去抖条件检查:
Dem_PreSetEventStatus 检查故障是否满足去抖条件(如故障计数器是否达到阈值)。
如果满足条件,允许状态更新;否则,阻止状态更新。
3、状态更新:
调用 Dem_SetEventStatus 更新故障状态。
如果故障被确认,存储 DTC 并触发相关操作。
如果故障消失且满足清除条件,清除 DTC。
注意:由于诊断故障由SWC和Dem模块共同完成,因此去抖动策略可以在SWC中实现,也可以在Dem模块中实现。
①如果在SWC中实现,Dem_SetEventStatus()函数传递给Dem的状态为passed或failed;
②如果在Dem中实现,先Dem_PreSetEventStatus()函数传递给Dem的状态为prepassed或prefailed,后实现去抖之后,调用Dem_SetEventStatus()函数传递给Dem的状态为passed或failed;
③当然有些控制器中也有不需要做去抖过程,直接调用Dem_SetEventStatus()函数传递给Dem的状态为passed或failed。
