快速总结:
我正在寻找一种算法来显示四位数的速度信号,每次显示更新时,最小(十进制)位数都会发生变化。
例如:
Filtered
Signal Display
--------------------
0000 0000
2345 2000
2345 2300
2345 2340
0190 0340
0190 0190
0190 0190
详细信息:
我正在开展一个项目,我需要在四位 LCD 显示屏上显示速度信号(介于 0 到 3000 RPM 之间)。理想的显示解决方案是模拟仪表,但我坚持使用数字显示。显示器将由机器运算符(operator)读取,我希望它读起来尽可能愉快。
运算符(operator)并不真正关心信号的确切值。他会想知道这个值是多少(精确到 10 RPM),他会想看到它随着机器运行的变化而上下波动。他将不希望看到它到处乱跳。
这是我到目前为止所做的:
- 将数字四舍五入到最接近的 10 RPM,以便最后一位数字始终为 0
- 过滤信号,使电噪声和正常的传感器波动不会导致读数一次跳跃超过 10 RPM。
- 为信号添加了 +/-10 RPM 滞后,以避免信号在相同值上摆动的情况(例如:990 - 1000)
当信号稳定时(大约 75% 的时间),这已经很好地解决了问题,但是当信号从一种稳定状态移动到另一种稳定状态时,我仍然看到信号中有很多不必要的变化强>.当信号从 100 RPM 变为 1000 RPM(例如)时,它会沿途传递很多数字。由于实际阅读和理解数字需要一些时间,因此达到所有这些中间状态似乎没有什么意义。我尝试简单地降低显示器的更新率,但这并没有产生令人满意的结果。它同时让显示器“感觉”迟缓和跳动。在数字发生变化之前会有一个明显的延迟,然后它们会大跃进(100、340、620、980、1000)。
提案:
我希望显示的行为如示例所示:
- 显示每秒更新两次
- 从一种稳定状态到另一种稳定状态的转变时间不应超过 2 秒。
- 如果输入信号高于当前显示值,则显示信号应增加,但绝不能高于输入信号值。
- 如果输入信号低于当前显示值,则显示信号应减小,但绝不能低于输入信号值。
- 每次更新应更改的最少位数(最好只有一位)
- 应先改变高位数字,使显示信号与输入信号的差异尽快减小
你能想出,或者你知道一种算法,可以根据上述规则输出“正确的”4 位十进制数吗?
伪代码中的函数原型(prototype)看起来像这样:
int GetDisplayValue(int currentDisplayValue, int inputSignal)
{
//..
}
抱歉文字墙。我想记录下我迄今为止的进展,这样任何回答问题的人都可以避免涉及我已经经历过的问题。
最佳答案
如果不需要第4位表示的数据,又严格绑定(bind)4位显示,有没有考虑过用第4位作为增减指标?零的顶部或底部的某些部分以 2Hz* 闪烁,表示仪表的下一次变化将是增加或减少。
我认为您也可以为您的设备(无论它是什么)对调整的响应制作一个好的模型,并使用该模型根据两秒稳定过程的前半秒推断目标数字.
*这假设您每秒更新两次。大多数 4 位数字显示器都是多路复用的,因此您可以通过稍微调整驱动程序以更高的频率闪烁它。
关于以 10 为基数的数字显示算法 - 每次刷新的最小更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/859270/