1

簡単な要約:

表示が更新されるたびに最小桁数 (10 進数) が変更されるように、4 桁の速度信号を表示するアルゴリズムを探しています。

例えば:

Filtered
 Signal      Display
--------------------
  0000        0000
  2345        2000
  2345        2300
  2345        2340
  0190        0340
  0190        0190
  0190        0190

詳細:

4 桁の LCD ディスプレイに速度信号 (0 ~ 3000 RPM) を表示する必要があるプロジェクトに取り組んでいます。理想的なディスプレイ ソリューションはアナログ ゲージですが、私はデジタル ディスプレイにこだわっています。表示は機械のオペレーターが読み取りますが、できるだけ読みやすくしたいと考えています。

オペレーターは、シグナルの正確な値をあまり気にしません。彼は値が何であるか (最も近い 10 RPM まで) を知りたがり、マシンの動作の変化に応じて値が上下するのを見たいと思うでしょう。彼はそれがいたるところに飛び跳ねるのを見たくないでしょう。

これが私がこれまでに行ったことです:

  • 数値を最も近い 10 RPM に丸めて、最後の桁が常に 0 になるようにします
  • 電気ノイズと通常のセンサーの変動によって読み取り値が一度に 10 RPM を超えてジャンプしないように、信号をフィルター処理します。
  • 同じ値 (例: 990 - 1000) を超える場合を回避するために、信号に +/-10 RPM ヒステリシスを追加しました。

これにより、信号が安定している場合 (約 75% の時間) はきれいに処理されますが、信号が定常状態から別の定常状態に移行するときに、信号に多くの不要な変動が見られます。信号が 100 RPM から 1000 RPM に変化すると (たとえば)、信号は途中で多くの数値を通過します。数値を実際に読んで理解するには少し時間がかかるため、これらすべての中間状態に到達してもほとんど意味がないように思われます。単純にディスプレイの更新レートを下げてみましたが、満足のいく結果にはなりませんでした。同時に、ディスプレイの動きが鈍く、びくびくしたように感じました。数字が変化する前に顕著な遅延があり、その後大きな飛躍 (100、340、620、980、1000) で移動します。


提案:

例に示すようにディスプレイを動作させたい:

  1. 表示は 1 秒に 2 回更新されます
  2. ある定常状態から別の定常状態への移行に 2 秒以上かかることはありません。
  3. 入力信号が現在表示されている値よりも高い場合、表示される信号は増加しますが、入力信号値よりも高くなることはありません。
  4. 入力信号が現在表示されている値より低い場合、表示される信号は減少しますが、入力信号値より低くなることはありません。
  5. 更新ごとに最小桁数を変更する必要があります (できれば 1 桁のみ)
  6. できるだけ早く表示信号と入力信号の差を縮めるために、上位桁から変更する必要があります。

上記のルールに従って「適切な」4桁の10進数を出力するアルゴリズムを思い付くことができますか、または知っていますか?

関数プロトタイプは、疑似コードで次のようになります。

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

テキストの壁で申し訳ありません。質問に答える人が、私がすでに経験したことをカバーしないように、これまでの進捗状況を記録したかったのです。

4

4 に答える 4

1

4 桁目で表されるデータが必要なく、厳密に 4 桁表示に縛られている場合、4 桁目を増減の指標として使用することを検討しましたか? ゼロの上または下の一部を 2Hz* で点滅させて、ゲージの次の変化が増加または減少であることを示します。

それが何であれ、調整に対するデバイスの応答の優れたモデルを作成し、そのモデルを使用して、2 秒間の安定化プロセスの最初の 0.5 秒間に基づいて目標値を推定することもできると思います。

*これは、1 秒あたり 2 回の更新があることを前提としています。ほとんどの 4 桁ディスプレイは多重化されているため、ドライバーを少し調整するだけで、より高い周波数でフラッシュできる可能性があります。

于 2009-05-14T20:36:21.783 に答える
0

これは微妙な質問であり、私の答えはアルゴリズムの側面をカバーしていません。

投稿の冒頭で表に示している行動は非常に悪い考えだと思います。2行目と5行目は、ユーザーエクスペリエンスのために、データに含まれているデータポイントと含まれていないデータポイント、つまり間違ったデータを表示しています。これは、マシン操作の領域では不適切な選択である可能性があります。

更新レートが低いと「遅く感じる」かもしれませんが、明確に定義されています(「実際の」データのみで、最大でnミリ秒前)。更新レートを速くすると、多くの中間値が表示されますが、最上位桁がすぐに変わることはありません。どちらも、かなり誤った値の生成よりもテストが簡単です。

于 2009-05-14T15:14:42.867 に答える
0

これにより、センサー値が表示された値に多少ゆっくりと組み込まれます。

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

0 (表示が更新されない) から 256 (表示は常にセンサーに等しい) の間で K を選択します。

于 2009-05-14T15:22:57.277 に答える
0

実際にユーザーに誤った情報を提供するため、一度に1桁ずつ変更するというあなたの提案は奇妙だと思います...私が考えるのは、実際にはさらに多くの状態変更を追加し、信号が変更されるたびにゲージは新しい値に向かって 1 ずつ移動します。これにより、アナログゲージのような経験と変化の「アニメーション」が提供されます。オペレーターはすぐに無意識のうちに、0、1、2... の順に回転する数字が速度の増加と 9、8、7、... の減少を表すことに気付くでしょう。

例えば:

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

あなたが実装したヒステリシスは、もちろん安定状態に非常に適しています。

于 2009-05-13T20:36:32.077 に答える