问题描述
例如:需要对某个器件的温度在超温时进行滤波防抖,但调速策略不需要防抖,两个功能引用了同一个属性,有没有办法对Event中的Reading值,或者ThresholdSensor中的Reading值进行防抖
例如:需要对某个器件的温度在超温时进行滤波防抖,但调速策略不需要防抖,两个功能引用了同一个属性,有没有办法对Event中的Reading值,或者ThresholdSensor中的Reading值进行防抖
答案内容由AI生成,仅供参考:
| 问题 | 解答 |
|---|---|
| 能否对 CSR 对象进行防抖? | Scanner 的 Debounce 属性实现 |
| 能否只对告警用温度防抖,调速不用? | |
| 推荐的防抖类型? | 温度信号推荐 Median 或 MidAvg |
| 防抖配置位置? | 必须在 Scanner 对象中配置,不能在 ThresholdSensor 或 Event 中直接配置 |
最佳实践:将防抖作为数据采集层(Scanner)的预处理机制,而不是在上层逻辑中处理,以实现模块化、灵活控制。
根据您提出的问题:“是否可以对某个 CSR 对象(如器件温度)进行防抖处理,尤其在温度超温告警时进行滤波防抖,同时不影响其他功能(如调速策略)引用同一属性”,以下结合知识库中的信息进行详细解答。
Debounce 配置在 Scanner 层级 实现选择性防抖可以实现对温度传感器 Reading 值的防抖,而不影响其他模块(如调速策略)使用原始值或不同处理逻辑。关键是将 防抖控制点放在 Scanner 对象上,因为防抖机制本质上是对硬件读取值的预处理,而不是在 Event 或 ThresholdSensor 中处理。
Scanner 的 Debounce 属性在 openUBMC 系统中,防抖(Debounce)是通过 Scanner 类的 Debounce 属性实现的,用于在将原始硬件数据写入资源树前进行滤波处理。
“在通过硬件代理Scanner对象读取硬件数据的时候,可以通过
debounce属性配置防抖对象”
Debounce➝Scanner Class:Debounce 是 Scanner 的一个属性,用于稳定信号读取。
这意味着:防抖发生在数据进入系统之前,只影响后续依赖该 Scanner 输出的模块。
| 防抖类型 | 适用场景 | 是否适合温度信号 |
|---|---|---|
Median(中值滤波) |
脉冲噪声、温度类信号 | |
MidAvg(均值滤波) |
模拟量平滑处理 | |
Cont(持续一致) |
数字信号稳定判断 | |
ContBin(二值持续) |
开关量、高低电平 | |
None |
无防抖 | 默认 |
建议对温度传感器使用
Median或MidAvg防抖策略。
Scanner_TempSensor:
Chip: "#/LM75_TempChip"
Offset: 0x00
Size: 1
Type: 0
Period: 1000
Debounce: "#/MedianDebounce_Temperature" # 启用中值滤波防抖
ScanEnabled: 1
{
"MedianDebounce_Temperature": {
"WindowSize": 5,
"DefaultValue": 25
}
}
WindowSize: 5表示取最近5次读数的中值作为输出,有效消除毛刺。DefaultValue: 25是初始默认值,用于未满窗时输出。
ThresholdSensor_Temp:
Reading: "<=/Scanner_TempSensor.Value"
UpperNoncritical: 85
UpperCritical: 95
...
此时,ThresholdSensor 使用的是 已经经过防抖处理的温度值,避免了因瞬时尖峰触发误告警。
如果调速策略需要更灵敏的响应(例如风扇需快速响应温度上升),可以通过以下方式绕过防抖:
方式一:直接读取芯片原始值(绕过 Scanner)
Scanner_FanControlTemp:
Chip: "#/LM75_TempChip"
Offset: 0x00
Size: 1
Type: 0
Period: 500
Debounce: "None" # 不防抖,响应更快
ScanEnabled: 1
方式二:在调速策略中使用表达式或 Accessor 直接访问硬件
若系统支持,可通过低延迟通道直接获取原始值,避免使用防抖后的资源树值。
这样就实现了 同一温度源,两个用途:告警用防抖稳定值,调速用原始快响应值。
| 目标 | 建议做法 |
|---|---|
| 防止误告警 | 对 ThresholdSensor 的输入做 Median 防抖 |
| 保持调速响应性 | 调速策略使用 Debounce: None 的 Scanner |
| 资源复用 | 可定义多个 Scanner 指向同一硬件地址,但不同防抖策略 |
| 性能优化 | 避免过大的 WindowSize(建议 3~10),防止延迟过高 |
防抖不能配置在 ThresholdSensor 或 Event 本身
Debounce 是 Scanner 的属性,非 ThresholdSensor 的直接属性。Reading 值变化,不参与数据预处理。防抖会引入延迟
Median 窗口为 5,需等待 5 次采样才能输出稳定值。默认值合理性
DefaultValue 应设为合理温度(如 25°C),避免初始误判。| 问题 | 解答 |
|---|---|
| 能否对 CSR 对象进行防抖? | Scanner 的 Debounce 属性实现 |
| 能否只对告警用温度防抖,调速不用? | |
| 推荐的防抖类型? | 温度信号推荐 Median 或 MidAvg |
| 防抖配置位置? | 必须在 Scanner 对象中配置,不能在 ThresholdSensor 或 Event 中直接配置 |
最佳实践:将防抖作为数据采集层(Scanner)的预处理机制,而不是在上层逻辑中处理,以实现模块化、灵活控制。
如有具体硬件型号或 CSR 代码片段,可进一步提供针对性配置建议。
相关链接:
温度属性在lua代码中由其他方法获取 ,非 i2c获取
有的,详细可以参考这篇文档。
可以考虑在同步源进行防抖处理
代码中也能防抖,示例:
local debounce = require 'mc.debounce.debounce'
self.midavg = debounce[debounce.DEBOUNCED_MIDAVG].new(4, 20)
local temp = self.midavg:get_debounced_val(info.temperature)
如还有问题请尽快反馈,若问题解决请标记解决方案。