DSP课程设计报告——多波形信号发生器目录一、实验目的 (2)二、实验内容 (2)三、实验原理 (3)1.产生连续的波形的方法 (3)1.1 查表法: (3)1.2计算法: (3)2. TLV320AIC23B的内部结构及工作原理 (3)四、程序设计 (4)五、程序调试 (10)1、编译过程 (10)2、.cmd程序(5502.cmd)全文及其解释: (10)3、程序运行结果(图形和数据显示): (12)六、硬件输出演示: (14)七、实验感想与体会....................................................................................... 错误!未定义书签。
八、参考文献 (16)一、实验目的1.学习并掌握D/A转换器的初始化设置及其应用2.学习并掌握使用DSP产生正弦波的原理和算法,进而掌握任意信号波形(如三角波、锯齿波、矩形波等信号)产生的原理和算法。
3.比较产生信号的两种主要方法(查表法和计算法)的优缺点。
4.熟练使用软件CCS3.3对程序的完整调试过程。
二、实验内容使用DSP产生300~16000Hz的正弦、方波、锯齿波和三角波信号,输出信号的幅度从0~1Vrms(有效值)。
要求使用计算法,并且频率可变、幅度可变。
本实验要求用软件CCS3.3编程实现,并与硬件连接进行功能演示。
三、实验原理1.产生连续的波形的方法1.1 查表法:把事先将需要输出的数据计算好,存储在DSP 中,然后依次输出就可以了。
查表法的优点是速度快,可以产生频率较高的波形,而且不占用DSP 的计算时间;查表法的缺点在于需要占用DSP 的内部的存储空间,尤其对采样频率比较大的输出波形,这样,需要占用的内部的空间将更大,而DSP 内部的存储空间毕竟有所限制。
这使得查表法的应用场合十分有限。
1.2计算法:采用计算的方法依次计算数据而后输出,然后再计算而后输出。
计算法的优缺点正好和查表法相反。
即:其优点是不占用DSP 的存储空间,其缺点是占用DSP 的计算时间,使得执行程序的开销变大。
本实验将用第二种方法即计算法产生一个正弦波信号,从DA 输出。
由余弦信号的递推公式:得知:如果需要产生连续的余弦信号,必须知道首先两个余弦值的大小,然后就可以利用上式计算出后面的数据,这就是下面编程依据的核心算法。
正弦函数和余弦函数的泰勒级数数学表达式为:=x sin +--+-+-+---)!12()1(!9!7!5!31219753n x x x x x x n n ,x ∀),(∞-∞∈ =x cos +-+-+-+-)!2()1(!8!6!4!2128642n x x x x x n n ,x ∀),(∞-∞∈. 如果要计算一个角度ⅹ的正弦和余弦值,可以取其前五项进行近似计算。
也可以用递推公式求正弦和余弦值:θθθθ)2sin()1sin(cos 2sin ---•=n n nθθθθ)2cos()1cos(cos 2cos ---•=n n n利用递推公式计算正弦和余弦值需已知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编程来设置,范围8KHz~96KHz。
内含抗混叠滤波器和重构滤波器。
//AIC23波特率设置,CLKIN=CLKOUT=MCLK,采样率32KHz,时钟模式为普通模式,Uint16 Sample_Rate_Control[2] = {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_Control[2] = {Codec_SRC_REV,SRC_CLKIN(0)+SRC_CLKOUT(0)+SRC_SR(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 <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"); //存放sin数据,浮点型float output1[Nx];#pragma DATA_SECTION(output2,"data_out2"); //存放sin数据,浮点型float output2[Nx];#pragma DATA_SECTION(output3,"data_out3"); //存放sin数据,浮点型float output3[Nx];#pragma DATA_SECTION(output4,"data_out4"); //存放sin数据,浮点型float output4[Nx];#pragma DATA_SECTION(output,"data_out"); //存放sin数据,定点型int output[Nx],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度内取样点数/*****************新增函数段*****************/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-x x/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/14/15*(1-xx/16/1 7))))))));//数学总公式// fprintf(stdout,"COMPUTE%f",ii); fprintf(stdout,"\n "); //输出计算的正弦波的数值,x2=eoutput1[i]= 32767*ii; //利用泰勒级数计算出正弦波的数值,存放到output1中// output[i]=gain*output1[i]/1024;} // 正弦波output2[0]=0;for(i=0;i<=(Nx-1)/2;i++){output2[i+1]=output2[i]+2;}for(i=(Nx+1)/2;i<=(Nx-1);i++){output2[i+1]=output2[i]-2;} // 三角波for(i=0;i<=(Nx-1)/2;i++){output3[i]=500;}for(i=(Nx+1)/2;i<=(Nx-1);i++){output3[i]=0;} // 方波output4[0]=0;for(i=0;i<=(Nx-1);i++){output4[i+1]=output4[i]+2;}// Initialize CSL library - This is REQUIREDCSL_init();// The main frequency of system is 240MHz// 该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数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 McBSP port 1 by use previously defined structure Mcbsp_Config(hMcbsp);//I2C初始化I2C_cofig();//CODEC寄存器初始化inti_AIC();/*------------------------------------------------------------------------------------*/// Receive 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++){output[i]=gain*output1[i]/204800;}gainnew=gain;}}else if(wave==2){if(gain!=gainnew){for(i=0;i<Nx;i++){output[i]=gain*output2[i]/1024;}gainnew=gain;}}else if(wave==3){if(gain!=gainnew){for(i=0;i<Nx;i++){output[i]=gain*output3[i]/1024;}gainnew=gain;}}else(wave==4);{if(gain!=gainnew){for(i=0;i<Nx;i++){output[i]=gain*output4[i]/1024;}gainnew=gain;}}while(!MCBSP_xrdy(hMcbsp)) {};MCBSP_write16(hMcbsp, output[k]);while(!MCBSP_xrdy(hMcbsp)) {};MCBSP_write16(hMcbsp, output[k]);k=k+(frq/88.235);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 "Application 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、编译过程在编译程序之前,还要做一些准备工作,即这项工程的文件添加等。