DSP课程设计--多波形信号发生器_第1页
DSP课程设计--多波形信号发生器_第2页
DSP课程设计--多波形信号发生器_第3页
DSP课程设计--多波形信号发生器_第4页
DSP课程设计--多波形信号发生器_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、dsp课程设计报告 多波形信号发生器 目 录一、实验目的3二、实验内容3三、实验原理31.产生连续的波形的方法31.1 查表法:31.2计算法:32. tlv320aic23b的内部结构及工作原理4四、程序设计5五、程序调试111、编译过程112、.cmd程序(5502.cmd)全文及其解释:113、程序运行结果(图形和数据显示):13六、硬件输出演示:16七、实验感想与体会18八、参考文献18一、实验目的1.学习并掌握d/a转换器的初始化设置及其应用2.学习并掌握使用dsp产生正弦波的原理和算法,进而掌握任意信号波形(如三角波、锯齿波、矩形波等信号)产生的原理和算法。3.比较产生信号的两种主

2、要方法(查表法和计算法)的优缺点。4.熟练使用软件ccs3.3对程序的完整调试过程。二、实验内容使用dsp产生30016000hz的正弦、方波、锯齿波和三角波信号,输出信号的幅度从01vrms(有效值)。要求使用计算法,并且频率可变、幅度可变。 本实验要求用软件ccs3.3编程实现,并与硬件连接进行功能演示。三、实验原理1.产生连续的波形的方法1.1 查表法:把事先将需要输出的数据计算好,存储在dsp中,然后依次输出就可以了。查表法的优点是速度快,可以产生频率较高的波形,而且不占用dsp的计算时间;查表法的缺点在于需要占用dsp的内部的存储空间,尤其对采样频率比较大的输出波形,这样,需要占用的

3、内部的空间将更大,而dsp内部的存储空间毕竟有所限制。这使得查表法的应用场合十分有限。 1.2计算法:采用计算的方法依次计算数据而后输出,然后再计算而后输出。计算法的优缺点正好和查表法相反。即:其优点是不占用dsp的存储空间,其缺点是占用dsp的计算时间,使得执行程序的开销变大。本实验将用第二种方法即计算法产生一个正弦波信号,从da输出。由余弦信号的递推公式: 得知:如果需要产生连续的余弦信号,必须知道首先两个余弦值的大小,然后就可以利用上式计算出后面的数据,这就是下面编程依据的核心算法。 正弦函数和余弦函数的泰勒级数数学表达式为:,.如果要计算一个角度的正弦和余弦值,可以取其前五项进行近似计

4、算。也可以用递推公式求正弦和余弦值:利用递推公式计算正弦和余弦值需已知cos(x)、sin(n-1)x、sin(n-2)x和cos(n-2)x的值。用这种方法,求少数点可以,如产生连续正弦、余弦波,则累积误差太大,不可取。最终产生信号的频率为f0=fs/n,其中n为抽样点数。2. tlv320aic23b的内部结构及工作原理tlv320aic23b是ti公司生产的高性能语音codec芯片,16、20、24、32位串行a/d、d/a转换电路。采样速率:可通过dsp编程来设置,范围8khz96khz。 内含抗混叠滤波器和重构滤波器。/aic23波特率设置,clkin=clkout=mclk,采样率

5、32khz,时钟模式为普通模式, uint16 sample_rate_control2 = codec_src_rev, src_clkin(0)+src_clkout(0)+src_sr(6) +src_bosr(0)+src_usb(0) ; 在aic23中设置如下:/ aic23的波特率设置,采样率为32k,clkin=clkout=mclk/ 时钟模式设为普通模式,基过采样率为250fs/96k 7/48k 0/32k 6/8k 3uint16 sample_rate_control2 = codec_src_rev, src_clkin(0)+src_clkout(0)+src_s

6、r(6)+src_bosr(0)+src_usb(0);本报告中所有程序的采样频率波特率均为32000hz四、程序设计 我们的设计围绕要求展开,需要实现的基本功能为:1. 产生正弦、方波、三角波、锯齿波四种波形2. 波形幅度、频率可借助gel的slider调整通过对gel的学习,我们发现其slider也可以实现选择波形,于是整个演示过程就不需要切换程序了。主程序设计思路如下图:代码:#include <math.h>#include <stdio.h>#include <csl.h>#include <csl_chip.h>#include &l

