基于微控制器数字滤波实现
2013-04-27谭家杰
谭家杰
(衡阳师范学院 物理与电子信息科学系,湖南 衡阳 421002)
0 引 言
数字滤波是语音信号处理、图象处理、谱分析等领域中的一个基本处理技术。目前,数字滤波器的实现方式较多,主要集中在:通用计算机加软件实现[1-3];专用 DSP(digital signal processor)芯片实现[4];可编程逻辑器件来开发数字滤波器[5-8];或用微控制器实现[8-12]。以微控制器为主要器件实现数字滤波器相对采用DSP器件或可编程逻辑器件要容易、简单得多,在微控制器的滤波器实现方面主要有(1)微控制器滤波器算法研究[9]。(2)微控制器配合程控滤波模块实现[10-13]。论文的滤波器系统以STC12C5A16S2微控制器为核心,该器件自带10位A/D。系统配合 MAX538D/A转换芯片,加上LCD1602显示滤波类型,并辅之以按键来切换滤波算法。系统功能是对采样数据进行滤波处理,系统实现的算法有:限幅滤波、中值滤波、算术平均滤波、加权平均滤波、滑动平均滤波五种滤波算法。
1 基本原理
微控制器(micro controller unit,MCU),俗称单片机,其主要精于实时控制,不长于复杂的算法。微控制器实现数字滤波算法最大问题是微控制器的运行速度慢,尤其是基于51核的微控制器,它一般将外部晶振进行12分频,器件运行速度大减。若将此类微控制器用于完成FIR、IIR滤波器有一定困难。因此,都采用微控制器配合其它器件来实现滤波器算法,如文献[10]以可控放大器PGA203为核心实现滤波器;文献[11]以AT89S52控制程控放大实现滤波;文献[12-13]以微控制器控制集成开关电容有源滤波器MAX262来实现滤波;上述文献进一步说明了传统51微控制器不可能像DSP芯片那样完成复杂的滤波运算。随着微控制器技术的快速发展,它在运行速度方面有了很大改进。采用流水线指令结构,废除机器周期的概念,指令以时钟周期为运行单位,平均每一时钟执行1条单周期指令,这方面主要有C8051F系列微控制器。精简指令集CPU代替复杂指令集CPU,以字作为指令长度单位,可高速执行指令,这方面有AVR单片机。采用单时钟概念,将机器周期从12个缩短至4到6个,这种器件如STC微控制器*。上述微控制器的进展为实现简单算法滤波器提供了技术保障。
微控制器进行数据采样时,电路存在相互干扰、电源噪声、电磁噪声,模拟输入信号会叠加干扰信号。所以,微控制器进行数据采集时应该尽量减少噪声信号对数据的影响,数据采集时的滤波称为数据采集滤波。目前数据采集滤波方法主要分为时域处理和频域处理,单片机简单滤波是在时域上进行处理的。微控制器实现的简单滤波算法有限幅滤波、中值滤波、算术平均滤波、加权平均滤波、滑动平均滤波,其原理如下:
(1)限幅滤波:该方法能有效克服系统偶然因素引起的脉冲干扰。它的基本原理是根据经验确定两次采样允许的最大偏差值,如果本次采样值与上次值的差小于等于偏差值,则本次采样值有效。如果本次采样值与上次值的差大于偏差值,选用上次值代替本次值。
(2)中值滤波:该方法适合参数变化缓慢的系统。其原理是连续N次采样值按照大小排序,一般N为奇数,取中间值作为本次采样值。完成此类算法,影响算法速度的是对N个值排序。要使滤波达到预期效果应尽量减少N的大小。
(3)算术平均滤波:选择长度N至关重要,过长灵敏度较高,反之,灵敏度低。它的原理是以N个采样值进行算术平均,以算术平均值作为当前采样值[9]。
(4)加权平均滤波:它的原理是对连续N次采样值分别乘上不同的加权系数之后再求加权平均,加权系数一般先小后大,即离当前采样值的时间越近则权越大,并以加权平均值作为当前采样值。
(5)滑动平均滤波:此方法适合周期性的干扰场合,对周期性干扰有较好的抑制作用。它的原理是连续采集N个采样值作为队列,将每次采样一个新值作为队尾,将队首舍去,并将平均值作为当前采样值[9]。
上述算法除限幅滤波较简单外,其它四种滤波方式都有共同特点,即算法占用存储器较多,相对限幅滤波算法复杂,它们占有的存储资源和时间资源与采样次数N成正比。如采用中值滤波时,长度过大,在排序时占有的时间资源就多。为克服缺点,一方面以连续N次采样值作为队列,当前采样值作为队尾并舍去队首,然后根据不同算法得到当前值。另一方面N值不必过大,中值滤波和加权滤波长度为3,算术平均滤波和滑动平均滤波的长度为4。
2 系统设计
2.1 硬件设计
硬件设计时主要考虑因素有微控制器选择、滤波算法选择实现、滤波类型显示方式及D/A转换。
(1)微控制器的选择。简单滤波器系统以STC12C5A16S2微控制器为核心器件,主要原因在于它是单时钟/机器周期(1T)器件,指令代码兼容传统8051,且速度则快8~12倍。器件自带10位精度ADC,转换速率达250KPS*,器件组成的系统可以直接对模拟信号进行采样,可以减少硬件的复杂性。这种微控器工作频率最高可达35MHz,相当于普通微控器的420MHz,设计时系统的外部时钟可采用32.768MHz晶振。
(2)滤波算法选择。设计轻触按钮接P3.0实现外部中断,以供微处理器选择实现滤波算法。其中接P3.0口的按键可以实现外部中断,其优先级别最高,可在中断服务中设置算法标志参数。它用于选择滤波算法的类型有着独特的优势。
(3)滤波算法显示。为了让操作者系统执行的滤波具体算法,可用LCD1602实时显示滤波器类型。其中,P0口可用于LCD1602写数据、指令,程序仅对LCD1602进行写操作,P0口无需上拉电阻。P4.7-P4.5接 LCD1602的控制端口,其中,P4.7用于写数据或写指令控制。P4.6用于写控制,因此写程序时P4.6口为低电平。P4.5接LCD1602的片选信号端口,其作用是下降沿触发时用于锁存数据。
(4)D/A转换。将滤波后的数字信号进行DAC转换,并用示波器观察输出的波形确定算法的效果。硬件系统的DAC可用美信公司的串行D/A转换器件MAX538,它与微控制器的接口简单,且单一5伏供源,内置12位串行缓冲器,输出为电压大小。根据它的工作时序,它的时钟频率上限为14 MHz,数据更新速率达877kHz[14]。因此,系统采用MAX538能满足硬件要求。
综合上述设计要点,设计的硬件系统如图1所示。
2.2 软件设计
软件算法流程有着至关重要的作用,系统代码采用C语言在Keil uVsion2.0集成环境中进行,为了有序地完成代码,根据图1的硬件设计了系统的算法流程如图2所示。将系统程序分为前台部分和后台部分,其中前台主要指是在主程序(main)中运行。在主程序主要完成A/D转换初始化、系统初始化、LCD初始化。这三大模块上电后前台运行,其作用是完成各种初始化,完毕则等待中断产生。
图1 滤波器硬件
图2 滤波算法流程图
A/D转换初始化主要完成以下工作:
(1)写寄存器 P1M1、P1M0将 P1.7口设置为高阻态,仅为输入。
(2)P1ASF寄存器将 P1.7口置‘1’,设置为模拟功能,注意P1ASF的地址为0x9d不能用位寻址,因此写成以P1ASF|=0x80。
(3)设置A/D转换控制寄存器ADC_CONTR。即,打开A/D转换电源;选择A/D转换速度,转换时间设置为90个机器周期完成一次;选择转换通道。同样该寄存器不能用位寻址,设置时代码为ADC_CONTR=0xe7。
系统初始化主要功能为:
(1)通过写寄存器 P4SW、P4M1、P4M0 将P4.7、P4.6、P4.5置为通用IO准双向口。
(2)设置AUXR寄存器,T0不进行12分频以加快滤波节拍。
(3)设置定时器T0初始值,并开外部中断0和定时计数器0中断,但不启动定时器T0,待LCD初始化完成后启动定时计数器T0工作。
(4)初始滤波类型标志变量,并调用LCD1602子程序显示滤波模式。
LCD初始化主要完成LCD1602的初始化工作,包括显示模式、光标模式等。三个初始化子程序是有先后顺序的,调用顺序为先LCD初始化,然后A/D转换初始化,最后系统初始化。
软件的系统中断服务为后台运行,主程序初始化完成用while(1)等待中断产生。如果有外部中断时,运行中断服务程序,根据滤波类型标志变量值选择滤波类型。如果没有外部中断,系统一直等待定时计数器T0溢出,因此数字滤波器处理一次的时间长度是由TL0、TH0、A/D转换时间、滤波子程序运行时间和D/A转换时间决定的,称这个时间为一拍。在定时计数器T0的中断服务程序中,先关闭T0中断,然后用分支转向根据滤波类型标志变量值调用滤波子程序,再调DA转换子程序,最后开T0中断。其中,A/D转换子程序查询标志位完成,并放在滤波子程序中调用。软件设计注意以下事项:
(1)中断服务程序不能过长,尽量简单。软、硬件调试发现,在中断服务程序中过多调用子程序,尤其是子程序嵌套调用容易出问题。
(2)尽量缩短一拍的时间,如,T0设置为1T,A/D转换速度设为最快,滤波子程序尽量简单。
(3)滤波算法问题,所有A/D转换的数据暂存采用全局变量,因此为了减少存储空间,用一个数组来存取采样数据,并用队列的形式存储。
(4)A/D采样用查询方式,也是这种处理方式的缺点,这样增加了一拍的时间,采用中断方式可以节约时间,但是程序运行的可控性不好。
(5)写代码时注意寄存器是否能用位寻址,如P1M1、P1M0、P1ASF、P4M1、P4M0、P4SW、ADC_CONTR、AUXR。此类特殊寄存器必须先定义不用位寻址方式进行赋值。
3 系统实验
3.1 实验方案
系统实验装置是由信号源、滤波系统和示波器三大部分组成,具体实验装置的实物如图3所示。为完成实验,设计并制作了信号源,其原理是采用微控制器和DAC器件直接合成信号。信号源是图3中的左边箭头所指电路板实物,右边箭头为微控制器滤波系统实物。信号源主要采用STC12C5410AD微控制器和 TLC5615D/A转换器,其作用是产生所需信号。测试时,将信号接入滤波系统,然后测试滤波效果。
图3 系统实验装置
信号源的波形数据先用matlab7.1软件计算出,在仿真波形符合要求的情况下,得到测试波形数据,再写入程序的数据表格。信号经过滤波能达到两方面的效果,一方面能滤除不需要的频率成分,另一方面能使信号到达平滑的效果。所以,实验方案按照以下两种情形完成。
(1)信号源产生正弦、锯齿波、方波、三角波。由于信号是查表输出的,信号的平滑性能不好,可将信号接入滤波系统,用示波器观察滤波输出,观察滤波系统输出的效果。
(2)信号源输出具有周期脉冲噪声的信号,滤波系统对这种信号进行采样、滤波输出,比较并观察其滤波效果。
为了具体说明第二种具有噪声信号的产生方式及效果,采用matlab7.1软件产生带有噪声的信号,将修改好信号数据的文件下载至微控制器中。信号源上电后,用示波器观察得如图4所示的四种波形,即正弦、锯齿、方波和三角波。这四种信号都含有周期的脉冲噪声,在图4中用箭头所指的信号。这种情形下的实验,是为了验证滤波器能否滤除图中的周期突发脉冲。如果按照情形(1)实验,信号源的波形不含图4中的周期脉冲。
图4 带有噪声的信号
3.2 实验效果
实验时是将信号源的输出信号送入系统滤波并对比五种滤波的效果。按照情况(1)进行实验,以输出信号的平滑程度为判断标准。滑动滤波的效果最好,其次为中值滤波和加权滤波,效果较差的为限幅滤波。
由于实验的图片很多,仅将滑动滤波得到波形以图5列出。
图5 滑动平均滤波输出波形
为测试情形(2)的滤波效果,同样完成了四种波形的五种滤波方式,这里以正弦信号为例,五种算法得到的信号如图6所示。图中每种算法输出信号,上图是指滤波器输入信号,下图为滤波器输出信号。其中,从输出信号的平滑程度来看,从坏到好的排列顺序为:限幅、中值、加权平均、平滑平均、算术平均。
图6 带有噪声滤波输出图
4 结 论
在数据采样中用微控制器实现简单数字滤波算法具有系统简单、易于实现,对于直接合成信号的平滑程度而言,采用滑动平均滤波的效果最好。对于周期的突发脉冲噪声来说,采用算术平均输出的效果较好。采用限幅噪声滤波输出的效果不佳。加权平均滤波要获得较好的效果,当前采样值的权重应该最大。采用微控制器,尽管选用速度较快的器件,但是存在滤波信号不能大于500Hz,这也是微控制器固有的弱点,如要完成更高频率信号的滤波,可以考虑STM32M3系列器件完成。
*宏晶公司的STC12C5A60S2系列单片机器件手册
[1]王斌.基于Visual DSP++的无限脉冲响应数字滤波器(IIR)设计 [J].电子元器件应用,2012,14(3):36-37.
[2]谭家杰.利用零极点设计数字带陷滤波器 [J].计算机仿真,2011,28(7):379-381.
[3]邓婷.基于 Matlab和DSP数字滤波器的设计与实现[J].科学技术与工程,2011,11(19):4597-4601.
[4]俞兴明,周燕.基于DSP的在线FIR数字滤波器设计及实现 [J].国外电子测量技术,2010,29(5):52-55.
[5]张大为,姜静,刘迪.基于FPGA的IIR低通数字滤波器的设计 [J].船电技术,2012,32(2):24-26.
[6]谭家杰,黄三伟,邹常青.正则有符号系数FIR滤波器优化算法 [J].计算机应用,2011,31(6):1727-1729.
[7]李姮,田克纯.一种基于FPGA的分布式FIR数字滤波器设计 [J].电声技术,2012,36(10):29-32.
[8]孔阳,武杰,万娟,等.基于FPGA和MCU的低成本地震信号数字滤波器设计 [J].核电子学与探测技术,2012,32(1):54-58.
[9]海玉,陈军,钱献芬.一种单片机数据采集系统的数字滤波器设计 [J].信息技术,2012(9):175-177.
[10]陈寒青,纪艺娟,丁时栋,等.单片机的可控放大器程控滤波器设计 [J].单片机与嵌入式系统应用,2011(5):63-66.
[11]陈世夏,戚甫峰,丁国臣.基于AT89S52单片机的程控滤波器设计 [J].国外电子测量技术,2010,29(3):39-42.
[12]赵世强,周义健,刘霞.基于单片机控制的程控有源滤波器电路 [J].国外电子元器件,2008(4):42-44.
[13]魏武,苏波晓,潘彩梅.基于MAX262和单片机的程控滤波器设计 [J].电子元器件应用,2010,12(1):39-44.
[14]胡卫华,王冬,谢起成,等.串行D_A转换器MAX538接口技术及应用 [J].工业仪表与自动化装置,2002(3):46-48.