背景: 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