当前位置: 首页 > >

DSP技术及应用课程设计报告

DSP 技术及应用课程设计报告

学院: 学院:通信与信息工程学院 专业: 专业: 电子信息工程专业 班级: 班级: 姓名: 姓名: 电信****班 电信****班 **** 艾依河里的鱼

时间: 时间: 2012 年 1 月 1 日

一、设计任务及要求
设计任务:本课程设计要求应用 DES5402PP-U 实验板实现 FIR 滤波器,能够 在 CCS 集成开发环境中使用图形显示工具显示输入和输出波形。 设计要求:利用 DES5402PP 评估板的模拟信号输出通道产生一个 1kHz 的方 波,然后将产生的方波信号通过模拟信号输入通道输入 DES5402PP-U 实验板,对 方波进行低通滤波,得到一个 1kHz 的正弦信号。

二、设计原理
本设计中我们使用一个 38 阶的对称结构的 FIR 低通滤波器,其采样频率 Fs 为 25KHz,通带截止频率 1.2KHz,阻带截止频率为 2.8KHz,阻带衰减为 40DB。 我们可以应用 MATLAB 中的设计 FIR 滤波器的指令 fir(), 也可以应用 MATLAB 的工具 FDATOOL 来进行设计,然后将所设计的滤波器的系数导入 DSP 程序中。下 面对 FDATOOL 进行简单的介绍: FDATOOL(The Filter Design and Analysis Tool)是一个设计分析滤波器的 工具,它具有很好的用户界面。借助它可以快速的设计数字 IIR 或 FIR 滤波器。 你可以设置滤波器的性能指标, 也可以直接配置滤波器的系数, 还可以从 MATLAB 工作空间导入滤波器。在 FDATOOL 界面下,你可以方便的看到设计的滤波器的幅 频特性、相频特性、零极点分布、单位脉冲响应、阶跃响应、滤波器系数、群时 延等。 要使用 FDATOOL,只要在 MATLAB 命令窗口中键入,按回车即可。FDATOOL 有两种模式:设计模式和输入模式。在设计模式中,你可以从零开始设计,或者 对已经设计的滤波器进行改进,或者分析滤波器。在输入模式中,你可以导入先 前已经设计好的滤波器或者已经存在于 MATLAB 工作空间的滤波器系数,你还可 以分析导入的滤波器。 本设计中我们主要使用 FDATOOL 的设计模式进行 FIR 滤波器的设计和对所设 计的滤波器进行分析,然后可以用 file 菜单下的 export 将滤波器的系数导入 MATLAB 的 Workspace 和将系数写入 DSP 汇编程序中。在写系数到汇编程序中, 要注意小数的表示方法。

三、程序代码

.title "fir5402.asm" .ref _c_int00 .mmregs ;寄存器地址设置 gpiocr .set 3ch gpiosr .set 3dh dxr10 drr10 spsa0 .set .set .set 23h 21h 38h

;5402 通用 I/O 控制寄存器 ;5402 通用 I/O 状态寄存器 ;串口 0 数据发送寄存器 ;串口 0 数据接收寄存器 ;串口 0 子地址寄存器
第1页

spcr10 spcr20 xcr10 pcr0 dxr11 spsa1 spcr11 spcr21 xcr11 pcr1 srgr1 srgr2 swcr

.set .set .set .set .set .set .set .set .set .set .set .set .set

39h 39h 39h 39h 43h 48h 49h 49h 49h 49h 49h 49h 2bh

;多通道串口 0 寄存器 1 ;多通道串口 0 寄存器 2 ;串口 0 发送控制寄存器 ;串口 0 引脚控制寄存器 ;串口 1 数据发送寄存器 ;串口 1 子地址寄存器 ;多通道串口 1 寄存器 1 ;多通道串口 1 寄存器 2 ;串口 1 发送控制寄存器 ;串口 1 引脚控制寄存器 ;采样率发生寄存器 1 ;采样率发生寄存器 2 ;软件等待状态寄存器

;定义变量 timer_count mcbsp_init wave_ptr is_new_data new_ad out_wave_ptr t_ar2 t_ar3 temp wave_buf out_wave_buf N fir_coef_buf fir_data

.set .set .set .set .set .set .set .set .set .set .set .set .set .set

060h 061h 062h 063h 064h 065h 066h 067h 068h 0900h 01000h 38 100h 200h

;定时器计数 ;mcbsp 初始化 ;新数据到达标志

; FIR taps ; FIR coef buffer ; FIR windows data buffer !

.text ;-------------------------------------------------------------------; interrupt vector table ! ;-------------------------------------------------------------------rs b _c_int00 nop nop nmi b __ret nop nop
第2页

