2020-02-08 09:07发布
JamesErik 发表于 2012-7-23 14:46 看看我的帖子,很多高人指导。
mored 发表于 2012-7-23 15:58 硬件找原因吧,串1k并0.1u
yangzichen 发表于 2012-7-23 15:49 正在看 ,但是对那段程序代码没有看明白, 软件滤波比较重要 曾经没软件滤波前AD跳动50个数 加滤波跳动5 ...
最多设置5个标签!
正在看 ,但是对那段程序代码没有看明白,
软件滤波比较重要 曾经没软件滤波前AD跳动50个数 加滤波跳动5个数
int filter(unsigned char channel)
{
unsigned char i;
unsigned int idata adc_value[8]; //AD转换缓冲区
unsigned int adc_value_ave=0;
unsigned int max_value=0,min_value=0,max_index=1,min_index=1;
for (i=0;i<8;i++) //连续转换8次
{
adc_value = get_AD_result(channel); //将单次ADC转换结果放入缓冲区
// delay(10); //每次转换延迟时间
}
for(i=1;i<8;i++) // 去掉第一次测量值
{
adc_value_ave+=adc_value;
}
adc_value_ave/=7; // 去掉一个值外的平均值
for(i=1;i<8;i++) // 计算最大值和最小值索引号 排序
{ //排序 最大值第1位(1) 最小值最后1位(i)
if(adc_value>adc_value_ave)//大于平均值
{
if((adc_value-adc_value_ave)>max_value)
{
max_value=adc_value;
max_index=1;
}
}
else //小于平均值
{
if((adc_value_ave-adc_value)>min_value)
{
min_value=adc_value_ave-adc_value;
min_index=i;
}
}
}
adc_value_ave=0;
for(i=1;i<8;i++) // 计算去掉最大值和最小值后的总和
{
if((i!=max_index)&&(i!=min_index))//去掉最大值和最小值
{
adc_value_ave+=adc_value;
}
}
if(max_index!=min_index) // 如果测量值不同
{
adc_value_ave/=5; // 计算平均值
}
else // 如果测量值相同
{
adc_value_ave/=6; // 计算平均值
}
return adc_value_ave;
}
你能加个QQ私聊吗 305834138
是的, 万用表看到的是低频部分,也许高频有很多干扰,如果你有真有效值而且频率响应很宽的表,可以用交流测测看到底信号本身干净否
我不怎么上扣扣哈,那个滤波就是去掉最大最小值,然后求平均的。
一周热门 更多>