应用DES5402PPU实验箱实现FIR滤波器Word下载.docx
《应用DES5402PPU实验箱实现FIR滤波器Word下载.docx》由会员分享,可在线阅读,更多相关《应用DES5402PPU实验箱实现FIR滤波器Word下载.docx(28页珍藏版)》请在冰豆网上搜索。
![应用DES5402PPU实验箱实现FIR滤波器Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/16/459082cb-a65a-42ab-8fa8-f0ebdd46b10a/459082cb-a65a-42ab-8fa8-f0ebdd46b10a1.gif)
片内存储器
16K
需要状态位设置才有效
0x8000-0xffff
外部EPROM
32K
JP5短接
0x18000-0x1ffff
外部SRAM
0x28000-0x2ffff
‘VC5402数据空间
0x0-0x5f
存储器映射寄存器
系统保留
JP5,JP4和IO空间的D1比特位共同确定
‘VC5402的I/O空间分配
0x8000
IO控制字
D0:
直流电机电源控制。
D1:
哪块存储器EPROM还时SRAM占用数据空间0x8000。
D2:
DSP向MCU发中断。
D3、D4:
通用外部扩展总线的数字IO。
0x9000
MCU与DSP并行通信口
0x0a000
PC机RS-232串口控制地址
8个控制寄存器
0x0b000
MCU与DSP串行通讯口
0x0c000
交通灯(LED)控制口
16个比特位对应16个LED
0x0d000
通用扩展总线
0x0e000
直流电机控制口
D0比特有效
0x0f000
步进电机控制口
D0,D1,D2,D3有效
2.FIR滤波器的基本原理和结构
数字滤波器是将输入的信号序列,按规定的算法进行处理,从而得到所期望的输出序列。
一个线性位移不变的输出序列y[n]和输入序列x[n]之间的关系,应满足常系数线性差分方程:
y[n]=
n≥0
X[n]为输入序列,y[n]为输出序列,
为滤波器系数,N为滤波器的阶数。
若所有的
均为0,则得到FIR滤波器的差分方程为:
对上式进行Z变换,整理后得到FIR滤波器的传递函数为:
H(z)=
=
图:
直接型FIR滤波器的结构图
由上面的公式可知道,FIR滤波算法实际上是一种乘法累加运算,它不断的从输入端读入样本值,经延时后做乘法累加,输出滤波结果。
FIR滤波器的设计方法主要有窗函数法和频率采样法。
本设计中用的是窗函数法设计。
时域
[n]应是一个关于远点n=0对称的无限长序列,截断后的h[n]还应进行右移以形成一个因果的FIR滤波器,即在n<
0时,h[n]=0。
为了保证h[n]的线性相位,还应使h[n]关于中心点对称或反对称。
3.IR滤波器的的DSP实现
FIR滤波器的输出表达式为
不断地对输入样本进行n-1延时后,再进行乘法累加。
C54x通过两种方法实现FIR滤波器的延迟线:
(1)线性缓冲区法(又称延迟线法)
实现N阶FIR滤波器,需要在数据存储器中开辟一个N单元的缓冲区(滑窗),用来存放最新的N个输入样本。
DSP每计算一个输出值,都需要读取N个样本并进行N次乘法和累加;
每当读取一个样本后,将此样本向后移动,读完最后一个样本后,最老的样本被推出缓冲区,输入最新样本存入缓冲区的顶部。
优点:
线性缓冲区法具有存储器中新老数据位置直观明了
图:
N=8的线性缓冲区
顶部为低地址单元,存放最新样本,底部为高地址单元,存放最老样本;
AR1被用作间接寻址的数据缓冲区的辅助寄存器,指向最老样本单元。
AR2被用作间接寻址的系数区的辅助寄存器。
(2)循环缓冲区法
实现N阶FIR滤波器时,需要在数据存储器中开辟一个称为滑窗为N个单元的缓冲区,用来存放最新的N个输入样本。
每当输入新的样本时,以新样本改写滑窗中最老的数据,而滑窗的其他数据不需要移动。
不用移动数据,不需要在一个机器周期中要求进行一次读和一次写的数据存储器,因此,可将循环缓冲区定位在数据存储器的任何位置,而不像线性缓冲区要求定位在DARAM中那样。
缺点:
在循环缓冲区新老数据不很直接明了。
N=8的循环缓冲区
8级循环缓冲区的结构,顶部为低地址单元,底部为高地址单元;
指针ARx指向最新样本单元。
4.模拟信号接口电路(TLC320AC01)的使用
TLC320AC01也是TI公司生产的一款集成有A/D和D/A的芯片,通过串口与DSP或其他设备通信。
AC01的最高采样频率为25kHz,其数据精度为16位,采用单一5V电源供电。
C5402与AC01连接后,可以只使用一个缓冲通道串口来同时实现数据的采集和输出,从而节省了DSP的硬件开销。
因此,DSP与AC01的连接使用在信号处理中得到了广泛的应用。
实验系统DES5402PP使用AC01作为模拟信号接口,有两个AC01,分别工作于“主”、“从”模式。
利用“主AC01”产生方波信号,“从AC01”将该信号转换成滤波的数据信号并输入到DSP芯片。
AC01提供一个14bit的D/A和一个14bit的A/D通道。
AC01与VC5402通过串口0连接。
其中,DSP还可以通过读写AC01的寄存器,控制AC01的采样频率、增益、低通、高通滤波器的截止频率等参数。
VC5402与AC01的连接图
R0
一般为0
R3
相移控制
R6
控制操作模式
R1
采样频率
R4
模拟输入输出的增益控制
R7
控制从模式的串行通信
R2
低通滤波器的截止频率
R5
使能高通滤波器
R8
控制生成的帧同步脉冲数
表:
TLC320AC01的数据存储器功能
5.1KHz方波信号的产生
先在C5402的数据存储空间写入25个数据(13个03ffch,代表方波的高电平;
12个0c000h,代表方波的低电平),然后通过缓冲串口将数据发送到“主AC01”,利用“主AC01”的D/A通道产生一个1KHz的方波作为滤波器的输入信号。
由于串口发送中断将每0.04ms产生一次,所以将一个周期的方波信号分25次送出,这样经D/A变化后可得到1KHz的方波。
6.信号的输入输出
“主AC01”的D/A通道产生一个1KHz的方波从DES5402PP的信号输出通道输出,同时由于DES5402PP的信号输出通道与输入通道相连,即“主AC01”的输出作为“从AC01”的输入,“从AC01”的DOUT端口与DSP芯片的DR端相连。
7.串口初始化及中断服务程序
TMS320VC5402有两个McBSP。
本设计通过DSP的串口0传输数据:
产生缓冲串口发送中断时,中断服务程序进行数据发送,产生方波信号和完成对AC01的初始化;
产生缓冲串口接收中断时,中断服务程序进行数据接收,存储输入的数据,并设置新数据到达标志,调用FIR滤波程序,完成对输入数据的处理。
另外,在串口通讯中,因为数据时钟和帧同步信号都由AC01产生,所以C5402将使用外部时钟和帧同步信号。
8.定时器初始化及定时中断服务程序
使用定时器交替使“XF”输出高电平和低电平。
初始化时设定TDDR和PRD的值,为了获得更长的时间在中断程序中使用一个计数器(timer_count)。
则定时时间T=CLKOUT×
(TDDR+1)×
(PRD+1)×
timer_count,CLKOUT=100MHz
四.设计步骤与调试
1.CCS驱动程序的安装
目前,我们使用的DSP开发环境为TI公司的CCS(CodeComposerStudio)。
CCS软件在XDS510仿真器调试器的配合下工作,所以必须安装正确的硬件驱动程序,并配置仿真器,以便正常工作。
在CCS安装完成后,请参考下面的步骤,安装并配置驱动程序:
(1)当成功安装CCS后,再运行配套光盘中driver目录下的setupcc54x.exe,安装驱动程序。
在选择安装目录时请选择与CCS相同的目录。
安装成功后,在桌面上应该看到SDConfig的配置工具。
(2)使用并口电缆将DES5402PP-U与PC机连接好,并接通板上电源,这时二极管D2应该被点亮。
(3)启动SDConfig这个工具,配置使用的并口。
如图2-1所示:
图安装CCS驱动程序
(4)你可以使用Configuration下的PortsAvailable->
Printer选项测试你的PC机使用的并口类型。
建议将PC的并口设置为:
IO=0x378,EPP(EPP1.7或EPP1.9)!
(5)用鼠标左键单击左边的378选项(如果PC并口使用378端口),然后选择Emu。
在右边窗口选择硬件类型为XDS510PP,并选择合适的并口类型(EmulatorPort项):
如EPP。
在上图实例中,PC机并口使用标准并口,所以选择SPP8。
(6)选择菜单栏中的Emulator项下的Test,测试端口设置是否正确。
若正确,SDCconfig应该检测到1个JTAG设备。
如上图所示。
若没有成功,应该检测设置端口是否与PC的并口一致。
(7)保存设置后退出SDConfig工具。
启动CCS的setup程序,安装CCS的驱动程序。
先使用InstallaDeviceDriver将sdgo5xx驱动程序添加近来,然后将该驱动程序添加到系统中。
注意,驱动程序使用的IO地址为0x378!
图运行CCS的配置程序
(8)修改c5402.gel,以便CCS能访问DES5402PP-U的外部扩展程序和数据存储器。
你可以单独修改该GEL文件,也可以在进入CCS后,再选择“GELfiles”选项,并双击c5402.gel。
这时,你可以修改它的内容。
主要修改两个部分:
在Startup()函数中增加一个函数调用,以便在CCS启动时自动执行,参见下面:
/*TheStartup()functionisexecutedwhentheGELfileisloaded.*/
StartUp()
{
C5402_Init();
/*新增加部分*/
GEL_TextOut("
GelStartUpComplet