MAXQ7654在信号滤波中的应用_第1页
MAXQ7654在信号滤波中的应用_第2页
MAXQ7654在信号滤波中的应用_第3页
MAXQ7654在信号滤波中的应用_第4页
MAXQ7654在信号滤波中的应用_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MAXQ7654在信号滤波中的应用MAXQ7654在信号滤波中的应用基于高性能、16位RISCMAXQ20核,MAXQ7654提供16通道、12位模数转换器(ADC)和双通道、12位数模转换器(DAC)。除模拟电路外,MAXQ7654还具有完备的数字外设,包括:CAN控制器、SPI接口和4个8/16位定时器,可用作计数器或可编程脉宽调制器。MAXQ7654提供128kB的程序存储空间,能够胜任绝大多数嵌入式混合信号处理应用。

本文所描述的应用旨在展示MAXQ7654的混合信号特性。微控制器利用一个DAC产生带噪声的正弦波。DAC输出被接入一个ADC输入通道进行采样。得到的采样通过一个简易的有限激励响应(FIR)滤波器,以衰减信号中的高频分量,从而在第二个DAC产生连续,光滑的正弦波输出。

利用丰富的模拟和数字外设,在很多有意思的应用中都可施展MAXQ7654的能力。本文聚焦于MAXQ7

654的信号处理能力,主要展示其ADC、DAC和硬件乘加单元。采用IAR编译器和MAXQ7654评估板(EVkit),通过一个应用实例说明如何从一个充满噪声的正弦波中滤出一个干净的低频信号。

集成的模拟功能和外设使信号滤波成为可能

MAXQ7654集成了16通道、12位ADC,完成一次转换仅需16个时钟周期。时钟频率为8MHz(最大值)时,每秒可完成500,000次采样。测量单端模拟信号时可对多达16路信号进行采样,测量差分信号时可对多达8路输入信号进行采样。该ADC也可进行温度测量——MAXQ7654内含温度传感器,可读取芯片(管芯)温度。

MAXQ7654包括一个硬件乘加单元,用于信号处理。它能在一个周期中进行两个16位乘法,并且还有一个可选的累加器功能,可工作于带符号或无符号模式。这样一来简化了FIR和IIR滤波器的实现;每个滤波因数只需3个机器周期的处理,其中还包括了调用滤波器的开销。

JTAG调试引擎是MAXQ平台公用的,当应用程序在目标硬件上运行时,利用它可完成寄存器和存储器的读、写操作。采用JTAG后还省掉了昂贵的仿真器。主要的C编译器提供商,如Rowley、IAR和Python均支持MAXQ7654及其调试功能。

MAXQ平台的一个新增外设是控制器局域网(CAN)2.0B接口,它是常用于工业和汽车应用的通信协议。MAXQ7654的CAN控制器支持15个消息中心,比特率高达1Mbps。当受到或发出消息后以中断形式通知系统。

SPI.接口支持从机或主机模式,可进行8位或16位数据传输。SPI常见于小型芯片当中,如可编程充电器、数字电位器、DAC、ADC和存储芯片。

MAXQ7654有4个多功能定时器。这些定时器采用8位或16位计数方式,支持周期性中断、脉宽调制、捕获及比较功能的自动重装载。

滤波应用的软件架构

定时器产生中断时第一个DAC输出带噪声的正弦波,以确保输出采样具有固定的间隔。设计用于生成正弦波的代码涉及到复杂的浮点计算,实现起来运算量很大。考虑到正弦波数据是周期性重复出现的。重新计

算那些不会随时间改变的正弦波数据会造成资源浪费。因此,在应用程序一开始就预先算出一组正弦波数据。