7、t;csl_i2c.h>#include <csl_pll.h>#include <csl_mcbsp.h>#include <csl_emif.h>#include <csl_emifbhal.h>#include <stdio.h>/#include "e2prom_function.h"#include "codec.h" #define nx 360 /每周期抽取点数#pragma data_section(output1,"data_out1"); /存放si

8、n数据,浮点型float output1nx; #pragma data_section(output2,"data_out2"); /存放sin数据,浮点型float output2nx; #pragma data_section(output3,"data_out3"); /存放sin数据,浮点型float output3nx; #pragma data_section(output4,"data_out4"); /存放sin数据,浮点型float output4nx; #pragma data_section(output,&q

9、uot;data_out"); /存放sin数据,定点型int outputnx,gain=1,gainnew=0,frq=300,wave=1; #undef codec_addr#define codec_addr 0x1a / 定义mcbsp的句柄mcbsp_handle hmcbsp; /*-*/ function: main/*-*/ void main(void) uint16 i=0,k=0; float input0=0,x1; float a,b,c,d,e,f,g,h,ii,step;/step为角度步长 step=360.0/nx; / nx为360度内取样点数

10、 /*新增函数段*/ for(i=0;i<=nx-1;i+) float angle,xx; angle=input0+step*i; x1=3.1415926*angle/180; xx=x1*x1; a=1-xx/16/17;b=1-xx/14/15*a;c=1-xx/12/13*b;d=1-xx/10/11*c;e=1-xx/8/9*d;f=1-xx/6/7*e;g=1-xx/4/5*f;h=1-xx/2/3*g;ii=x1*h; / g=x1*(1-xx/2/3*(1-xx/4/5*(1-xx/6/7*(1-xx/8/9*(1-xx/10/11*(1-xx/12/13*(1-xx

11、/14/15*(1-xx/16/17);/数学总公式 / fprintf(stdout,"compute%f",ii); fprintf(stdout,"n "); /输出计算的正弦波的数值,x2=e output1i= 32767*ii; /利用泰勒级数计算出正弦波的数值,存放到output1中 / outputi=gain*output1i/1024; / 正弦波 output20=0; for(i=0;i<=(nx-1)/2;i+)output2i+1=output2i+2;for(i=(nx+1)/2;i<=(nx-1);i+)out

12、put2i+1=output2i-2; / 三角波 for(i=0;i<=(nx-1)/2;i+)output3i=500;for(i=(nx+1)/2;i<=(nx-1);i+)output3i=0; / 方波output40=0; for(i=0;i<=(nx-1);i+)output4i+1=output4i+2;/ initialize csl library - this is required ! csl_init(); / the main frequency of system is 240mhz/ 该频率是为了设置iic模块的需要设置的,为了使用i2c_se

13、tup函数 pll_setfreq(1, 0xc, 0, 1, 3, 3, 0); /emif初始化 emif_config(); / open mcbsp port 1 and get a mcbsp type handlehmcbsp = mcbsp_open(mcbsp_port1,mcbsp_open_reset);/ config mcbspport 1 by use previously defined structuremcbsp_config(hmcbsp);/i2c初始化i2c_cofig(); /codec寄存器初始化inti_aic(); /*-*/ / receive

14、the adc output data of codec / then output the received data to dac of codec /*-*/while(1)if(wave=1) if(gain!=gainnew)for(i=0;i<nx;i+) outputi=gain*output1i/204800; gainnew=gain; else if(wave=2) if(gain!=gainnew)for(i=0;i<nx;i+) outputi=gain*output2i/1024; gainnew=gain; else if(wave=3) if(gain

15、!=gainnew)for(i=0;i<nx;i+) outputi=gain*output3i/1024; gainnew=gain; else(wave=4); if(gain!=gainnew)for(i=0;i<nx;i+) outputi=gain*output4i/1024; gainnew=gain; while(!mcbsp_xrdy(hmcbsp) ; mcbsp_write16(hmcbsp, outputk);while(!mcbsp_xrdy(hmcbsp) ;mcbsp_write16(hmcbsp, outputk); k=k+(frq/88.235);

16、 if (k>=nx) k=k%nx; gel文件如下:volume.gel/* * copyright 1998 by texas instruments incorporated. * all rights reserved. property of texas instruments incorporated. * restricted rights to use, duplicate or disclose this code are * granted through contract. */* = volume.gel =*/menuitem "applicatio

17、n control"slider gain(0,1000,1,1, gainparm) gain = gainparm;menuitem "application control"slider frq(300,16000,100,100, frqparm) frq = frqparm;menuitem "application control"slider wave(1,4,1,1, waveparm) wave = waveparm;五、程序调试1、编译过程 在编译程序之前,还要做一些准备工作,即这项工程的文件添加等。如library的库文件

18、就需要自己从ti(或ccs5000)文件夹中寻找添加:1、 csl5502x.lib是软件仿真所用的仿真器所必需的库文件;2、 rts55x.lib,这个库提供目标dsp运行时间支持(runtime-support)。 2、.cmd程序(5502.cmd)全文及其解释:2.1 .cmd文件类型及作用:.cmd是链接器命令文件,用于存储器配置。2.2 .cmd文件结构:.cmd由两条链接伪指令来描述:memory 和sections,其中:memory定义用户目标系统存储器的配置;sections控制段的构建和存储器的分配。 首先存储器空间是需要配置的,因为dsp不同的空间占用相同的地址,因此需

19、要人工分配。 2.3 5502.cmd全文及其解释如下:memory mmr : origin = 0000000h, length = 00000c0h spram : origin = 00000c0h, length = 0000040 vecs : origin = 0000100h, length = 0000100h daram0 : origin = 0000200h, length = 0007e00h daram1 : origin = 0008000h, length = 0008000h ce0 : origin = 0010000h, length = 03f0000h

20、 /* 对应zbtram空间 */ flash : origin = 0400000h, length = 0100000h/* flash 空间 */* flash : origin = 0410000h, length = 00f0000h*/ extend: origin = 0500000h, length = 0300000h/* 状态控制寄存器、uarta、uartb、usb、和扩展总线所对应的空间 */ sdram : origin = 0800000h, length = 03ffffch/* sdram 空间*/ ce3 : origin = 0c00000h, length

21、 = 03f8000h/* sdram 空间*/ pdrom : origin = 0ff8000h, length = 07f00h reset_vecs : origin = 0ffff00h, length = 000ffh /* reset vector */ sections .vectors : > vecs /* interrupt vector table */ .cinit : > daram1 /*把.cinit输出段分配到daram1中的*/ .text : > daram1 .audio_in_data1: > sdram .audio_in_d

22、ata2: > sdram .audio_in_data3: > sdram .audio_out_data1: > sdram .audio_out_data2: > sdram .audio_out_data3: > sdram data_out : > sdramdata_out1 : > sdram /*以上对应主程序部分*/ .stack : > daram0 .sysstack: > daram0 .sysmem : > daram0 .cio : > daram1 .data : > daram1 .bss

23、: > daram1 .const : > daram1 .csldata: > daram0 dmamem: > daram0 根据上面的具体文件作以下补充:msections是coff文件中最重要的概念,它至少包含以下三个段:.text 段:包含可执行代码;.data 段:包含初始化数据;.bss 段: 为未初始化变量保留存储空间。其他为自定义段(或汇编器生成段),如:.usect段,.sect段,.cinit段等。 m初始化代码段:包含数据或可执行代码,c/c+ compiler 产生下面的初始化段:4.cinit 段:包含初始化变量表和常数,c/c+ 的全局变量;4.const 段:包含由c/c+限定的字符串常数和数据;(假如 constant也不是定义为 volatile).4.text 段:包含所有的可执行代码,还有字符串汇编产生的常数。m.cmd文件的细节问题:未初始化段:存储器中的保留空间(通常是ram)。程序可以在运行时使用这个空间,建立和存储变量。汇编器compiler 建立如下未初始化段:4.bss段:为global and static variables保留空间。当使用-c 链接选项,程序启动时,c/c+ boot 程序将.cinit段的数据拷出,存到.bss段中。4.stack 段:为c/c+系统堆栈system stack分

温馨提示

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

评论

0/150

提交评论