|
楼主 |
发表于 2017-3-27 18:55:29
|
显示全部楼层
275891381 发表于 2017-3-27 11:54
return random(295, 305); 这一句话换成测距结果就可以了
/*
A、名称:算术平均滤波法
B、方法:
连续取N个采样值进行算术平均运算:
N值较大时:信号平滑度较高,但灵敏度较低;
N值较小时:信号平滑度较低,但灵敏度较高;
N值的选取:一般流量,N=12;压力:N=4。
C、优点:
适用于对一般具有随机干扰的信号进行滤波;
这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动。
D、缺点:
对于测量速度较慢或要求数据计算速度较快的实时控制不适用;
比较浪费RAM。
E、整理:shenhaiyu 2013-11-01
*/
int Filter_Value;
void setup() {
Serial.begin(9600); // 初始化串口通信
randomSeed(analogRead(0)); // 产生随机种子
}
void loop() {
Filter_Value = Filter(); // 获得滤波器输出值
Serial.println(Filter_Value); // 串口输出
delay(50);
}
// 用于随机产生一个300左右的当前值
int Get_AD() {
return random(295, 305);
}
// 算术平均滤波法
#define FILTER_N 12
int Filter() {
int filter_sum = 0;
int i=0;
for( i = 0; i < FILTER_N; i++) {
filter_sum += Get_AD();
delay(1);
}
return (int)(filter_sum / FILTER_N);
}
我写的是下面的
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
int TrigPin = 9;
int EchoPin =8;
double Time_Echo_us;
void setup()
{
lcd.begin(16,2);
lcd.print("Welcom to Use");
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
}
void loop()
{
digitalWrite(TrigPin,LOW);
delayMicroseconds(2);
digitalWrite(TrigPin,HIGH);
delay(1);
digitalWrite(TrigPin,LOW);
Time_Echo_us= pulseIn(EchoPin,HIGH);
if(( Time_Echo_us <= 23530)&&(Time_Echo_us > 175))
{
lcd.print( Filter());
delay(600);
lcd.clear();
lcd.home();
}
else
{
lcd.clear();
}
}
#define FILTER_N 10
int Filter()
{
int filter_sum = 0;
for(int i = 0; i < FILTER_N; i++)
{
filter_sum +=( Time_Echo_us*0.017);
delay(1);
}
return ((int)(filter_sum / FILTER_N));
}
前辈,谢谢你多次给我解答疑惑,麻烦你再看看 我写的这个正不正确。滤波部分是论坛10大滤波算法之一的算术平均滤波法(限幅滤波不怎么适合超声波,所以我换了一个)。这个原贴算术平均滤波法代码是这样的
请你帮我看下我借鉴算术平均滤波法写的有没有问题,在液晶上面的显示也能显示的出来。但是我感觉测距结果还是和原来一样,同一个地方测距,放着不动,数值跳动有2CM上下浮动。 ,就这样的。好像不成功。我本意是在一个周期内多取几次超声波测量值,然后取平均值,显示在液晶上,这样想必稳定些,所以借鉴这个算术平均法,但情况不怎么理想,不知道是不是我理解错了。按道理取了平均值后,显示平均值在液晶上,跳动不会猛地变化,最少整数位不会出现2厘米浮动,同一个位置,超声波模块也没有拿在手上晃动 。我估计是把程序写错了,根本没有取到平均值,麻烦您给我指导整理一下,感激不尽。
|
|