在正弦波数据初始化之后,定时器产生周期性中断。定时器中断程序代码中的一个伪随机数产生器用来产生噪声,噪声被直接叠加到干净的正弦波数据中。结果被传给DAC产生输出信号。为了保持演示程序代码的简洁,在用于产生输出正弦波的定时中断中同时对模拟输入信号进行采样。当读取输入采样后,采样信号通过简易的FIR滤波软件处理,为使效率最大化,该滤波软件用汇编语言来实现。滤波后的采样信号随后从第2个DAC输出。用示波器来比较两个DAC的输出,可以发现:一条正弦曲波较为粗糙,带有噪声,而另一条正弦波则看上去比较干净,由于FIR滤波器的长度,带有轻微的相位延迟。

噪声正弦波的生成和采样

定时器中断程序代码如下,程序开始时已预先计算好正弦波数据,本段代码将其转换为噪声正弦波数据。

sample=static_sin_data[sinindex++]

;

sinnoise=((sinnoise^0x5C)*31)+0xabcd;

thisnoise=sinnoise;

if(thisnoise&0x01)

{

thisnoise=thisnoise&0x1ff;

}

else

{

thisnoise=

-1*(thisnoise&0x1ff)

;

}

sample+=thisnoise;

if(sample<0)

sample=sample*-1;

if(sample>4095)

sample=8192-sample;

DACI1=sample;//SendvaluetoDAC#1

if(sinindex>=SIN_WAVE_STEPS)sinindex=0;

sinnoise变量用来存储伪随机噪声(可能是正的或负的)。噪声被叠加给干净的正弦波数据后,所产生的噪声正弦波数据被直接赋给DACI1寄存器,以进行数模转换。

从ADC读取采样数据的过程几乎同样简单。设置完ADC的采样输入引脚后,软件可通过檠疊USY位或者使能中断来获知转换已经结束。本实例代码使用了查询方式。

inputsample=ADC_Convert_Poll(AIN0|START_CONV|CONTINUOUS)

;

..

.

unsignedintADC_Convert_Poll(unsignedintControl_Reg)

