快速总结:
我正在寻找一种算法来显示四位数的速度信号,这样每次显示更新时都会更改(十进制)的最小位数。
例如:
Filtered
Signal Display
--------------------
0000 0000
2345 2000
2345 2300
2345 2340
0190 0340
0190 0190
0190 0190
细节:
我正在做一个项目,我需要在四位 LCD 显示器上显示速度信号(0 到 3000 RPM 之间)。理想的显示解决方案是模拟仪表,但我坚持使用数字显示。显示器将由机器操作员阅读,我希望阅读起来尽可能愉快。
操作员并不真正关心信号的确切值。他会想知道这个值是多少(精确到 10 RPM),并且他会想看到它随着机器运行的变化而上下波动。他不想看到它到处乱跳。
这是我到目前为止所做的:
- 将数字四舍五入到最接近的 10 RPM,以便最后一位始终为 0
- 过滤信号,使电噪声和正常的传感器波动不会导致读数一次跳跃超过 10 RPM。
- 为信号添加了一个 +/-10 RPM 滞后,以避免在相同值上摆动的情况(例如:990 - 1000)
当信号稳定时(大约 75% 的时间),这已经很好地清理了事情,但是当信号从一个稳定状态移动到另一个稳定状态时,我仍然看到很多不必要的变化。当信号从 100 RPM 变为 1000 RPM(例如)时,它会一路经过很多数字。由于实际阅读和理解数字需要一点时间,因此达到所有这些中间状态似乎没有什么意义。我尝试简单地降低显示器的更新率,但这并没有产生令人满意的结果。它同时让显示器“感觉”迟缓和跳跃。在数字发生变化之前会有明显的延迟,然后它们会大幅跃升(100、340、620、980、1000)。
提议:
我希望显示器的行为如示例所示:
- 显示每秒更新两次
- 从一种稳态过渡到另一种稳态的时间不应超过 2 秒。
- 如果输入信号高于当前显示值,则显示信号应增加,但绝不应高于输入信号值。
- 如果输入信号低于当前显示值,则显示信号应减小,但决不能低于输入信号值。
- 每次更新应更改的最小位数(最好只有一位)
- 应先改变高位数字,使显示信号与输入信号的差异尽快减小
你能想出,或者你知道根据上述规则输出“正确”的 4 位十进制数的算法吗?
伪代码中的函数原型看起来像这样:
int GetDisplayValue(int currentDisplayValue, int inputSignal)
{
//..
}
对不起,文字墙。我想记录我迄今为止的进展,以便任何回答这个问题的人都避免覆盖我已经经历过的基础。