1

快速总结:

我正在寻找一种算法来显示四位数的速度信号,这样每次显示更新时都会更改(十进制)的最小位数。

例如:

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)。


提议:

我希望显示器的行为如示例所示:

  1. 显示每秒更新两次
  2. 从一种稳态过渡到另一种稳态的时间不应超过 2 秒。
  3. 如果输入信号高于当前显示值,则显示信号应增加,但绝不应高于输入信号值。
  4. 如果输入信号低于当前显示值,则显示信号应减小,但决不能低于输入信号值。
  5. 每次更新应更改的最小位数(最好只有一位)
  6. 应先改变高位数字,使显示信号与输入信号的差异尽快减小

你能想出,或者你知道根据上述规则输出“正确”的 4 位十进制数的算法吗?

伪代码中的函数原型看起来像这样:

int GetDisplayValue(int currentDisplayValue, int inputSignal)
{
    //..
}

对不起,文字墙。我想记录我迄今为止的进展,以便任何回答这个问题的人都避免覆盖我已经经历过的基础。

4

4 回答 4

1

如果您不需要第4位表示的数据,并且严格绑定到4位显示,您是否考虑过使用第4位作为增减指标?以 2Hz* 闪烁零的顶部或底部的某些部分,以指示仪表的下一个变化将是增加或减少。

我认为你也可以很好地为你的设备的响应建立一个很好的模型,不管它是什么,调整,并使用该模型根据两秒稳定过程的前半秒推断目标数字。

*这假设您每秒有两次更新。大多数 4 位显示器都是多路复用的,因此您可以通过稍微调整驱动程序以更高的频率闪烁它。

于 2009-05-14T20:36:21.783 回答
0

我认为您一次更改一位数字的建议很奇怪,因为它实际上为用户提供了错误信息……我会考虑实际上是添加更多的状态更改,并实施它,以便每当信号更改时,他们仪表以 1 为增量向新值移动。这将提供模拟量表般的体验和变化的“动画”;操作员很快就会下意识地认出数字按顺序旋转 0,1,2... 表示速度增加,而 9,8,7,... 速度减少。

例如:

Filtered signal      Display
0000                 0000
2345                 0001
                     0002
                     ...
                     2345

您实施的滞后当然对稳定状态非常有利。

于 2009-05-13T20:36:32.077 回答
0

这将或多或少缓慢地将传感器值合并到显示值中:

display = ( K * sensor + (256 - K) * display ) >> 8

在 0(显示从不更新)和 256(显示始终等于传感器)之间选择 K。

于 2009-05-14T15:22:57.277 回答
0

这是一个微妙的问题,我的回答不涉及算法方面。

我相信您在发帖开始时在表格中表示的行为是一个非常糟糕的主意。为了用户体验,第 2 行和第 5 行显示了数据中存在和从未存在的数据点,即错误数据。这在机器操作领域可能是一个糟糕的选择。

较低的更新率可能“感觉迟缓”,但定义明确(只有“真实”数据,最多 n 毫秒)。较快的更新速率将显示许多中间值,但最高有效位不应快速更改。两者都比任何非常错误的值生成更容易测试。

于 2009-05-14T15:14:42.867 回答