基于STM32的A/D采样软件滤波改进算法研究
黄健;张善文;周端
【摘 要】在工程实践和实验中,经常要对经过A/D转换后的数据进行采集,但由于存在外界干扰和电路设计不合理等因素,将会导致数据不停的跳变,非常不稳定。为了改善这种情况,有效地去除干扰,提出一种改进的软件滤波算法。采用STM32作为高速处理器,对16个通道的A/D连续采样1600次,每个通道采集100次,将采样到的数据通过内部的高速DMA通道传送到内存的数组中。首先对每个通道的100个数据进行冒泡排序,去掉排序后的前后各10个数据,用剩余的80个数据再取平均值。测试结果表明:这种改进的均值滤波算法,能够有效的去除跳变的干扰数据,使得处理后的数据变得稳定、可靠,提高了精度和稳定性。%A/D conversion data are often sampled in engineering practice and experiment ,but external interference and incor-rect circuit design and some other factors will cause data hopping and instable .In order to solve this problem ,a new software filte-ring algorithm was raised to remove interference .Using STM32 microprocessor to scan 16 external A/D channels and continuous sample data 1 600 times,each channel sample 100 times,through
DMA these sample data were transferred to memory .One hundred data of each channel can be bubbled sort ,10 data of minimal and 10 data of maximal after sort were removed ,the left 80 data were averaged .The test results show that this improved algorithm can effectivly get rid of disturbance data ,making sample data stable and realiable,thus improving the precision and stability .
【期刊名称】《仪表技术与传感器》
【年(卷),期】2016(000)003
【总页数】3页(P83-85)
【关键词】软件滤波;冒泡排序;A/D采样
【作 者】黄健;张善文;周端
【作者单位】西京学院电子信息工程系,陕西西安 710123;西京学院电子信息工程系,陕西西安 710123;西安电子科技大学计算机学院,陕西西安 710071
【正文语种】中 文
【中图分类】TN919.6
在工程实践和实验中,经常要对A/D转换后的数据进行处理。为了得到稳定、可靠的数据,经常要进行多次采集。但由于在实践中存在各种外界干扰、硬件电路布线不合理等因素,采集到的数据通常会有比较大的跳变,非常不稳定。因此,如何取得稳定、可靠、接近实际值的数据就摆在了工程设计人员的面前。为了有效地去除干扰,通常会采用各种软件滤波算法,比如多次采集取平均值的滤波算法、卡尔曼滤波算法等。在这些算法中,取平均值滤波算法是最简单有效的。但通常的做法是:将采集到的多个数据进行平均,以求得到有效值[1-3]。但这种做法并没有去除干扰,如果干扰比较大,将会存在多个不稳定数据。基于此,本文提出一种改进的滤波算法,将采集到的多个数据首先进行排序,这样干扰比较大的数据就会出现在开始或者最后,去掉前面和后面的部分数据,中间剩下的将是比较稳定的数据,用这部分数据再求平均值,将会得到一个干扰比较小的有效值。另外,要实现大量的数据采集,必然要消耗更多的时间,为提高速度,采用STM32高性能微处理器,主频可达到72 MHz,A/D采集频率可达到12 MHz,多达18个通道,在进行批量采集
时,可采用DMA方式,通过DMA将采集的数据高速大批量传递给内存,有效地提高了采样处理速度。
系统设计方案如图1所示,主控采用STM32F103,对16路A/D进行循环连续采集,将采集到的电压值送到2.4寸真彩液晶屏上显示。为了验证改进算法的有效性,在数据采集时,在STM32的PA0采集恒流源的电流大小[4-5]。其余通道采集滑动变阻器的分压电压。
1.1 STM32F103简介
STM32F103是一款高性能嵌入式芯片,基于Cortex-M3技术,含有16通道的12位A/D、DMA、RTC、USB、CAN等众多资源。可实现对外部数据的高速采集。镇海疫情最新消息
1.2 采样电路简介
采样电路可以由2部分构成,即普通的电位器分压电路和有较大干扰的恒流源测压电路[6],电流检测电路如图2所示。
在活五百年图2中为了检测流过电阻R1的电流大小,建立了一个正反馈放大电路,放大倍数为1+R4/R
3=51,流过负载R1的电流变化范围是0.25~0.35 A,由此可计算得到输入给STM32的PA0的电压变化范围是1.275~1.785 V。检测到电压后,通过I=U/R,即可求得流过负载R1的电流大小。
1.3 显示电路简介
显示电路采用12864接口的ILI9325,可以在液晶屏上显示采集到的16路电压值。
2.1 软件流程图
在进行STM32F103软件开发时,编程语言采用C语言,编译环境为MDK5.0软件,流程图如图3所示。清炖鸽子汤
在编程时,首先初始化ADC的16个通道为连续扫描模式,采集完1600次后启动DMA通道将1600个数据高速传送到内存数组中,传送完成后产生DMA中断[7]。在DMA中断中,首先关掉A/D采集,对1 600个数据中每个通道的100个数据进行冒泡排序,然后去掉排序后的最大值和最小值各20个,用剩下的80个数据求平均值,最后将其送到TFT真彩屏上去显示。
2.2 ADC初始化程序代码
void Adc1_Init(void)
{
rcc->apb2enr|=1<<2;//使能时钟
rcc->apb2enr|=1<<4;//使能时钟
rcc->apb2enr|=1<<3;
gpiob->crl&=0xffffff00;gpioa->crl&=0x0000000;gpioc->crl&=0xff000000;rcc->apb2enr|=1<<9;
delay_ms(10);
rcc->apb2rstr|=1<<9;//adc1复位
rcc->apb2rstr&=~(1<<9);
rcc->cfgr&=~(3<<14);rcc->cfgr|=2<<14;//6分频
adc1->cr1&=0xf0ffff;
教师教学工作总结adc1->cr1|=0<<16;//独立工作模式
adc1->cr1|=1<<8;//扫描模式
adc1->cr2|=1<<1;//启用连续转换
adc1->cr2&=~(7<<17);做我的小宝贝只吃几把不吃苦
adc1->cr2|=7<<17;//软件控制转换
adc1->cr2|=1<<20;adc1->cr2&=~(1<<11);
//右对齐
adc1->sqr1&=~(0xf<<20);
adc1->sqr1|=15<<20;//16个通道
adc1->sqr3 = 0x00000000;
adc1->sqr3|= 0x1ee18820;
adc1->smpr1&=0x00000000;
adc1->smpr2&=0x00000000;
adc1->smpr2=0x00ffffff;adc1->smpr1=0x00ffffff;adc1->cr2|=1<<23;adc1->cr2|=1<<22;//启动转换通道
adc1->cr2|=1<<8;//启用dma
adc1->cr2|=1<<0;//开启ad转换器
adc1->cr2|=1<<3;//使能复位校准
while(adc1->cr2&1<<3);adc1->cr2|=1<<2;
//开启ad校准
while(adc1->cr2&1<<2);
adc1->cr2|=1<<0;}}
2.3 DMA初始化
将DMA初始化为从ADC1连续的读16个通道的转换结果,将其传送到内存的数组SendBuff[1600]中,ADC的地址和数组的地址自动加一,传送完1 600个数据后产生DMA中断。
2.4 软件滤波处理
在进行软件滤波处理时,首先要进行冒泡排序,冒泡排序的算法描述如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论