**
シングルチップマイクロコンピュータで一般的に使用されるADCデータフィルタリングアルゴリズム
**
1. リミッティングフィルター
1. 方法:
経験に基づいて 2 回のサンプリングで許容される最大偏差 K を判断し、
新しい値が収集されるたびに判断します。現在値と前回の値の差 <= E の場合は今回が有効で、現在の値の場合は有効です。値が前の値と異なる 2 番目の値の差が > E の場合、今回は無効となり、今回の代わりに前の値が使用されます。
2. 長所と短所:
パルス干渉を克服できますが、周期的な干渉を抑制できず、滑らかさが劣ります。
3. コード
/* K值根据实际调,Value有效值,new_Value当前采样值,程序返回有效的实际值 */
#define E 10
char Value;
char filter()
{
char new_Value;
new_Value = get_ad(); //获取采样值
if( abs(new_Value - Value) > E) //abs()取绝对值函数
return Value;
return new_Value;
}
2.メディアンフィルタリング
1.方法:
N回連続サンプリングし、サイズごとに並べ、中央の値を今回の実効値とする
2. 長所と短所:
変動干渉を克服し、温度などのゆっくりと変化する測定パラメータに対して良好なフィルタリング効果を持ちますが、速度などの急速に変化するパラメータには適していません。
3. コード
#define N 11
char filter()
{
char value_buf[N];
char count,i,j,temp;
for(count = 0;count < N;count++){
//获取采样值
value_buf[count] = get_ad();
delay();
}
for(j = 0;j<(N-1);j++){
for(i = 0;i<(n-j);i++){
if(value_buf[i]>value_buf[i+1]){
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
return value_buf[(N-1)/2];
}
}
3. 算術平均フィルタリング
1. 方法:
N 回連続サンプリングして平均値
N が大きいと滑らかさが高く感度が低く、
N が小さいと滑らかさが低く感度が高い
一般的には N= 12
2. 長所と短所:
ランダムな干渉があり、大量の RAM を占有し、速度が遅いシステムに適しています。
3. コード:
#define N 12
char filter()
{
int sum = 0;
for(count = 0;count<N;count++){
sum += get_ad();
}
return (char)(sum/N);
}
4. 再帰的平均フィルタリング
1. 方法:
N 個のサンプリング値を取得してキューを形成し、先入れ先出しで平均を取得します。
一般的に、N=4~12
2. 長所と短所:
周期的干渉の抑制が良好、平滑性が高く、
高周波振動システムに適し
、感度が低く、RAM 占有量が大きく、パルス干渉が深刻
3. コード
/* A值根据实际调,Value有效值,new_Value当前采样值,程序返回有效的实际值 */
#define A 10
char Value;
char filter()
{
char new_Value;
new_Value = get_ad(); //获取采样值
if( abs(new_Value - Value) > A){
//abs()取绝对值函数
return Value;
}
return new_Value;
}
5. メディアン平均フィルター
1. 方法:
N 個の値をサンプリングし、最大値と最小値を削除し、
N-2 の平均値を計算します
N= 3~14
2. 利点と欠点
中央値と平均値の利点を組み合わせる
パルス干渉を排除する
計算速度が遅く、RAM 使用量が大きい
3. コード:
char filter()
{
char count,i,j;
char Value_buf[N];
int sum=0;
for(count=0;count<N;count++){
Value_buf[count]= get_ad();
}
for(j=0;j<(N-1);j++){
for(i=0;i<(N-j);i++){
if(Value_buf[i]>Value_buf[i+1]){
temp = Value_buf[i];
Value_buf[i]= Value_buf[i+1];
Value_buf[i+1]=temp;
}
}
}
for(count =1;count<N-1;count++){
sum += Value_buf[count];
}
return (char)(sum/(N-2));
}
6. 限界平均フィルター
1. 方法:
サンプリングされた各データは最初に制限されてからキューに送信され、平均値が取得されます。
2. 長所と短所:
リミッター、平均値、キューの利点を統合し、
パルス干渉を排除し、より多くの RAM を占有します。
3. コード:
#define A 10
#define N 12
char value,i=0;
char value_buf[N];
char filter()
{
char new_value,sum=0;
new_value=get_ad();
if(Abs(new_value-value)<A){
value_buf[i++]=new_value;
}
if(i==N){
i=0;
}
for(count =0 ;count<N;count++){
sum+=value_buf[count];
}
return (char)(sum/N);
}
7. 一次遅れフィルター
1. 方法:
a=0~1 とし、
今回のフィルタリング結果 = (1-a) * 今回のサンプリング + a * 最後の結果
2. 長所と短所:
周期的干渉の抑制が良好で、変動周波数が高く、
感度が低く、位相遅れのある場面に適しています。
3. コード:
/*为加快程序处理速度,取a=0~100*/
#define a 30
char value;
char filter()
{
char new_value;
new_value=get_ad();
return ((100-a)*value + a*new_value);
}
8、加重再帰平均フィルター
1. 方法:
再帰的平均フィルターを改善し、さまざまな時点でデータに異なる重みを追加します。通常、データが新しいほど重みが大きくなるため、感度は高くなりますが、滑らかさは低くなります。
2. 長所と短所:
遅れ時定数が大きく、サンプリング周期が短いシステムに適していますが、遅れ時定数が小さく、サンプリング周期が長く、変化が遅い信号の場合は、干渉に迅速に応答できません。
3. コード:
/* coe数组为加权系数表 */
#define N 12
char code coe[N]={
1,2,3,4,5,6,7,8,9,10,11,12};
char code sum_coe={
1+2+3+4+5+6+7+8+9+10+11+12};
char filter()
{
char count;
char value_buf[N];
int sum=0;
for(count=0;count<N;count++){
value_buf[count]=get_ad();
}
for(count=0;count<N;count++){
sum+=value_buf[count]*coe[count];
}
return (char)(sum/sum_coe);
}
9、デバウンスフィルター
1. 方法:サンプリング値と現在の実効値を比較する
フィルター カウンタを設定します。サンプリング値 = 現在の実効値の場合、カウンタは 0 にクリアされます。サンプリング値が現在の実効値と等しくない場合、カウンタは +1 になります。カウンタがオーバーフローすると、サンプリングされた値が現在の値に置き換わります。有効な値、カウンタは 0 にクリアされます。
2. 長所と短所:
フィルタリング効果は、変化の遅い信号には適していますが、変化の速い信号には適していません。
臨界値付近でジャンプすることは避けてください。カウンタがオーバーフローして干渉値を収集すると、フィルタリングできません。
3. コード:
#define N 12
char filter()
{
char count=0,new_value;
new_value=get_ad();
while(value!=new_value)
{
count++;
if(count>=N){
return new_value;
}
new_value=get_ad();
}
return value;
}
10. 制限およびデバウンスフィルタリング
1. 方法:
最初にクリッピングしてからデバウンス
2. 長所と短所:
制限とデバウンスの利点を組み合わせ、
干渉値の導入を回避し、急速に変化する信号には適していません。
3. コード:
#define A 10
#define N 12
char value;
char filter()
{
char new_value,count=0;
new_value=get_ad();
while(value!=new_value){
if(Abs(value-new_value)<A){
count++;
if(count>=N){
return new_value;
}
new_value=get_ad();
}
return value;
}
}