sint17

sint18

sint19

sint20 sint21 sint22 sint23 sint24 sint25 sint26 sint27 sint28 sint29 sint30 int0

int1

int2

tint

brint0

b __ret nop nop b __ret nop nop b __ret nop nop b __ret .word 0,0 b __ret .word 0,0 .word 01000h .word 0,0,0 .word 0ff80h .word 0,0,0 .word 01000h .word 0,0,0 .word 0ff80h .word 0,0,0 .word 01000h .word 0,0,0 .word 0ff80h .word 0,0,0 .word 01000h .word 0,0,0 .word 0ff80h .word 0,0,0 .word 01000h .word 0,0,0 b __ret nop nop b __ret nop nop b __ret nop nop b timer nop nop b receive

;内部定时中断

;缓冲串口接收中断
第3页

bxint0

trint

txint

int3

hpint

q26 q27 q28 q29 q30 q31

nop nop b transmit nop nop b __ret nop nop b __ret nop nop b __ret nop nop b __ret nop nop .word 0ff80h .word 0,0,0 .word 01000h .word 0,0,0 .word 0ff80h .word 0,0,0 .word 01000h .word 0,0,0 .word 0ff80h .word 0,0,0 .word 01000h .word 0,0,0

;缓冲串口发送中断

;-------------------------------------------------------------------; 复位中断服务程序 ;-------------------------------------------------------------------_c_int00: stm #2020h,pmst ; vector table start: 0x2000,看 IPTR 中的值 ssbx intm ; close all int ! (ssbx intm) ssbx sxm ; extend sign ! ssbx frct ; faction multiply stm #10h,26h ; stop TIMER0 ! stm #10h,36h ; stop TIMER1 ! stm #0ffh,sp ; sp= 0x0ff ld #0,dp ; dp=0 stm #0ffffh,ifr ; clear all int ! 中断标志寄存器 stm #20h,imr ; bit5->BXINT0, bit4->BRINT0, enable BXINT0
第4页

stm stm

#02492h,swwsr #0,swcr

;中断屏蔽寄存器 ; all 2 waits !

;/*-----------------------------------------------------------------; 配置 DSP 的时钟 DES5402PP-U 板的上电默认配置没有将 DSP 的时钟设置到 100M,而只有 20M。下 面的程序将 PLL 改为×10,以便 DSP 以 100M 全速运行。PLL 的时钟工作方式寄 存器 CLKMD,地址为 0058H,见《DSP 技术及应用》教材 248 页。 ;------------------------------------------------------------------*/ stm #0,58h wait_pll: ldm 58h,a and #1,a bc wait_pll,aneq stm #97ffh,58h ; switch pll*10 -> 100M clk rpt #100 nop ;******************************************************************** ;初始化 RAM, Variable.... ;******************************************************************** stm #wave_buf,ar6 stm #1,ar0 rpt #24 mvpd wave_data,*ar6+0 ; move wave data to wave_buf -> 0x0900h stm #wave_buf,wave_ptr ; save wave buffer'ptr stm #out_wave_buf,out_wave_ptr ; save out wave buffer'ptr, because use ; circular address, so when save out_wave ; date,must ++ ! stm rpt mvpd data mem) stm stm #fir_coef_buf,ar6 #N-1 fir_coef,*ar6+ #fir_coef_buf,t_ar2 #fir_data,t_ar3