{

ACNT=Control_Reg;//SettheADCparameters

while(ACNT_bit.ADCBY==1);//WaittillADCisnotbusy

returnADCD;//ReturntheADCresult}

注意,MAXQ7654中ADC的采样率是500ksps。在8MHz时钟下,只需等待16个时钟周期便可完成一次转换。

设计一个简单的数字滤波器

本应用所产生的波形中包含一个强低频信号和大量的高频噪声。用一个简单的低通滤波器可净化该信号。

一个通用的FIR滤波器可用下式描述:

Y=AnXn

其中An是滤波因数,Xn是以前的采样输入,Y是滤波器当前的输出。滤波因子决定滤波器的频率响应,即不同的频率成分是怎样被衰减或突出的。

可用一个Java小程序(与本文源代码一同发布)来基于极-零图生成滤波因数(图1)。该程序可生成一组高精度的浮点滤波因数。不过,由于MAXQ7654有16位硬件乘加器,因此需要将浮点因数转换成16位精度的定点因数。这一转换会给理想的滤波器变换引入误差。因此,该Java程序也给出了建立在定点因数之上的实际变换结果,并以图形方式给出了误差。注意:尽管该程序既支持极点(突出频率分量)也支持零点(衰减频率分量),但演示代码只使用零点。无限激励响应滤波器(包含极点和零点)可以由另外的软件来实现。在应用程序窗口底部的文本框中给出了生成的16位定点滤波因数以及其中的小数位数。

图1.图中给出了生成滤波器因数的Java程序输出。该程序可生成理想转换结果、实际转换结果、误差和16位滤波器因数。

高效数字滤波器的实现

本节讨论怎样在一个真正的数字滤波器里实现定点因数。为获得最佳性能,数字滤波器算法采用汇编语言编写。这使得应用设计人员可根据具体要求来优化滤波器程序。一两个额外的周期都可对应用的最大滤波器长度和采样率产生显著影响。

本演示程序所采取的两个关键措施使滤波器效率最大化。首先,该应用采用非滚动的滤

波器环。这会增加算法的代码长度,但会得到一个超快速滤波器,每个因数只需要3个周期和3个代码字。这种设计是切实可行的。采用Kaiser窗设计一个250因数的高质量滤波器所需代码总长度为750字。在一个代码空间为65,536字的机器上,如果看重的是滤波器性能,采用这种设计方案是很有效的。

第2个有助于改进滤波器效率的关键点是,将RAM中的256个字做为存储先前输入数据的环形缓冲器(通用滤波器方程中的Xn项)。如果滤波器有250个因数,则无论如何必须储存250个先前的输入值,这样一来RAM中的256个字并没有被浪费。这样设计的好处在于MAXQ的基址-偏址指针可被用来生成硬件环形缓冲器。由于指针会自动在缓冲器边界滚动,因此滤波器软件不需要检查指针是否已达数据缓冲器的起始位置。以下是数字滤波器代码:filtersample:

pushDP[1]

pushDPC

moveAP,#0

sub#2048

moveDPC,#10h

moveBP,#W:sampletable;preserveIAR'ssoftwarestack

;probablyneedsthispreserved

;selectaccumulator0

;normalizetheinputsample

;DP[0]bytemode,BPwordmode

;startofthesampletablemoveDP[0],#B:sampleindex;pointtosamplecurrentindex

moveAP,#1

moveACC,@DP[0]

moveOffs,ACC

add#1

move@DP[0],ACC

move@BP[Offs],A[0]

moveMCNT,#22hfilterloop:;;Unrollthefilterloopforspeed.;selectaccumulator1

;getcurrenttableindex

;putitintheoffsetregister

;incrementthecurrentindex

;restorethetablepointer

;storethecurrentsample

;signed,accum,clearregsfirst;

moveMA,#0x16

moveMB,@BP[Offs--]

moveMA,#0x48

moveMB,@BP[Offs--]

...

moveMA,#0x7

moveMB,@BP[Offs--]

moveMA,#0x2

moveMB,@BP[Offs--]

nop

moveA[2],MC2;getMACresultHIGH

moveA[1],MC1;getMACresultMID

moveA[0],MC0;getMACresultLOW代码中首先对输入采样标准化。由于MAXQ7654有12位ADC,因此输入值从0到4095。为了使用数字滤波器,输入值应被标准化为-2048至+2047,也就是减去2048(2048=211)。一旦输入采样的指针初始化完成,并且当前输入采样被储存,程序代码即开始执行滤波操作。

MAXQ中的硬件乘加器单元使用起来十分方便。滤波器因数和输入采样载入乘法器寄存器,一个时钟周期之后便可获得相乘的结果。通过BP[OFF]指针可读取输入采样,滤波器因数采用硬件编码,从图1所示的输出窗口直接获得(重现如下):

首行中的"14"表明滤波器中的数字其小数点之后有14位,滤波完成后结果必须右移14位。"27"表明滤波器有27个因数。在这些控制参数之后,列出了滤波器系数,从A0开始(0x16,0x48,0xad,..)。

滤波器算法执行完之后,累加结果即出现在乘加寄存器MC0、MC1、MC2中。必须对该结果进行移位以补偿定点基数。

如果想改变应用中所使用的滤波器,只需改变滤波器循环标号下面的代码即可。对于各个由Java程序生成的因数,可以增加以下一对指令:

moveMA,#COEFFICIENT_n

moveMB,@BP[Offs--]

同时,如有必要,还注意应改变移位数。

结果

这个简易的滤波器工作得很理想。图2给出了用示波器捕获的两个MAXQ7654DAC的波形。可以观察到由于FIR滤波器的长度,在干净的输出信号中存在相移。

图2.下面的波形是MAXQ7654中DAC输出的带噪声信号。它被采样、滤波并输出后显示为上面的波形。

评估板

MAXQ7654评估板的原理图随源代码一同发布。该评估板有很

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论