发新帖本帖赏金 13.00元(功能说明)我要提问
返回列表
打印

软件限幅滤波器,过滤后还有高于限幅的值

[复制链接]
1916|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jrcsh|  楼主 | 2016-8-16 15:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jrcsh 于 2016-8-16 18:59 编辑

无理头纠结型问题:用了软件滤波器,但是还是得到高于滤波器的限值的值
限幅滤波器代码:

ttt=0;
while(ttt==1)
{
bbb=adc();//ADC采集

if(aaa>bbb-3)
{
ttt=1;
}
else
{
if(aaa<bbb+3)
{
ttt=1;
}

}


}
aaa=bbb;  //  采集后,比较限幅值,范围内就采用, 超出就重要采集, 完后作为下一次比较的样本数据。


限制 bbb 得到数值是 aaa 的+- 3 的范围内  可是,现在采集到的数据时不时的会出现大于这个限幅度过滤的值 有规律的 aaa+100 或 aaa-100  

使用的是 STC12C5A32S2.............    不会这样也要坑我把。。。。。。




补充:图片......   明显的毛刺




相关帖子

沙发
Waming| | 2016-8-16 18:12 | 只看该作者
帖子出来接近三个小时,没人回答,我来总结一下:

1. 贴出来的代码排版真不是一般的糟,看的头疼

2.代码不完整无法分析问题,如果是个函数,得把整个函数都贴出来,如果只贴一部分,真心告诉你,几乎不会有人回答你的问题

3. 代码有逻辑问题,while(t == 1),这个循环进得去? 如果进去了,出得来?

使用特权

评论回复
板凳
dirtwillfly| | 2016-8-16 18:48 | 只看该作者
楼主追踪一下,看看程序是不是按想法执行了

使用特权

评论回复
地板
jrcsh|  楼主 | 2016-8-16 18:50 | 只看该作者
本帖最后由 jrcsh 于 2016-8-16 18:59 编辑
Waming 发表于 2016-8-16 18:12
帖子出来接近三个小时,没人回答,我来总结一下:

1. 贴出来的代码排版真不是一般的糟,看的头疼

这个现场写的,  过滤的函数 涉及 ADC数据的处理就这个函数。

3, 使用串口输出数据,检测过,可以出来。




补充图片

使用特权

评论回复
5
jrcsh|  楼主 | 2016-8-16 18:57 | 只看该作者
本帖最后由 jrcsh 于 2016-8-16 19:03 编辑
dirtwillfly 发表于 2016-8-16 18:48
楼主追踪一下,看看程序是不是按想法执行了

串口数据跟踪了,   从进入函数到if条件的情况, 都正常,   就是莫名其妙~~~  会跑出一些,  明显要过滤的数值出来,  
我也尝试去除,其它功能的代码,专门留下ADC 部分来观察。。。。。。。。。  
搞得我都~~~怀疑,我逻辑有漏洞?  (TMD 就这几句)~~~  ADC抽风(已经上软件过滤器了) ~~~~串口发送数据会抽风(以前没有过~~~TMD不会这么神奇把,也更换过MCU了 还是这样)

使用特权

评论回复
6
jrcsh|  楼主 | 2016-8-16 19:11 | 只看该作者
顺手放福利:

C语言实现软件滤波.pdf (622.16 KB)

使用特权

评论回复
评分
参与人数 2威望 +6 收起 理由
LearningASM + 3 赞一个!
dirtwillfly + 3 赞一个!
7
dirtwillfly| | 2016-8-16 19:22 | 只看该作者
jrcsh 发表于 2016-8-16 18:50
这个现场写的,  过滤的函数 涉及 ADC数据的处理就这个函数。

3, 使用串口输出数据,检测过,可以出来 ...

从图上看你的干扰很有规律阿

使用特权

评论回复

打赏榜单

jrcsh 打赏了 3.00 元 2016-08-19
理由:只有这么多了 感谢指导

