第一篇:DSP-任意信号发生器
任意信号发生器
实验报告
姓
名: 学院(系): 专
业: 组
员: 指导老师:
学 号:
电子工程与光电技术学院
通信工程
一、实验目的
1.熟悉 DSP 硬件开发平台; 2.熟悉 DSP 集成开发环境(CCS); 3.掌握 TMS320F2812 的存储器配置表; 4.学习TMS320F2812 的编程开发; 5.熟悉代码调试的基本方法。
二、实验仪器
计算机、C2000 DSP 教学实验箱、XDS510 USB 仿真器、示波器
三、实验内容
建立工程,编写DSP 的主程序,并对工程进行编译、链接,利用现有 DSP平台实现任意波的产生,通过示波器观察结果。对于实验所要求的内容,完成情况如下:
(1)、独立完成项目编译、链接、调试的全过程;
(2)、利用数码显示管,在DSP初始化子模块后添加语句或者编写子程序,使之能够显示实验日期2014.11.15。答:如图所示:
(3)、记录实验中个子程序包括主程序的入口实际地址,与 memory 比较,指出分别位于什么类型的存储器中。
答:入口地址为:0x00000000;位于片上M0.M1 SARAM。(4)、指出波形数据保存的空间地址,并以图形方式显示线性调频信号的波形,并保存,附在实验报告中。答:空间地址为:0x01000000 线性调频信号的波形如图所示:
四、实验中出现的问题及解决方案
1、改变信号频率的方式并编程实现,在示波器上验证:
首先需要改变原来的程序,初始程序为cos余弦函数,我们把它改成了sin正弦函数;另外信号频率需要不断变化,因此在源程序基础上增加了一个变量m.具体程序如下所示: 初始程序:
修改后程序:
改变信号频率后,示波器上验证的图形如下: A、m=2时,T=5.3ms;
B、m=3时,T=3.6ms;
C、m=4时,T=2.65ms;
D、m=8时,T=1.32ms;
2、在实验过程中,由于实验进行的比较顺利,因此我们还利用数码显示管显示了其他内容,例如下面图形所示,寓意为“304C一生一世”(304C为宿舍号):
五、实验感想
在进行本实验时,由于我们之前对CCS这个集成开发环境有了一定的熟悉,因此做起来少了生疏感。主要出现的问题在于编程方面,在编写正余弦函数表达式上我们是通过了学习他人的方式完成的。
该实验让我学会了利用DSP的运算能力计算出波形的数值信息,在现有平台上实现任意波形的生成,还让我学会了通过改变程序来控制数码显示管的输出。总之,通过实验,我发现了许多以前不知道的DSP的用处,感谢实验带给我新的知识和领悟。
第二篇:DSP音频信号发生器
大学课程设计报告
音频信号发生器
设 计 人: 专
业: 班
级: 学
号: 指导教师:
二零一四年
付路 电子信息工程 电子111501 201115020104 宁爱平
目录
一. 引言-------------第2页 二.系统结构及原理----第2页 三. 硬件设计---------第3页
3.1 MMC/SD卡接口电路-----------------------------第3页 3.2 上位机和单片机通信---------------------------第4页 3.3 信号调理电路--第5页 四. 软件设计---------第7页
4.1 系统初始化---第7页 4.2 MMC/SD卡初始化------------------------------第7页 4.3 MMC/SD卡单块写数据--------------------------第8页 五. 结束语----------第11页
一. 引言
目前,单片机系统以价格低廉、开发环境完备、开发工具齐全、应用资料众多、功能强大且程序易于移植等优点而得到广泛应用。同时,随着信息化进程、计算机科学与技术以及信号处理理论与方法的迅速发展,需要的数据量越来越大,对数据存储也提出了更高要求。MMC/SD卡以其价格、体积、读取速度等特点成为现今大多数便携式嵌入式设备的首选。
二.系统结构及原理
音频信号发生器的系统结构如图1所示,它主要由8051F330单片机、MMC/SD卡存储器、RS232串行通信接口、上位机、液晶显示、键盘以及信号调理电路等部分组成。将写入MMC/SD卡中的音频数据存储在上位机,单片机通过RS232串行通信接口写入MMC/SD卡,以中断方式读取键盘接口命令,并根据命令控制选择相应的音频信号数据,再由信号调理电路输出不同频率和强度的音频信号,系统通过液晶显示模块显示信号频率、信号强度及信号类型。该系统突出的特点是上位机采用Lab Windows/CVI软件,通过RS232串行通信接口与单片机通讯;以文本格式存储在上位机的音频信息则通过RS232串行通信接口下载到MMC/SD卡。系统控制核心选用美国Cygnal公司的8051F330单片机,C8051F330微控制器采用独特的CIP-8051架构,对指令运行实行流水作业,大大提高了指令的运行速度;采用多功能存储卡-MMC/SD卡作为存储介质。MMC/SD卡内置控制电路,可应用于手机、数码相机、MP3等多种数字设备,反复记录30万次,具有较高的性价比;液晶显示屏采用OCM12864点阵液晶显示模块,由单片机时序控制,具有8位数据线、6条控制线和电源线。
三. 硬件设计
3.1 MMC/SD卡接口电路
MMC/SD卡在音频信号发生器系统中是以数字量形式存储音频信息。MMC/SD卡有两种工作模式,即MMC/SD模式和SPI模式。从实际应用角度出发,SPI模式设计简单,操作方便,但数据传输速率不如MMC/SD模式,本系统采用SPI模式。MMC/SD卡工作在SPI模式下,其各个引脚功能的定义,如表1所示。CS是MMC/SD卡的片选线,在SPI模式下,CS必须保持低电平有效;DI不但传输数据,还发送命令,传输方向是由单片机到MMC/SD卡;同样DO除了发送数据外还传送应答信号,传输方向是由MMC/SD卡到;SCLK是操作MMC/SD卡的时钟线。将C8051F330的相应交叉开关配置为SPI模式,与MMC/SD卡对应的引脚连接。针对SPI总线线路上增加了上拉电阻。MMC/SD卡与单片机接口电路。如图2所示。
单片机
3.2 上位机和单片机通信
上位机采用Lab Windows/CVI软件通过串口向单片机发送音频信息。单片机将接收到的信息数据写入MMC/SD卡。Lab Windows/CVI软件的音频信息是由WinHex软件将原始文件转换成16进制的数字量,该软件可对多种语音信号进行转换。上位机与单片机的通信是通过RS232串口通讯器件完成的。当上位机与音频信号发生器相距较远.不能直接用RS232器件将其连接时,可将RS232转换为CAN,通过CAN总线实现串口设备的网络互联。RS232标准电平采用负逻辑,规定+3 V~+15 V的任意电平为逻辑“0”电平,-3 V~-15 V的任意电平为逻辑“1”电平。而CAN信号则使用差分电压传输,2条信号线称为“CAN_H”和“CAN_L”,静态时均为2.5 V,此时状态表示为逻辑“1”,也可称为“隐性”;CAN_H比CAN_L高时表示逻辑“0”,称为“显性”。显性时,通常为:CAN_H=3.5 V,CAN_L=1.5 V。
RS232串口的帧格式:1位起始位,8位数据位,1位可编程的第9位(此位为发送和接收的地址/数据位),1位停止位。而CAN的数据帧格式:帧信息+ID+数据(分为标准帧和扩展帧两种格式)。
3.3 信号调理电路
存储在MMC/SD卡中的数据是音频信号发生器的源代码。单片机将这些数据从MMC/SD卡中读出,经过单片机内部数模转换,以模拟量的形式从P01输出。该模拟信号经信号调理电路可外接耳机或音响播放十几种音律。信号调理电路如图3所示。由P01输出的信号经LM324放大后,由多个LM324并联实现信号跟随和功率驱动。图中只画出了2个跟随器,实际应用中根据需要可以并联10多个信号跟随器。
四. 软件设计
4.1 系统初始化
系统初始化可完成C8051F330的I/O口、晶体振荡器、SPI总线和C8051F330片上串口的初始化设置。用C语言编写的程序代码如上:
4.2 MMC/SD卡初始化
MMC/SD卡上电后默认为MMC/SD模式,要使MMC/SD卡工作在SPI模式下,在MMC/SD卡初始化时,当片选线(CS)被拉低时发送复位命令CMD0,如收到应答信号01H,表示已将卡置为闲置状态;如收到应答信号不是01H,则表示出错。然后向MMC/SD卡发送命令CMD1,收到正确的应答信号00H之后,才会使MMC/SD卡进入SPI模式。MMC/SD卡初始化流程如图4所示。
MMC/SD卡协议是一种问答式协议。首先单片机发送CMD。接着由MMC/SD卡发送回应RES。MMC/SD卡的命令长度都是6字节,命令总是以左边的起始位开始,右边的结束位结束。其具体的命令格式如表2所示,MMC/SD卡的应答格式分为4种,分别是R1、R1b、R2和R3应答。
4.3 MMC/SD卡单块写数据
MMC/SD卡单块写数据主要实现C8051F330对MMC/SD卡的单块写操作。MMC/SD卡块的默认大小为512字节。当MMC/SD卡接收到单块写命令CMD24后,MMC/SD卡向单片机发送应答命令,并且等着单片机发送数据块。当应答命令R1为0时,说明可以发送512个字节数据。MMC/SD卡对接收到的数据块都通过一个l字节长的命令确认,当其低5位二进制数据为00101时,数据块才确认数据块写入MMC/SD卡。在数据块发送中,共发送515个字节数据,其中,第一个字节为0xFE,随后是512字节的用户数据块,最后是2个字节的CRC。单块数据写入MMC/SD卡的流程图如图5所示。
采用C语言编写的程序代码如下:
#include “scancode.h” #define TIM *(int *)0x24 #define PRD *(int *)0x25 #define TCR #define IMR #define IFR #define PMST *(int *)0x26 *(int *)0x0 *(int *)0x1 *(int *)0x1d
#define SPSA0 *(unsigned int *)0x38 #define SPSD0 *(unsigned int *)0x39 #define SPSA1 *(unsigned int *)0x48 #define SPSD1 *(unsigned int *)0x49 #define nMusicNumber 40
#define REGISTERCLKMD(*(unsigned int *)0x58)#define WAITSTATUS(*(unsigned int *)0x28)
ioport unsigned char port8000;ioport unsigned char port8001;ioport unsigned char port8002;ioport unsigned char port8007;#define CTRGR port8000 #define CTRKEY port8001 #define CTRCLKEY port8002 #define CTRLR port8007
void Delay(unsigned int nTime);void interrupt time(void);// 音符数据
unsigned int music[nMusicNumber][2]= { {182,480},{151,480},{135,480},{121,480},{135,480},{151,480},{182,480},{0,480}, {182,480},{151,480},{135,480},{121,480},{135,480},{151,480},{182,480},{0,480}, {182,240},{151,240},{135,240},{121,240},{135,240},{151,240},{182,240},{0,240}, {182,240},{151,240},{135,240},{121,240},{135,240},{151,240},{182,240},{0,240}, {182,1920},{151,1920},{135,1920},{121,1920},{135,1920},{151,1920},{182,1920},{0,1920} };unsigned int uWork;main(){
unsigned int uWork1;int j,nCount,nCount1,nScanCode;nCount=nCount1=0;REGISTERCLKMD=0;CTRGR=0;CTRGR=0x80;
CTRGR=8;CTRLR=0;
// 关闭东西方向的交通灯
CTRLR=0x40;// 关闭南北方向的交通灯 uWork1=CTRCLKEY;
// 清除键盘缓冲区
for(j=0;j PMST = uWork1&0xff;IMR = 0x8;TCR = 0x412;TIM = 0;PRD = music[nCount][0];TCR = 0x422;IFR = 0x100;asm(“ rsbx j=0;while(j<1){ nCount1=0;nScanCode=CTRKEY;// 读扫描码 nScanCode&=0x0ff;// 低8位 uWork1=CTRCLKEY; // 清除键盘缓冲区 INTM”); // 频率设置 if(nScanCode!=0) { } nCount1++;Delay(music[nCount][1]/3*12);// 音长 nCount++;if(nCount>=nMusicNumber){ } if(music[nCount][0]==0)TCR=0x412; // 静音 nCount=0;j++;if(nScanCode==SCANCODE_Enter) break;else { PRD = music[nCount][0];// 切换音符 TCR = 0x422;} } } void Delay(unsigned int nDelay){ } void interrupt time(void){ SPSA0=1; // set McBSP0's SPCR2 int i,j,k=0;for(i=0;i } uWork&=0xfffe;// set XRST=0 SPSD0=uWork;SPSA0=0x0e;// set McBSP0's PCR uWork=SPSD0;uWork|=0x2000;// set XIOEN=1, Enable IO,DX for output uWork^=0x20;SPSD0=uWork; // DX=^DX 五. 结束语 根据MMC/SD卡的SPI协议,采用单片机实现与MMC/SD卡的接口,解决了嵌入式系统大容量数据存储问题,利用上位机可以方便的读取写入数据。本系统的存储速度可达20 Mb/s,完全满足信号发生器所需的下载速度和音频播放速度。所编写的MMC/SD卡驱动程序已经应用到嵌入式信号发生器系统中,实现了数据的安全、稳定的存储。相对于MMC/SD卡无论是读写速度还是存储容量都得到了极大提高。在SPI模式下,SD卡与MMC卡相兼容,即就是说SD卡程序也适用于MMC卡。 函数信号发生器和任意波形发生器对比 1、函数信号发生器 函数发生器是使用最广的通用信号源信号发生器,提供正弦波、锯齿波、方波、脉冲波等波形,有的还同时具有调制和扫描功能。 函数波形发生器在设计上分为模拟式和数字合成式。众所周知,数字合成式函数信号源(DDS)无论就频率、幅度乃至信号的信噪比(S/N)均优于模拟式,其锁相环(PLL)的设计让输出信号不仅是频率精准,而且相位抖动(phaseJitter)及频率漂移均能达到相当稳定的状态,但数字式信号源中,数字电路与模拟电路之间的干扰始终难以有效克服,也造成在小信号的输出上不如模拟式的函数信号发生器,如今市场上的大部分函数信号发生器均为DDS信号源。 2、任意波形发生器 任意波形发生器,是一种特殊的信号源,不仅具有一般信号源波形生成能力,而且可以仿真实际电路测试中需要的任意波形。在我们实际的电路的运行中,由于各种干扰和响应的存在,实际电路往往存在各种缺陷信号和瞬变信号,如果在设计之初没有考虑这些情况,有的将会产生灾难性后果。任意波发生器可以帮您完成实验,仿真实际电路,对您的设计进行全面的测试。 由于任意波形发生往往依赖计算机通讯输出波形数据。在计算机传输中,通过专用的波形编辑软件生成波形,有利于扩充仪器的能力,更进一步仿真实验。另外,内置一定数量的非易失性存储器,随机存取编辑波形,有利于参考对比,或通过随机接口通讯传输到计算机作更进一步分析与处理。有些任意波形发生器有波形下载功能,在作一些麻烦费用高或风险性大的实验时,通过数字示波器等仪器把波形实时记录下来,然后通过计算机接口传输到信号源,直接下载到设计电路,更进一步实验验证。 泰克推出的AFG3000系列三合一信号源,可以完成以上提到的功能,并且在波形输出的精度、稳定性等方面都有较大提高,是走在行业前列的新一代任意波发生器。 信号源的主要技术指标 传统函数发生器的主要指标和新近研发的任意波形发生器的主要指标有一些不同,我们这里分开介绍。 (一)普通函数发生器的主要指标: 带宽(输出频率范围) 仪器的带宽是指模拟带宽,与采样速率等无关,信号源的带宽是指信号的输出频率的范围,并且一般来讲信号源输出的正弦波和方波的频率范围不一致,例如,某函数发生器产生正弦波的频率范围是1mHz~240MHz,而输出方波的频率范围是1mHz~120MHz。 频率(定时)分辨率 频率分辨率,即最小可调频率分辨率,也就是创建波形时可以使用的最小时间增量。 频率准确度 信号源显示的频率值与真值之间的偏差,通常用相对误差表示,低档信号源的频率准确度只有1%,而采用内部高稳定晶体振荡器的频率准确度可以达到108~1010。例如,某信号源的频率准确度为1ppm。 频率稳定度 频率稳定度是指外界环境不变的情况下,在规定时间内,信号发生器输出频率相对于设置读数的偏差值的大小。频率稳定度一般分为长期频率稳定度(长稳)和短期频率稳定度(短稳)。其中,短期频率稳定度是指经过预热后,15分钟内,信号频率所发生的最大变化;长期频率稳定度是指信号源经过预热时间后,信号频率在任意三小时内所发生的最大变化。 输出阻抗 信号源的输出阻抗是指从输出端看去,信号源的等效阻抗。例如,低频信号发生器的输出阻抗通常为600Ω,高频信号发生器通常只有50Ω,电视信号发生器通常为75Ω。 输出电平范围 输出幅度一般由电压或者分贝表示,指输出信号幅度的有效范围。另外,信号发生器的输出幅度读数定义为输出阻抗匹配的条件下,所以必须注意输出阻抗匹配的问题。 (二)任意波发生器的主要指标: 取样(或采样)速率 取样速率通常用每秒兆样点或者千兆样点表示,表明了仪器可以运行的最大时钟或取样速率。取样速率影响着主要输出信号的频率和保真度。奈奎斯特取样定理规定,取样频率或时钟速率必须至少是生成的信号中最高频谱成分的两倍,以保证精确的复现。 存储深度(记录长度) 存储深度是指用来记录波形的数据点数,它决定着波形数据的最大样点数量(相当于时间)。每个波形样点占用一个存储器位置,每个位置等于当前时钟频率下取样间隔时间。任意波形发生器的带宽是由任意波发生器的取样速率和存储深度决定的。 垂直(幅度)分辨率 信号源的垂直分辨率是指信号源中可以编程的最小电压增量,也就是仪器数模转换器的二进制字宽度,单位为位,它规定了波形的幅度精度。在混和信号源中,垂直分辨率与仪器DAC的二进制字长度有关,位越多,分辨率就越高。 信号源的主要功能 一台功能较强的信号源,还有信号调制、频率扫描、TTL同步输出、参考时钟输出、Burst及频率计等功能: 信号调制功能:信号调制是指被调制信号中,幅度、相位或频率变化把低频信息嵌入到高频的载波信号中,得到的信号可以传送从语音、到数据、到视频的任何信号。信号调制可分为模拟调制和数字调制两种,其中模拟调制,如幅度调制(AM)和频率调制(FM)最常用于广播通信中,而数字调制基于两种状态,允许信号表示二进制数据。 频率扫描功能:测量电子设备的频率特点要求“扫描”正弦波,其会在一段时间内改变频率。一般分成线性(Lin)扫频及对数(Log)扫频;高级信号发生器支持扫频功能,而且可以选择开始频率、保持频率、停止频率和相关时间,有些信号发生器还提供与扫频同步的触发信号。 TTL同步输出功能:一般信号源输出的TTL同步信号是方波经三极管电路转成的,电平为0(Low)、3.6~5V(High)。主要用来同步其他信号源,或其他类型的仪器,以保证触发同步。 参考时钟输出功能:TTL同步输出只能保证触发同步,要想使信号源完全同步就要让时钟同步,参考时钟输出就是为了让两台信号源的时钟同步而设计的,一般参考时钟输出频率较稳定的方波信号。 Burst功能:类似OneShot功能,输入一个TTL信号,则可让信号源产生一个周期的信号输出,设计方式是在没有信号输入时,输出接地即可。 频率计:除市场上简易的刻度盘显示之外,无论是LED数码管或LCD液晶显示频率,其与频率计电路是重叠的。 来源:http://www.xiexiebang.com/shownews.asp?id=468 模拟课程设计题 信号发生器设计 设计一个能够输出正弦波、三角波和矩形波的信号源电路,电路形式自行选择。输出信号的频率可通过开关进行设定,具体要求如下: (1)输出信号的频率范围为100~800Hz,步进为100Hz。(60分) (2)要求输出信号无明显失真,特别是正弦波信号。(30分) 评分标准: (1)范围满足设计要求得满分,否则酌情扣分。 (2)输出信号无明显失真可满分,有明显失真酌情扣分。 发挥部分(附加10分): 进一步扩大输出信号范围和减小步进频率。 基于DSP的正弦信号发生器的设计 1、绪论 1.1 课题背景 数字信号处理(Digital Signal Processing,简称DSP)是一门涉及许多学科而又广泛应用于许多领域的新兴学科。20世纪60年代以来,随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速的发展。数字信号处理是一种通过使用数学技巧执行转换或提取信息,来处理现实信号的方法,这些信号由数字序列表示。在过去的二十多年时间里,信号处理已经在通信等领域得到了极为广泛的应用。 长期以来,信号处理技术—直用于转换或产生模拟或数字信号。其中应用的最频繁的领域就是信号的滤波。此外,从数字通信、语音、音频和生物医学信号处理到检测仪器仪表和机器人技术等许多领域中,都广泛地应用了数字信号处理技术。数字信号处理己经发展成为一项成熟的技术,并且在许多应用领域逐步代替了传统的模拟信号处理系统。而本文中基于DSP技术设计的正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中。1.2 课题内容 利用基于CCS开发环境中的C54x汇编语言来实现正弦信号发生装置。 2、设计原理 一般情况,产生正弦波的方法有两种:查表法和泰勒级数展开法。查表法是使用比较普遍的方法,优点是处理速度快,调频调相容易,精度高,但需要的存储器容量很大。泰勒级数展开法需要的存储单元少,具有稳定性好,算法简单,易于编程等优点,而且展开的级数越多,失真度就越小。 本文采用了泰勒级数展开法。一个角度为θ的正弦和余弦函数,可以展开成泰勒级数,取其前5项进行近似得: x3x5x7x9sin(x)x3!5!7!9!x2x2x2x2 x(1(1(1(1))))23456789x2x4x6x8cos(x)12!4!6!8!x2x2x2x2 1(1(1(1)))2345678式中:x为θ的弧度值,x2f/fs(fs是采样频率;f是所要发生的信号频率) 3、设计方案 本设计采用TMS320C54X系列的DSP作为正弦信号发生器的核心控制芯片。 通过计算一个角度的正弦值和余弦值程序可实现正弦波,其步骤如下: 开 始初始化设置调用sin和cos程序计算0~45°的值Sin2α=2sinα*cosα求0~90°的sin值(间隔为1°)1.利用sinx和cosx子程序,计算0—45°(间 隔为0.5°)的正弦和余弦值 2.利用sin(2x)=2sin(x)cos(x)公式,计算0—90°的正弦值(间隔为1°)3.通过复制,获得0—359°的正弦值 4.将0—359°的正弦值重复从PA口输出,遍可得到正弦波 整个系统相应的软件流程图如右图所示。 图1 程序流程图 结 束正弦波重复向PA口输出重复得到0~359°正弦值 4、程序设计 4.1 产生正弦波程序清单sin.asm.title “sin.asm” //为汇编文件取名为“sin.asm”.mmregs //定义存储器映像寄存器.def _c_int00.ref sinx,d_xs,d_sinx,cosx,d_xc,d_cosx //定义标号 sin_x:.usect “sin_x”,360 //为“sin_x”保留360个存储空间 STACK:.usect “STACK”,10 //为堆栈保留10个存储空间 k_theta.set 286 //theta=pi/360(0.5deg)PA0.set 0 _c_int00.text //定义文本程序代码段 STM #STACK+10,SP //设置堆栈指针 STM k_theta,AR0 //AR0-->K_theta(increment)STM 0,AR1 //(AR1)=X(rad)STM #sin_x,AR6 //AR6→sin(x)STM #90,BRC //form sin0(deg.)—sin90(deg)RPTB loop1-1 //重复执行块语句(下条语句开始至 loop1-1)91次 LDM AR1,A LD #d_xs,DP STL A,@d_xs //(A)低16位→d_xs STL A,@d_xc //(A)CALL sinx // CALL cosx // LD #d_sinx,DP //DP LD @d_sinx,16,A //A=sin(x)MPYA @d_cosx //B= sin(x)*cos(x)STH B,1,*AR6+ //AR6 MAR *AR1+0 //loop1: STM #sin_x+89,AR7 //sin91(deg.)STM #88,BRC RPTB loop2-1 // LD *AR7-,A //((AR7))STL A,*AR6+ //(A)loop2: STM #179,BRC //sin180(deg.)(BRC)=179, STM #sin_x,AR7 //AR7 RPTB loop3-1 LD *AR7+,A //((AR7))NEG A // STL A,*AR6+ //Aloop3: STM #sin_x,AR6 //AR6 STM #1,AR0 //AR STM #360,bk //BKloop4: PORTW *AR6+0%,PA0 //PA0=*AR6+0%, B loop4 sinx:.def d_xs,d_sinx //.data //低16位→d_xc 调用sinx程序 调用cosx程序 ←d_sinx →2*sin(x)*cos(x)修改辅助寄存器AR1 —sin179(deg.)重复执行下条指令至loop2-1处90次 →A,然后AR7减去1 低16位→AR6 —sin359(deg.)重复执行180次 指向sin_x首地址 →A,然后AR7加1 累加器变负 低16位→AR6 指向sin_x ←01 ←360 向PA0输出数据 定义标号d_xs,d_sinx 定义数据代码段 table_s.word 01c7h //c1=1/(8*9).word 030bh //c1=1/(6*7).word 0666h //c1=1/(4*5).word 1556h //c1=1/(2*3)d_coef_s.usect “coef_s”,4 //为“coef_s”保留4个存储空间 d_xs.usect “sin_vars”,1 //为d_xs中sin_vars保留1个存 储空间 d_squr_xs.usect “sin_vars”,1 //d_temp_s.usect “sin_vars”,1 // d_sinx.usect “sin_vars”,1 //c_l_s.usect “sin_vars”,1 //.text // SSBX FRCT // STM #d_coef_s,AR5 //AR5 RPT #3 // MVPD #table_s,*AR5+ //table_s STM #d_coef_s,AR3 //AR3 STM #d_xs,AR2 //AR2 STM #c_l_s,AR4 //AR4 ST #7FFFh,c_l_s //7FFFh SQUR *AR2+,A //AR2 ST A,*AR2 // ||LD *AR4,B // MASR *AR2+,*AR3+,B,A // MPYA A // STH A,*AR2 // MASR *AR2-,*AR3+,B,A // MPYA *AR2+ //AR2 ST B,*AR2 // ||LD *AR4,B //为d_squr_xs中sin_vars保留1个 存储空间 为d_temp_s中sin_vars保留1个 存储空间 为d_sinx中sin_vars保留1个存储 空间 为d_xs中sin_vars保留1个存储 空间 定义代码开始段 设置FRCT=1以解决冗余符号位 指向d_coef_s首地址 重复下条指令4次 中的数复制到AR5指向 的单元 指向d_coef_s首地址 指向d_xs首地址 指向c_l_s首地址 →c_l_s 指向累加器A中的数值求其平方(A)左移16位→AR2(AR4)左移16位→B 从累加器A中减去(AR2)*(AR3)操作数与累加器A中高位相乘(A)高16位→AR2 从累加器A中减去(AR2)*(AR3)指向的数与累加器A的高16位相乘(B)左移16位→AR2(AR4)左移16位→B MASR *AR2-,*AR3+,B,A //从累加器A中减去(AR2)*(AR3)MPYA *AR2+ //与累加器A中高16位相乘 ST B,*AR2 //(B)左移16位→AR2 ||LD *AR4,B //(AR4)左移16位→B MASR *AR2-,*AR3+,B,A //从累加器A中减去(AR2)*(AR3)MPYA d_xs //d_xs指向的操作数与累加器A中高16位相乘 STH B,d_sinx //(B)高16位→d_sinx RET //cosx:.def d_xc,d_cosx //d_coef_c.usect “coef_c”,4 //.data //table_c.word 0249h //c1=1/(7*8).word 0444h //c1=1/(6*5).word 0aabh //c1=1/(3*4).word 4000h //c1=1/2 d_xc.usect “cos_vars”,1 //d_squr_xc.usect “cos_vars”,1 // d_temp_c.usect “cos_vars”,1 //d_cosx.usect “cos_vars”,1 //c_l_c.usect “cos_vars”,1 //.text // SSBX FRCT //FRCT=1 STM #d_coef_c,AR5 //AR5 RPT #3 // MVPD #table_c,*AR5+ // STM #d_coef_c,AR3 //AR3 STM #d_xc,AR2 //AR2 STM #c_l_c,AR4 //AR4 ST #7FFFh,c_l_c //7FFFh SQUR *AR2+,A //返回 定义标号d_xc,d_cosx 为coef_c保留4个存储空间 定义数据代码段 为d_xc中cos_vars保存1个存储单元 为d_squr_xc中cos_vars保存1个 存储单元 为d_temp_c中cos_vars保存1个存储 单元 为d_cosx中cos_vars保存1个存储单 元 为c_l_c中cos_vars保存1个存储单 元 定义文本代码段 以清除冗余符号位 指向d_coef_c首地址 重复下条指令4次 把table_c中的数复制到中AR5 指向d_coef_c首地址 指向d_xc首地址 指向c_l_c首地址 →c_l_c 求x的平方存放在累加器A中 ST A,*AR2 //(A)左移16位→AR2 ||LD *AR4,B //(AR4)左移16位→B MASR *AR2+,*AR3+,B,A //A=1-x^2/56,T=x^2 MPYA A //A=T*A=x^2(1-x^2/56)STH A,*AR2 //(d_temp)= x^2(1-x^2/56)MASR *AR2-,*AR3+,B,A //A=1-x^2/30(1-x^2/56)T= x^2(1-x^2/56)MPYA *AR2+ //B=x^2(1-x^2/30(1-x^2/56))ST B,*AR2 //(d_temp)= x^2(1-x^2/30(1-x^2/56))||LD *AR4,B //B=1 MASR *AR2-,*AR3+,B,A //A= 1-x^2/12(1-x^2/30(1-x^2/56))SFTA A,-1,A NEG A MPYA *AR2+ //B=1-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56)))MAR *AR2+ RETD ADD *AR4,16,B //B=1-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56)))STH B,*AR2 //cos(theta)RET.end 4.2 正弦波程序链接命令文件sin.cmd.cmd文件描述输入文件和输出文件,说明系统中有哪些可用存储器、程序段、堆栈及复位向量和中断向量等安排在什么地方。其中MEMORY段就是用来规定目标存储器的模型,通过这条指令,可以定义系统中所包含的各种形式的存储器,以及它们占据的地址范围;SECTIONS段说明如何将输入段组合成输出段以及在可执行文件中定义输出段、规定输出段在存储器中的位置等。MEMORY { PAGE 0: EPROM: org = 0E000h, len = 1000h VECS: org = 0FF80h, len = 0080h PAGE 1: SPRAM: org = 0060h, len = 0020h DARAM1: org = 0080h, len = 0010h DARAM2: org = 0090h, len = 0010h DARAM3: org = 0200h, len = 0200h } SECTIONS {.text :>EPROM PAGE 0 //文本代码段其实地址为0E000h,长度为 1000h.data :>EPROM PAGE 0 //数据代码段其实地址为0D000h STACK :>SPRAM PAGE 1 //堆栈起始地址为0060h,长度为0020h sin_vars :>DARAM1 PAGE 1 //标号为sin_vars段的起始地址为0080 长度为0010h coef_s :>DARAM1 PAGE 1 //标号为coef_s段的起始地址为0070h 长度为0010h cos_vars :>DARAM2 PAGE 1 //标号为cos_vars段的起始地址为0090h 长度为0010h coef_c :>DARAM2 PAGE 1 //标号为coef_c段的起始地址为0080h 长度为0020h sin_x : align(512){} > DARAM3 PAGE 1.vectors :>VECS PAGE 0 } 5、仿真与调试 5.1 CCS工程项目的调试 利用 CCS 集成开发环境,用户可以在一个开发环境下完成工程定义、程序 编辑、编译链接、调试和数据分析等工作环节。⑴ 创建工程(project)文件 选择 Project→New,在“Project”文本框中键入将要创建的工程项目名,本例工程项目名为“sin” ⑵ 向工程中添加文件 选择 Project→Add Files to Project,将 sine.asm文件自动添加到 Project→Source 中。用同样的方法 将 sine.cmd 文件添加到对应的目录中。⑶ 构建工程,工程所需文件编辑完成后,可以对该工程进行编译链接,产生可执行文件,为调试做准备。 选择 Project→Build,系统提示没有出错信息后,系统自动生成一个可执行文件,sine.out 文件。⑷ 载入可执行文件 选择 File→Load Program 载入编译链接好的可执行文件sine.out ⑸ 运行程序 选择 Debug→Run运行,可以通过查看内存表等方法,看到程序运行的结果。5.2 仿真结果 选择 View→Graph→Time/Frequence 得到的正弦波形如下图所示: 输出结果显示,在CCS图形观察窗口得到了频率稳定,信号干扰小,波形失真度较小的正弦信号。 6、心得体会 通过这次的课程设计使我进一步加深了对于DSP这门课程的学习以及对于平时所学内容的实际应用。在设计中发现问题和同学互相讨论研究,并在编程过程中进一步提高自身的创作、创新水平,扎实基础,扩展所学。在输入程序时发现编程确实是要求很认真细心的,如果稍有差错就会导致整个程序的错误,也由此体现了DSP这门课程的严谨性。相信在以后的学习中一定会更好的应用所学内容的。第三篇:函数信号发生器和任意波形发生器对比
第四篇:信号发生器设计(推荐)
第五篇:正弦信号DSP