打印
[学习笔记]

ADC多路定时周期采样+中值滤波(附源码)

[复制链接]
1889|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JasonLee27|  楼主 | 2019-7-19 11:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 JasonLee27 于 2019-7-19 11:17 编辑

硬件环境: 通用开发板软件:keil 5.2.3

涉及模块:GPIO,ADC,CTU,TIMER,DMA

先讲下原理:通过CTU模块,配置TIMER0定时触发ADC进行采样,ADC配置成规则组多通道单次采样,并采用DMA接收采样数据,因为要进行滤波处理,所以DMA传输的数据为规则组通道数的n倍(假设规则组有10个通道,则一次采样总共产生20字节数据,每次采样10组数据,那DMA传输长度就设置为20*10=100)。配置完成后,基本的流程就是:Timer0计时溢出触发ADC采样,ADC按规则组通道依次进行转换,并将转换的结果通过DMA传输到指定的存储区域,在Timer0 n次溢出后,DMA传输数据长度完成,产生DMA中断,此时就可以对数据进行处理了;当然,我们也可以不在中断里面处理,而采用定时处理的方式。

源码里都有详细的注释,就不在多讲了:
adc_sample.rar (1.07 MB)

使用特权

评论回复

相关帖子

沙发
topstar123| | 2019-7-25 10:20 | 只看该作者
这里所说的滤波处理是指IC本身可以设置滤波属性吗?

使用特权

评论回复
板凳
JasonLee27|  楼主 | 2019-7-25 10:34 | 只看该作者
topstar123 发表于 2019-7-25 10:20
这里所说的滤波处理是指IC本身可以设置滤波属性吗?

IC本身不可以设置滤波属性,是通过多次周期采样,然后进行软件滤波

使用特权

评论回复
地板
JasonLee27|  楼主 | 2019-7-25 10:35 | 只看该作者
topstar123 发表于 2019-7-25 10:20
这里所说的滤波处理是指IC本身可以设置滤波属性吗?

你有接触过什么MCU是可以设置滤波的吗?

使用特权

评论回复
评论
topstar123 2019-7-25 11:55 回复TA
当然没有,干扰这东西不同场景不一样。不可能在IC里面吧。 只是你发表的感觉能滤波。我误解了 
5
a20084666| | 2019-8-29 13:20 | 只看该作者
中值滤波在电机控制上,有什么优势,能滤除什么 干扰?

使用特权

评论回复
6
JasonLee27|  楼主 | 2019-8-29 13:51 | 只看该作者
a20084666 发表于 2019-8-29 13:20
中值滤波在电机控制上,有什么优势,能滤除什么 干扰?

一般硬件搭的好的应该都不需要,只是考虑一些硬件设计简单,波形上干扰较多的情况。

使用特权

评论回复
7
a20084666| | 2019-8-29 13:59 | 只看该作者
这个算法能够滤除什么样的干扰呢,举个例子呗

使用特权

评论回复
8
JasonLee27|  楼主 | 2019-8-29 14:04 | 只看该作者
a20084666 发表于 2019-8-29 13:59
这个算法能够滤除什么样的干扰呢,举个例子呗

就是一个一般的滤波算法吖,假设你一个平整的波形上有一个尖刺,你刚好又采在这个尖刺上,那么此次采样就不准了,即使多次采样求平均,这个尖刺依然会拉高你的采样值,这个时候选择多次采样的中值数据,它的准确性就会高很多。

使用特权

评论回复
9
a20084666| | 2019-8-29 14:14 | 只看该作者
JasonLee27 发表于 2019-8-29 14:04
就是一个一般的滤波算法吖,假设你一个平整的波形上有一个尖刺,你刚好又采在这个尖刺上,那么此次采样就 ...

说的很有道理,中值滤波就是去除单次波动较大的点对吧

使用特权

评论回复
10
JasonLee27|  楼主 | 2019-8-29 14:35 | 只看该作者
a20084666 发表于 2019-8-29 14:14
说的很有道理,中值滤波就是去除单次波动较大的点对吧

对,整体波动不大的情况下,平均数肯定会比较准确点,但如果有几个波动太大的点,用中值滤波就比较好。

使用特权

评论回复
11
a20084666| | 2019-8-29 14:40 | 只看该作者
JasonLee27 发表于 2019-8-29 14:35
对,整体波动不大的情况下,平均数肯定会比较准确点,但如果有几个波动太大的点,用中值滤波就比较好。 ...

好的,明白了,方波电流你一般怎么做呢

使用特权

评论回复
12
zlmin| | 2019-10-3 10:26 | 只看该作者
谢谢分享!

使用特权

评论回复
13
Rhizobium| | 2019-12-11 09:40 | 只看该作者
void adc_Initialize(void)函数里面有错误,通道号写错了,要改成:
    ADC_SetRegularGroupSequence(ADC, 1, ADC_CHANNEL_AD0); ///set ADC_CHANNEL_AD0 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 2, ADC_CHANNEL_AD1); ///set ADC_CHANNEL_AD1 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 3, ADC_CHANNEL_AD2); ///set ADC_CHANNEL_AD2 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 4, ADC_CHANNEL_AD3); ///set ADC_CHANNEL_AD3 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 5, ADC_CHANNEL_AD4); ///set ADC_CHANNEL_AD4 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 6, ADC_CHANNEL_AD5); ///set ADC_CHANNEL_AD5 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 7, ADC_CHANNEL_AD6); ///set ADC_CHANNEL_AD6 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 8, ADC_CHANNEL_AD7); ///set ADC_CHANNEL_AD7 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 9, ADC_CHANNEL_AD8); ///set ADC_CHANNEL_AD8 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 10, ADC_CHANNEL_AD9); ///set ADC_CHANNEL_AD9 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 11, ADC_CHANNEL_AD10); ///set ADC_CHANNEL_AD10 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 12, ADC_CHANNEL_AD11); ///set ADC_CHANNEL_AD11 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 13, ADC_CHANNEL_AD12); ///set ADC_CHANNEL_AD12 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 14, ADC_CHANNEL_AD13); ///set ADC_CHANNEL_AD13 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 15, ADC_CHANNEL_AD14); ///set ADC_CHANNEL_AD14 for AD Sample
    ADC_SetRegularGroupSequence(ADC, 16, ADC_CHANNEL_AD15); ///set ADC_CHANNEL_AD15 for AD Sample

使用特权

评论回复
14
JasonLee27|  楼主 | 2019-12-11 09:53 | 只看该作者
Rhizobium 发表于 2019-12-11 09:40
void adc_Initialize(void)函数里面有错误,通道号写错了,要改成:

额,多谢指正,代码复制粘贴的,没改过来

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

11

粉丝