8
yytdragon| | 2016-8-16 19:45 | 只看该作者
本帖最后由 yytdragon 于 2016-8-16 19:49 编辑

对于功能不评价
这代码写的也是让我这个几乎不写程序的人醉了
首先,变量/常量 这么写真让人头疼,你E文不好写拼音咋了,例如:你就写 caiyangzhi 又如何,比bbb 不强么
另外,运算符的优先级问题,非要让人去想优先级么
if(aaa>(bbb-3)) 这样多好,根本不用想优先级再说,如果你写成 if(bbb<(aaa+3)) 不是更体现你的实际需要么。。。
再进一步,你确保以后你的3 不需要改么,你写成  定一个 宏   fuzhi   3 多好
然后  if(bbb<(aaa+fuzhi))


然后再说说程序逻辑上的问题
限幅滤波,明显应该是个同时满足的条件,也就是说,必须要  (aaa-3) < bbb <(aaa+3)才行
你这么写,是个或的关系吧
肯定会有特殊的数据,跳过你的实际条件限定



使用特权

评论回复

打赏榜单

jrcsh 打赏了 10.00 元 2016-08-19
理由:感谢指导

9
jrcsh|  楼主 | 2016-8-17 01:23 | 只看该作者
dirtwillfly 发表于 2016-8-16 19:22
从图上看你的干扰很有规律阿

怀疑是市电网的电磁波干扰。。。。。。。   打算软处理就好了,

使用特权

评论回复
10
jrcsh|  楼主 | 2016-8-17 01:24 | 只看该作者
yytdragon 发表于 2016-8-16 19:45
对于功能不评价
这代码写的也是让我这个几乎不写程序的人醉了
首先,变量/常量 这么写真让人头疼,你E文不 ...

  这个有可能, 一伙或明天晚上试试,

使用特权

评论回复
11
frognidie| | 2016-8-17 11:18 | 只看该作者
直接上低通滤波器试试

使用特权

评论回复
12
jrcsh|  楼主 | 2016-8-19 12:24 | 只看该作者
本帖最后由 jrcsh 于 2016-8-19 12:58 编辑

  经过数据跟踪,找出是我们逻辑有漏洞,


  

for(ttt=3;ttt<10;ttt++)
{

SendData('D');  

SendData(' ');
adctemp=ddd;

   SendData(commm[adctemp/10000%10]);  
   SendData(commm[adctemp/1000%10]);  
   SendData(commm[adctemp/100%10]);  
   SendData(commm[adctemp/10%10]);  
   SendData(commm[adctemp%10]);

SendData(' ');

SendData('*');
ddd1=GetADCResult(ch);
SendData(' ');
adctemp=ddd1;

   SendData(commm[adctemp/10000%10]);  
   SendData(commm[adctemp/1000%10]);  
   SendData(commm[adctemp/100%10]);  
   SendData(commm[adctemp/10%10]);  
   SendData(commm[adctemp%10]);

SendData(' ');


if(ddd<=ddd1)
{
if(ddd>(ddd1-3)) //>
{


//return ddd;
SendData('>');  

SendData(' ');

adctemp=ddd1;

   SendData(commm[adctemp/10000%10]);  
   SendData(commm[adctemp/1000%10]);  
   SendData(commm[adctemp/100%10]);  
   SendData(commm[adctemp/10%10]);  
   SendData(commm[adctemp%10]);

SendData(' ');



ttt=20;

} // -3
}
else
{

if(ddd<(ddd1+3)) //<
{

ttt=20;

SendData('<');

SendData(' ');

adctemp=ddd1;

   SendData(commm[adctemp/10000%10]);  
   SendData(commm[adctemp/1000%10]);  
   SendData(commm[adctemp/100%10]);  
   SendData(commm[adctemp/10%10]);  
   SendData(commm[adctemp%10]);

SendData(' ');


}


        
}



SendData(' ');
SendData(' ');
ttt--;
} // w



















完   感谢楼上 2位给出实质有效的意见。

















使用特权

