OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5393|回复: 11

求助在STM32平台上做一个50HZ的滤波器,谁有什么好的办法的啊?之前我在上位机MATLAB上做很简单,但是不是C没法移植到STM32上,谁有什么好的50HZ在单片机上的程序

[复制链接]

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2014-12-9 08:59:32 | 显示全部楼层 |阅读模式
5金钱
求助在STM32平台上做一个50HZ的滤波器,谁有什么好的办法的啊?之前我在上位机MATLAB上做很简单,但是不是C没法移植到STM32上,谁有什么好的50HZ在单片机上的程序

最佳答案

查看完整内容[请看2#楼]

回复【9楼】cornrn: --------------------------------- 我看了下 , 原来是我 之前改动过, 但是注释没改。 。 。 总感觉不对呢~  那个8 不是次数   次数是1次。 是通道数是8,   9000是 实际的测量次数  9M /(9000*(12.5+7.5)) /8   单次采样周期为 12.5+7.5 =20, 这个是ADC初始化部分决定的 ...
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2014-12-9 08:59:33 | 显示全部楼层
回复【9楼】cornrn:
---------------------------------
我看了下 , 原来是我 之前改动过, 但是注释没改。 。 。 总感觉不对呢~
 那个8 不是次数   次数是1次。 是通道数是8,   9000是 实际的测量次数

 9M /(9000*(12.5+7.5)) /8  

单次采样周期为 12.5+7.5 =20, 这个是ADC初始化部分决定的。  

想要确定多少次(n)开始计算,

t = 20ms = (12.5+7.5)(周期)/ 9M(频率) * n(次) * 8(通道) *1000(ms/s)

这样 就求出来 n=9000了,

我下面 用了一个数 你看 是72000  就是 = n*8
回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2014-12-9 15:06:22 | 显示全部楼层
C没法移植到STM32上?

将ADC时钟 设置为9M  , 采样周期设置为7.5周期   [9M /(9000*(12.5+7.5)] /8 [滤除50Hz干扰]
中断里面累计计数,结果累加, 累计 7200次<我的是4个通道采集, 你自己计算下是多少次 为20ms吧>  
最后结果除以7200, 取个均值出来  

这样对50Hz滤波的效果最好。

亲测~
回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2014-12-9 15:09:44 | 显示全部楼层
[mw_shl_code=c,true]// 中断里 ADChannelNum=4 static int index=0; static long sum[ADChannelNum]; if(++index>=(72000/ADChannelNum)) //次数达到20ms { index=0; for(int n=0; n<ADChannelNum; n++) { Value[n] = sum[n]/(72000/4); //计算4通道的均值 sum[n]=0; } } for(int n=0; n<ADChannelNum; n++) //平常时累加 sum[n] += ADValues[n]; [/mw_shl_code]

回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-12-9 16:34:31 | 显示全部楼层
回复【2楼】aleda303:
---------------------------------
兄台,我是说      但是 不是 C,MATLAB上编写的不是C所有没法移植
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-12-9 16:45:11 | 显示全部楼层
回复【2楼】aleda303:
---------------------------------
 [9M /(9000*(12.5+7.5)] /8这里面 9000和8是哪里来的数啊,看不到
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

28

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2013-10-11
在线时间
38 小时
发表于 2014-12-9 20:40:47 | 显示全部楼层
ST有C的滤波代码,你可以找找看。
回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2014-12-10 08:35:18 | 显示全部楼层
回复【5楼】cornrn:
---------------------------------
这是我很久之前的代码了, 
是4通道采集 用DMA连续采集 开DMA中断,

这是初始化部分, 不过是C++ 的,[我一直用的C++,你应该能看懂]
[mw_shl_code=c,true] DMA1_Channel1->Config(     true, //使能 ADChannelNum*ADGetTimes, //传输数据数量 DMAChannelType::Circular, //循环模式 (u32)&ADC1->DR, //外设地址 (u32)&ADValues, //内存地址 DMAChannelType::ReadFromPhi, //传输方向 false, //外设增量 true, //内存增量 DMAChannelType:_16b, //外设数据宽度 DMAChannelType:_16b, //内存数据宽度 DMAChannelType:_H, //优先级 DMAChannelType::TrComplete //开启完成中断 ); NVIC->Config(DMA1_Channel1_IRQChannel, 1,1,true); ADC1->Config(ADChannelNum); ADC1->RegularChannelConfig( ADCType::Chn_3, 1 ,ADCType::T_7p5 ); ADC1->RegularChannelConfig( ADCType::Chn_2, 2 ,ADCType::T_7p5 ); ADC1->RegularChannelConfig( ADCType::Chn_1, 3 ,ADCType::T_7p5 ); ADC1->RegularChannelConfig( ADCType::Chn_0, 4 ,ADCType::T_7p5 ); [/mw_shl_code] [mw_shl_code=c,true]        ADC1->DMAEnable(true); ADC1->Enable(true); ADC1->RegularSoftTrigEnable(true); ADC1->RstCalibration(); while(ADC1->WaitRstCalibration()); ADC1->Calibration(); while(ADC1->WaitCalibration()); ADC1->RegularSoftTrigEnable(true);[/mw_shl_code]


回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2014-12-10 08:36:51 | 显示全部楼层
回复【5楼】cornrn:
---------------------------------
想起来了, ADGetTimes=8    是DMA采集8次 发生中断

这些值都可以配置, 仔细看下参考手册 ,计算下时间,保证最后20ms更新一次即可。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-12-10 09:01:08 | 显示全部楼层
回复【8楼】aleda303:
---------------------------------
谢谢,还有一点式中 9000 是指什么啊
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2014-12-10 10:39:40 | 显示全部楼层
回复【9楼】cornrn:
---------------------------------

看下数据手册 AD采集时序,

回头我也看下 ,  好久了,当时没注释明白。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-12-10 12:09:30 | 显示全部楼层
回复【11楼】aleda303:
---------------------------------
明白了!!!三克油威略嘛且
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 02:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表