4

背景: 10ビットのアナログ-デジタルコンバーターを使用して、線形位置(0 mm〜40 mm)をポテンショメーター電圧からそのデジタル値に変換する組み込みシステムがあります。

    ------------------------
0mm |                      | 40 mm
    ------------------------

1mm刻みで直線位置をユーザーに示します。元。1mm、2mm、3mmなど

問題: 私たちのシステムは、ADCに入るノイズのために線形位置が「ちらつく」原因となる可能性のある電磁ノイズの多い環境で使用できます。たとえば、ポテンショメータが39 mmの場合、39、40、39、40、39、38、40などの値が表示されます。

1 mmごとに丸めているため、たとえば値が1.4〜1.6 mmの間で切り替わると、1〜2の間でちらつきが見られます。

提案されたソフトウェアソリューション: ハードウェアを変更できないと仮定して、このちらつきを回避するために、値の丸めにヒステリシスを追加したいと思います。そのような:

値が現在1mmの場合、生の値が1.8以上の場合にのみ、2mmになります。同様に、現在の値が1mmの場合、生の値が0.2以下の場合にのみ0mmになります。

ソリューションをテストするために、次の簡単なアプリを作成しました。私が正しい方向に進んでいるかどうか、または何かアドバイスがあれば教えてください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PDFSHysteresis
{
    class Program
    {
        static void Main(string[] args)
        {
            double test = 0;
            int curr = 0;
            Random random = new Random();

            for (double i = 0; i < 100; i++)
            {
                test = test + random.Next(-1, 2) + Math.Round((random.NextDouble()), 3);
                curr = HystRound(test, curr, 0.2);

                Console.WriteLine("{0:00.000} - {1}", test, curr);
            }

            Console.ReadLine();
        }

        static int HystRound(double test, int curr, double margin)
        {

            if (test > curr + 1 - margin && test < curr + 2 - margin)
            {
                return curr + 1;
            }
            else if (test < curr - 1 + margin && test > curr - 2 + margin)
            {
                return curr - 1;
            }
            else if (test >= curr - 1 + margin && test <= curr + 1 - margin)
            {
                return curr;
            }
            else
            {
                return HystRound(test, (int)Math.Floor(test), margin);
            }
        }
    }
}

サンプル出力:

Raw      HystRound
======   =========
00.847   1
00.406   1
01.865   2
01.521   2
02.802   3
02.909   3
02.720   3
04.505   4
06.373   6
06.672   6
08.444   8
09.129   9
10.870   11
10.539   11
12.125   12
13.622   13
13.598   13
14.141   14
16.023   16
16.613   16
4

3 に答える 3

1

最後の N 秒間の読み取り値の平均を使用するのはどうでしょうか。ここで、N はサンプル レートに応じて 1 秒未満のかなり小さい値になる可能性があります。

必要に応じて、単純な線形平均、またはより複雑なものを使用できます。ウィキペディアには、いくつかの移動平均アルゴリズムが詳しく説明されています。

http://en.wikipedia.org/wiki/Moving_average

感度/応答性のニーズに応じて、新しい測定値が実行中の平均を X% 超えた場合、平均をリセットできます。

于 2012-05-01T21:38:06.397 に答える
0

以前、回路からの電圧出力を読み取り、コンピューター画面にグラフを表示する必要があったのと同様のことをしなければなりませんでした。肝心なのは、これは実際にはシステム要件に依存するということです。要件が「1mm」の精度である場合、実際にできることは何もありません。それ以外の場合は、前述のように、ちらつきを軽減するのに役立ついくつかの方法を使用できます。あなたはできる:

  • ユーザーが設定できる一定期間におけるこれらの値の平均を計算します。
  • ユーザーが「感度のしきい値」を設定できるようにします。このしきい値を使用して、天気を決定し、新しい値が有効かどうかを判断できます。あなたの例では、しきい値を 2mm に設定できます。この場合、値は次のように39, 40, 39, 38なります。39mm
  • また、アプリケーションとハードウェア自体の間に外部スタビライザーを配置することを考えたことはありますか?
于 2012-05-01T21:50:05.240 に答える
0

I think Gareth Rees gave an excellent answer to a very similar question: how to prevent series of integers to have the same value to often

于 2013-08-08T08:27:55.657 に答える