; move fir coef to fir_coef_buf(in ;

stm #0aa55h,mcbsp_init ; when mcbsp_init==0xaa55, transmit for init ac01 stm #5,timer_count ; init variable timer_count !
第5页

stm #0,is_new_data slave ac01 ! stm #1000h,ar0 stm #1800h,ar5 stm #400h,bk ld *ar0,t ld #0,b

; if is_new_data ==1 , has new AD data by

;************************************************************** ; The following codes are used to initalize McBSP0 ! ;*************************************************************** ;------------------------------------------------------------------stm stm stm stm stm stm stm stm stm stm stm stm stm stm edge ; of clkr stm stm rpt nop stm ldm stm stm #7h,spsa0 #8000h,39h #0ffffh #0,spsa0 #2000h,spcr10 #1,spsa0 #0c0h,spcr20 #2,spsa0 #40h,39h #3,spsa0 #0,39h #4,spsa0 #40h,xcr10 #5,spsa0 #0,39h #0eh,spsa0 #0dh,pcr0 ; ; ; ; ; spsa0 为串口 0 的子地址寄存器,choose SPCR10 receive sign_extend in DRR choose SPCR20 fs -> int ! choose RCR10

; choose RCR20 ; choose XCR10 ; choose XCR20 ; choose PCR0 ; fs is low active, rise edge of clkx, falling

#00h,dxr10 22h,a #1,38h #0c1h,39h

; start McBSP0 send !

ld #603h,a rsbx intm

; enable all int !

第6页

;-------------------------------------------------------------------; The following codes initalizeAC01, ALL AC01 setup same ! ;-------------------------------------------------------------------idle 1 idle 1 idle 1 idle 1 ; 软件复位两个 AC01 ld idle ld idle ld #600h,a 1 #3,a 1 #00105h,a

; wait for int ..... ; ; ; ; ; ; send #3 fs=10M/2/A/B= 25k flp=10M/2/40/A= 25k (all pass) fhp=fs/200= 125Hz (not use !) A=05,B=40(0x28) 送 05h 到 AC01 的数据寄存器 1

idle 1 ld #3,a idle 1 ; send #3 ld #00228h,a idle 1 ; 送 28h 到 AC01 的数据寄存器 2 ld #3,a idle 1 ; send #3 ld #00300h,a idle 1 ; 送 00h 到 AC01 的数据寄存器 3 ld #3,a idle 1 ; send #3 ld #00405h,a idle 1 ; 送 05h 到 AC01 的数据寄存器 4(AD & DA 0 dB) ld #3,a idle 1 ; send #3 ld #00505h,a idle 1 ;送 05h 到 AC01 的数据寄存器 5(highpass filter ;disable) ld #3,a idle 1 ; send #3 ld #00600h,a idle 1 ; 送 00h 到 AC01 的数据寄存器 6 ld #3,a idle 1 ; send #3 ld #00700h,a idle 1 ; 送 0 到 AC01 的数据寄存器 7 ld #3,a idle 1 ; send #3
第7页

ld #800h,a idle 1 ld #0h,a

; 送 0 到 AC01 的数据寄存器 8

stm #0,38h stm #2001h,39h ;开始 MCbsp0 接收! stm #30h,imr ; bit5->BXINT0, bit4->BRINT0, 使能 BXINT0 ;-------------------------------------------------------------------;*************************************************************** ; The following codes are used to initalize TIMER ! ;*************************************************************** ;-------------------------------------------------------------------stm #10h,tcr ; stop TIMER ! stm #0ffffh,prd ;装载 PRD, 周期寄存器 stm #0fh,tcr ; TIMER start, each about 100HZ .... orm #8,imr ; enable TIMER INT ! ;-------------------------------------------------------------------;*************************************************** ********* ; The following codes are main function ;**************************************************** ******** main: bitf is_new_data,#1 ; test is_new_data == 1 ? cc fir,tc ; = = 1, then call fir ! new AD data in new_ad(0x64) b main ;检测到新数据到达标志(变量 is_new_data)为 1 时,调 ;用 fir 滤波程序。 ;*************************************************** ********* ; The following codes are served for McBSP0' transmit ! ;**************************************************** ******** ;-------------------------------------------------------------------transmit: pshm st1 pshm st0 pshm bk pshm ar7 pshm ah pshm al cmpm mcbsp_init,#0aa55h
第8页

bc stm mvdm nop ld nop stlm

init,tc #25,bk #wave_ptr,ar7 *ar7+%,a a,dxr10

; each AC01 has 25 dots to D/A ! ; restore wave buffer ptr !

; send wave data ! Master AC01 make source wave ; Slave AC01 make filter result wave ! ; save wave buffer ptr !

bd wave_make_end mvmd ar7,#wave_ptr init:

stlm a,dxr10 bitf dxr10,#800h ; if setup last register of AC01, set mcbsp_init=0 ! bc wave_make_end,ntc ; not equal ,jump ! stm #0,mcbsp_init ; when mcbsp==0 or 1, transmit for make wave ! wave_make_end: popm al popm ah popm ar7 popm bk popm st0 popm st1 __ret: rete ;-------------------------------------------------------------------;******************************************************************** ; The following codes are serived for McBSP0' receive ! use AR5,BK! ;******************************************************************** ;-------------------------------------------------------------------receive: pshm st1 pshm st0 ld mvkd pshd popd stm #0,dp drr10,ar5 ; save AD data *ar5+% ; save AD data in AD_buffer(0x1800-0x1c00) new_ad #1,is_new_data ; has new AD data

popm st0 popm st1
第9页

rete --------------------------------------------------------------------;******************************************************************** ; The following codes are serived for vc5402' TIMER ! ;******************************************************************** ;-------------------------------------------------------------------timer: pshm ah pshm al ldm timer_count,a sub #1,a bc not_show_led,aneq bitf st1,#2000h bc show_led,tc ssbx xf b show_con show_led rsbx xf show_con ld #5,a not_show_led stlm a,timer_count popm al popm ah

; if a != 0 ,jump ! ; test XF ; set xf=1

; set xf=0 ;

rete ;-------------------------------------------------------------------;******************************************************************** ; The following codes is used to FIR( new AD DATA in new_ad(0x64) ; FIR buffer coff-> 0x100(ar2), FIR window buffer -> 0x200(ar3)) ;******************************************************************** fir: pshm st1 pshm st0 pshm bk pshm ar7 pshm ah pshm al pshm ar0 pshm ar2 pshm ar3 mvdm #t_ar2,ar2 ; restore ar2
第 10 页

mvdm #t_ar3,ar3 ; restore ar3 ld new_ad,-2,a ; new AD data -> a, remove two LSBs ;------------------------------------------------------------------stm #1,ar0 stm #N,bk stl a,*ar3+% rptz a,#(N-1) mac *ar2+0%,*ar3+0%,a mvmd mvmd stm stm mvdm sth ld stl stl mvmd stm ar3,#t_ar3 ar2,#t_ar2 #1,ar0 #100h,bk #out_wave_ptr,ar7 a,-2,temp temp,2,a a,*ar7+0% a,temp ar7,#out_wave_ptr #0,is_new_data

; set circular addressing size ; 0 - a, then repeat 34 times ; done FIR filter, result in ; save ar3 ; save ar2

ah

; ; ; ; ;

each AC01 has 25 dots to DA ! restore wave buffer ptr ! save FIR result in temp shift 2 bit for AC01 DA ! save FIR result to wave buffer !

; save wave buffer ptr ! ; new AD data has been processed !

ld #0,dp cmpm out_wave_ptr, 1000h bc con_fir,ntc ;-------------------------------------------------------------------

ccs_show: nop nop dots !

;此处加断点,查看结果 ; if out_wave_ptr == 0xc00, ; may show out_wave in CCS !!! show 128 ; input buffer -> 0x1800 ; output buffer -> 0x1000 (show from

0x1020) con_fir: popm popm popm popm popm popm popm

ar3 ar2 ar0 al ah ar7 bk
第 11 页

popm st0 popm st1 ret ;******************************************************************** ; The following data is used by make wave ! when using, must copy to ; wave buffer -> 0x6000 ;******************************************************************** wave_data: ; freq about 1k Hz .word 03ffch ; +2 volt .word 03ffch .word 03ffch .word 03ffch .word 03ffch .word 03ffch .word 03ffch .word 03ffch .word 03ffch .word 03ffch .word 03ffch .word 03ffch .word 03ffch .word 0c000h ; -2 volt .word 0c000h .word 0c000h .word 0c000h .word 0c000h .word 0c000h .word 0c000h .word 0c000h .word 0c000h .word 0c000h .word 0c000h .word 0c000h ;******************************************************************** ; 滤波器的系数 Filter Type Lowpass ; Filter Length N ; Sampling Frequency 25.00000000 ; Upper Band Edge 同学自行设计 ; Lower Band Edge 同学自行设计 (在将滤波器系数写入 DSP 程序时注意小数的表示方法! ) ;******************************************************************** fir_coef: .word -50 ;c037
第 12 页

.word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .word .end

101 150 203 216 153 -3 -239 -508 -729 -802 -634 -163 615 1638 2777 3861 4711 5178 5178 4711 3861 2777 1638 615 -163 -634 -802 -729 -508 -239 -3 153 216 203 150 101 -50

;c000

四、调试步骤
1.短接 JP9,使得 DES5402PP 的信号输出通道和输入通道相连。 2.启动 CCS,新建一个工程 fir5402.pjt。
第 13 页

3.在工程中添加文件 fir5402.asm 和 文件*.cmd,在标号 ccs_show 处添加 断点,编译连接,然后将 OUT 文件装入,按 Animate 按钮运行程序。这时会看到 断点处黄色箭头一直闪烁,状态栏有 go 字一直闪烁。 4.选择 View->graph->Time/Frequency 菜单打开一个图形显示窗口, 参见下 图。在“Start Address”项改为地址 0x1800,将“Display Size”项设置 128, 将“DSP Data Type”改为“16-bitsigned integer”。这样,将在图形显示窗 口中显示从 0x1800(信号输入缓冲)开始的 128 个点的 16 位有符号整数。再打 开一个图形窗口,显示从地址 0x1020(滤波信号输出缓冲)开始的 128 个点的 16 位有符号整数。

五、实验结果

第 14 页

六、实验心得

第 15 页




友情链接: hackchn文档网 营销文档网 爱linux网 爱行业网 时尚网