评论回复
13
jrcsh|  楼主 | 2016-8-19 12:34 | 只看该作者
  

  从数据中对比有BUG的情况.

使用特权

评论回复
14
yytdragon| | 2016-8-19 13:18 | 只看该作者
jrcsh 发表于 2016-8-19 12:34
从数据中对比有BUG的情况.

解决就好,
其实避免这种逻辑漏洞的办法,就是先写伪码,或者画程序流程图,然后按图实现,基本就没问题了
在写伪码和流程图的时候,基本会自然考虑逻辑和边界值问题

使用特权

评论回复
15
jrcsh|  楼主 | 2016-8-19 13:19 | 只看该作者
本帖最后由 jrcsh 于 2016-8-19 13:22 编辑

for(ttt2=0;ttt2<5;ttt2++)
{
for(ttt=3;ttt<10;ttt++)
{

ddd1=GetADCResult(ch);


if(ddd<=ddd1)
{
if(ddd>(ddd1-3)) //>
{

ttt=20;

} // -3
}
else
{

if(ddd<(ddd1+3)) //<
{

ttt=20;

}
        
}


ttt--;
} // w

adcttt[ttt2]=ddd1;


}//ttt1

ddd1=(adcttt[0]+adcttt[1]+adcttt[2]+adcttt[3]+adcttt[4])/5;

adctemp=ddd1;


   SendData(commm[adctemp/10000%10]);  
   SendData(commm[adctemp/1000%10]);  
   SendData(commm[adctemp/100%10]);  
   SendData(commm[adctemp/10%10]);  
   SendData(commm[adctemp%10]);

ddd=adctemp;



增加平均处理 :





  看起来可以接受了

使用特权

评论回复
16
1870113179| | 2016-8-20 11:36 | 只看该作者
我的胃

使用特权

评论回复
17
tyw| | 2016-8-20 11:54 | 只看该作者
坛子藏龙卧虎+楼主高悟性,终于功德圆满.哈哈



使用特权

评论回复
18
jrcsh|  楼主 | 2016-8-20 12:10 | 只看该作者
本帖最后由 jrcsh 于 2016-8-22 00:40 编辑

有点另类的过采样.......   实现  

放大数据 10位(多出一个量级位) 在平均处理,保留了最后一位。。。。顺便就得到(原10位) 11位的过采样....

  增加了限次..... 避免掉进去就不出来了~~~~~   这是狂用软处理的节奏

for(ttt2=0;ttt2<5;ttt2++)
{
ttt3=0;
for(ttt=3;ttt<10;ttt++)
{


ddd1=GetADCResult(ch)*10;
ttt3++;
if(ttt3>30)
{
ttt=20;
ddd1=ddd;

}


if(ddd1==0)ddd1=15;

if(ddd<=ddd1)
{
if(ddd>(ddd1-30)) //>
{

ttt=20;

} // -3
}
else
{

if(ddd<(ddd1+30)) //<
{

ttt=20;

}
       
}


ttt--;
} // w

adcttt[ttt2]=ddd1;


}//ttt1

ddd1=(adcttt[0]+adcttt[1]+adcttt[2]+adcttt[3]+adcttt[4])/5;

adctemp=ddd1;


   SendData(commm[adctemp/10000%10]);  
   SendData(commm[adctemp/1000%10]);  
   SendData(commm[adctemp/100%10]);  
   SendData(commm[adctemp/10%10]);  
   SendData(commm[adctemp%10]);

ddd=adctemp;

使用特权

评论回复
19
yu515301489| | 2016-8-21 08:29 | 只看该作者
tyw 发表于 2016-8-20 11:54
坛子藏龙卧虎+楼主高悟性,终于功德圆满.哈哈

呵呵,高手也灌水~~~

使用特权

评论回复
发新帖 本帖赏金 13.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:以上以下纯属瞎扯,概不承认!!!!! 感谢  应试教育 培养了我的基础    感谢自己  没吧应试教作为各种借口

228

主题

2348

帖子

18

粉丝