还剩12页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
重复执行次BRC=179,180■指向首地址STM#sin_x,AR7;AR7sinxRPTB loop3-l;然后加LD*AR7+,A;AR7-A,AR71累加器变负NEG A;低位STL A,*AR6+;A16f AR6指向Ioop3:STM#sin_x,AR6;generate sinwave AR6sin xSTM#1,ARO;ARG01STM#360,BK;BKG360向输出数据loop4:PORTW*AR6+0%,PAO;PAO=*AR6+0%,PAOB loop4;sinx:定义标号,def d_xs,d_sinx;d_xs,d sinx定义数据代码段.data・table_s.word01c7h;cl=l/8*
9.word030bh;cl=l/6*
7.word0666h;cl=l/4*
5.word1556h;cl=1/2*3为〃〃保留个存储空间d_coef_s.usect〃coef_s〃,4;coef_s4〃•〃r为中保留个存储空间d_xs.usect;d_xs sin_vars1sin_vars,1;为中保留个存d_squr_xs,usect sin_vars,I d_squr_xs sin_vars1储空间为中保留个存储d_temp_s.usect sin_vars,1;d_temp_s sin_vars1空间〃•〃r为中保留个存储空d_sinx.usect;d_sinx sin_vars1sin_vars,1间〃•〃1为中保留个存储空间c_l_s,usect;d_xs sinvars1sm vars,i;定义代码开始段.text;设置以解决冗余符号位SSBX FRCTFRCTE指向首地址STM#d_coef_s,AR5;AR5d_coef_s;重复下条,旨令次RPT#34;中的数复制到指向的单MVPD#table_s,*AR5+table_s AR5元指向首地址STM#d_coef_s,AR3;AR3d_coef_s指向首地址STM#d_xs,AR2;AR2d_xs指向」_首地址STM#c_l_s,AR4;AR4c sST#7FFFh,c_l_s;7FFFh fcl_s指向累加器中的数值求其平方SQUR*AR2+,A:AR2A左移位一ST A,*AR2;A16AR2左移位一LD*AR4,B;AR416B;从累加器中减去MASR*AR2+,*AR3+,B,A A AR2*AR3;操作数与累加器中高位相乘MPYA A A高位一STH A,*AR2;A16AR2;从累加器中减去MASR*AR2-,*AR3+,B,AA AR2*AR3MPYA*AR2+指向的数与累力口器的高位相;AR2A16乘左移位一ST B,*AR2;B16AR2左移位一1|LD*AR4,B;AR416B从累加器中减去MASR*AR2-,*AR3+,B,A;AAR2*AR3;与累加器中高位相乘MPYA*AR2+A16左移位ST B,*AR2;B16f AR2左移位一1|LD*AR4,B;AR416B;从累加器中减去MASR*AR2-,*AR3+,B,AAAR2*AR3指向的操作数与累加器中高MPYA d_xs;d_xs A16位相乘高位STH B,d sinx;B16f d sinx;返回RETcosx:;定义标号.def d_xc,d_cosx d_xc,d_cosx为庶留个存储空间d_coef_c.usect〃coef_c〃,4;coef_c4・data;定义数据代码段table_c.word0249h;cl=l/7*8,word0444h;c2=l/6*
5.word Oaabh;c3=l/3*4・word4000h;c4=l/2为中保存个存储单元d xc.usect cos_vars,1;d_xc cos_vars1为中保存个存d_squr_xc.usect cos_vars,i;d_squr_xc cos_vars1储单元一〃,;为叫_中丫@保存个存储d_temp_c.usect〃cos_vars1113330$_1$1单元为中保存个存储单d cosx.usect cos_vars,1;d cosxcos_vars1元〃,为中保存个存储单c_l_c.usect〃cos_vars1;c_l_c cos_vars1元;定义文本代码段.text以清除冗余符号位SSBX FRCT;FRCT=1指向首地址STM#d_coef_c,AR5;AR5d_coef_c;重复下条指令次RPT#34把中的数复制到中MVPD#table_c,*AR5+;table_c AR5指向首地址STM#d_coef_c,AR3;AR3d_coef_c指向首地址STM#d_xc,AR2;AR2d_xc指向首地址STM#c_l_c,AR4;AR4c_l_cST#7FFFh,c_l_c;7FFFhf c_l_c;求的平方存放在累加器中SQUR*AR2+,A XA左移位一ST A,*AR2;A16AR2|LD*AR4,B;AR4左移16位一BMASR*AR2+,*AR3+,B,A;A=l-x^2/56,T=x^2MPYA A;A=T*A=x-2l-x-2/56STH A,*AR2;d_temp=x2l-x^2/56coef_s:DARAM1「MASR*AR2-,*AR3+,B,A;A=1-x2/30l-x-2/56,cos_vars T=x^2l-x^2/56:DARAMMPYA*AR2+;B=x^2l-x^2/30l-x^2/562coef cST B,*AR2;d_temp=x212/3012/561|LD*AR4,B;B=1MASR*AR2-,*AR3+,B,A;A=12/1212/3012/56SFTA A,-1,A;T/2■NEG A9MPYA*AR2+;B=l-x^2/2l-x^2/12l-x^2/30;1-x-2/56MAR*AR2+■9RETD.ADD*AR4,16,B;B=l2/2d2/1212/30;12/56STH B,*AR2;cos thetaRET■,end.9文件描述输入文件和输出文件,说明系统中有哪些可用存储器、程序
2.*.cmd段、堆栈及复位向量和中断向量等安排在什么地方其中段就是用来规定MEMORY目标存储器的模型,通过这条指令,可以定义系统中所包含的各种形式的存储器,以及它们占据的地址范围;段说明如何将输入段组合成输出段以及在可执行SECTIONS文件中定义输出段、规定输出段在存储器中的位置等正弦波程序链接命令文件sin.cmd MEMORYPAG0:EEPROM:org=OEOOOh,org=len=lOOOh len=VECS:0FF80h,0080h.text:EPROM PAGE0PAG1:ESPRAM:org=0060h,len=0020h
0.data:EPROM PAGEDARAM1:org=0080h,len=OOlOhSTACK:SPRAM PAGE1DARAM2:org=0090h,len=OOlOhsin vars:DARAM1PAGE1DARAM3:org=0200h,len=0200hSECTIONS文本代码段其实地址为长度为OEOOOh,1000h;数据代码段其实地址为ODOOOh;堆栈起始地址为长度为0060h,0020h标号为段的起始地址为;sin_vars0080;长度为0010h标号为段的起始地址为PAGE1;coef_s0070h;长度为OOlOh标号为段的起始地址为PAGE1;cos_vars0090h;长度为OOlOh标号为段的起始地址为PAGE1;coef_c0080h;长度为0020hsin_x:align512{}DARAM3PAGE
1.vectors:VECS PAGE0复位向量文件
3.sin_v.asm:〃.〃・title sin_v.asm_c_int
00.ref〃/〃,vectors,sectB_c_int
00.end设计仿真结果及分析/C54xSiaolatorTexasInstruents/CPV-C54XSimulator-CodeComposerStudio-[Graphical.厕OFileEditViewProjectDebugGELOptionProfileToolsDSP/BIOSWindowHelp X|百百尉电亳||T]|解蜀喻筑快编I昌用至够I靛ri理|shiyan.pjt▼|Z)手囱骷后|®曲•玛〔Debug*Files王口GELfiles日ProjectsB.弟shiyan.pjtDebiI DependentProjeLJ Documents口DSP/BIOS Config!__GeneratedFiles1Include「ILibraries日Source••…囱sin.asm国sin_v.asm5“…图sin.cmdDJ3♦JHALTED在集成环境中实现正弦波能够起到防止干扰的作用,同时也大大地减小了波CCS形的线性失真同时我们也能从中看出能够精确地对各个角度进行计算得出相应CCS的正弦值,幅度和频率易于调节,波形也较为稳定,抗干扰能力较强最重要的是这种设计方案简单可行,新颖实用,具有很高的实践和推广价值分析通过不断的发现错误、改正错误和调试,最终得到了所希望的图象,即正弦波信号设计总结在本次课程设计过程中我遇到一些课堂中从未有过的问题,通过网络查找和同学交流,大大促进了实训进程并在过程中进一步提高自身的创作、创新水平,扎实基础,扩展所学课设过程中经常遇到问题,通过自己在网上查找资料和在老师的帮助下,一步一步地解决了问题,最终解决了问题得到了结果,使我独立解决问题的能力得到了很大的提高并且此次课程设计,基于课程理论知识和网上资料,使我对数字信号处理课程有了更深一步的了解和掌握,对利用软件编程的数字信号处理方法有了进一步CCS的了解在理论课的基础上进行实验实习,是对本门课程的深入学习和掌握,在以后的工作学习中,数字信号的处理都是采用计算机仿真的方很大的帮助虽然《原DSP理及应用》这门课程的课时很短,但是通过本次课程设计使我对这门课程有了更深的了解,同时也学会了芯片的一些简单的编程和应用作为通信工程专业的C54x DSP学生,我相信这样一个课程设计对我们的发展有着极大的帮助!设计题目正弦波信号发生器设计目的学会使用集成开发环境软件,在此集成开发环境下完成CCS CodeComposer Studio工程项目创建,程序编写,编译,链接,调试以及数据的分析同时完成一个正弦波信号发生器的程序的编写,并在集成开发环境下进行模拟运行,观察结果设计内容编写一个产生正弦波信号的程序,在软件下进行模拟运行,观察输出结果CCS设计原理正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中通常有两种方法可以产生正弦波,分别为查表法和泰勒级数展开法查表法是通过查表的方式来实现正弦波,主要用于对精度要求不很高的场合泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间本次课程设计只要使用泰勒级数展开法来实现正弦波信号产生正弦波的算法
1.79X Xsinx=x---------13!5!7!9!X2X468X X---cosx=1-------1一16!8!2!4!在高等数学中,正弦函数和余弦函数可以展开成泰勒级数,其表达式为「79工1-14x5X2sinx=——+——=x1-%一2^31-^-6x73!5!7!9!x2X4X6X8x21—lb1一六COSX=1------------------------H12!4!6!8!若要计算一个角度的正弦和余弦值,可取泰勒级数的前项进行近似计算x5由上述两个式子可以推导出递推公式,即sinnx=2cosxsin[n-lx]-sin[n-2x]cosnx=2cosxsin[n-lx]-cos[n-2x]由递推公式可以看出,在计算正弦和余弦值时,不仅需要已知而且还需要cosx,和sin[n-lx]sin[n-2x]cos[n-2x]o正弦波的实现
2.⑴计算一个角度的正弦值利用泰勒级数的展开式,可计算一个角度的正弦值,并采用子程序的调用x方式在意用前先在数据存储器单元中存放的弧度值,计算结果存放在d_xs X dsinx单元中实现计算一个角度的正弦值的程序片段如下sinx:table_s.word01C7H;Cl=l/8*9;C
2.word030BH=l/6*7;.word0666H C3=l/4*5;C
4.word1556H=l/2*3d_coef_s.usect ncoefs”,4d_xs.usect Hsin_varsHJd_squr_xs.usect Hsin_vars\ld_temp_s.usect sinvarsn,ld_sinx.usect tf•nsin vars,d_l_s.usect tf•Ifsin vars,.textSSBX FRCT.def d_xs,d_sinx.dataSTM#d coefs,AR5;move coeffstable_sRPT#3MVPD#table_s,*AR5+STM#d_coeLs,AR3STM#d_xs,AR2STM#d_l_s,AR4ST#7FFFH,d1sSQUR*AR2+,A;A=xA2ST A,*AR2;AR2=xA2||LD*AR4,B;B=1MASR*AR2+,*AR3+,B,A;A=l-xA2/72,T=xA2MPYA A;A=T*A=A21-A2/72X XSTHA,*AR2;d_temp=xA21-xA2/72MASR*AR2-,*AR3+,B,A;A=1-xA2/42l-xA2/72;T=xA2lMPYA*AR2+-xA2/72;B=xA2l-xA2/42l-xA2/72ST B,*AR2;d_temp=xA2l-x2/421-x2/72八八||LD*AR4,B;B=1MASR*AR2-,*AR3+,B,A;A=1-xA2/20l・x2/421・x2/72八八MPYA*AR2+;B=xA21-xA2/201-xA2/421-xA2/72ST B,*AR2;d_temp=B||LD*AR4,B;B=1MASR*AR2-,*AR3,B,A;A=1-x2/61-x2/201-x2/421-x2/72八八八八MPYA d_xs;B=x1-x2/61-x2/201-x2/421-x^2/72八八八STH B,d_sinx;sinthetaRET⑵计算一个角度的余弦值利用余弦函数展开的泰勒级数的前五项计算一个角度的余弦值,可采用子程序的调用方式来实理调用前先将弧度值放在数据存储器单元中,计算结果存放在Xd_xc单元中d_cosx实现计算一个角度的余弦值的程序片段如下COS;AR2=xA2X;B=
1.def d_xc,d_cosx;A=l-xA2/56,T=xA2d_coeCc.usect Hcoef_cH,4;A=T*A=x21-x2/
56.data八八;d_temp=xA2l-xA2/56;Cl=l/7*8;C2table_c.word0249H;A=1-x2/301-x2/
56.word0444H=l/5*6;C3=l/八八;T=xA2l-xA2/
56.word OAABH3*4;C4=l/2;B=xA21-xA2/
301.word4000H-xA2/56d_xc.usect cosvarsH,ld_squr_xc.usect cosvarsn,l;d_temp x21-x2/301-x二八八d_temp_c.usect cosvarsn,l2/56八d_cosx.usect ncosvarsH,l;B=1c_l_c.usect ncos_varsn,l.textSSBX FRCT;move coeffstable_cSTM#d coefc,AR5RPT#3MVPD#table_c,*AR5+STM#d_coeLc,AR3STM#d xc,AR2STM#c1c,AR4ST#7FFFH,c c」_SQUR*AR2+,AST A,*AR2||LD*AR4,BMASR*AR2+,*AR3+,B,AMPYA ASTHA,*AR2MASR*AR2-,*AR3+,B,AMPYA*AR2+ST B,*AR2||LD*AR4,BMASR*AR2-,*AR3+,B,A;A=xA2;A=1-x2/121-x2/301-x八八八SFTA A,-\,A2/56;-1/2NEG AMPYA*AR2+;B=-xA2/2l-xA2/l2l-xA2/30l-x2/56八MAR*AR2+RETDADD*AR4/6,B;B=-xA2/2l-xA2/lSTH B,*AR22l-xA2/30l-xA2/56;costhetaRET⑶正弦波的实现利用计算一个角度的正弦值和余弦值程序可实现正弦波其实现步骤如下:第一步:利用和子程序,计算间隔为的正弦和余弦值;sin_start cos_start0〜
450.5°第二步利用公式,计算的正弦值间隔为;sin2x=2sinxcosx0〜901第三步通过复制,获得的正弦值;0°〜359°第四步将的正弦值重复从口输出,便可得到正弦波0〜359PA产生正弦波的程序片段如下.mmregs.def start.def d_xs,d_sinx,d_xc,d_cosx,sinx,cosxsin_x:.usect”sin_x”,36STACK:.usect“STACK”,10Hk_theta.set286;theta=pi/
3600.5degstart:.textSTM#STACK+10H,SPSTM k_theta,AROSTM O,AR1STM#sin_x,AR6STM#90,BRCRPTB loopl-1LDM ARI,ALD#d xs,DPSTL A,@d_xsSTL A,@d_xcCALL sinx;d_sinx=sinxCALL cosx;d_cosx=cosxLD#dsinx,DPLD@d_sinx,16,A;A=sinxMPYA@d_cosx;B=sinx*cosx;AR6——2STH BAR6+』,**sinxMAR*AR1+0STM#sin x+89,AR7loop1:;sin9ldeg.-sin179deg.STM#88,BRC产生正弦波RPTB loop2-l链接命令文件的程序片段如下:LD*AR7-,A STLMEMORYA,*AR6+STMIoop2:#179,BRC;sin180deg.-sin359deg.PAGE0:STM#sin x,AR7RPTB EPROM:org=0E000H,len=1000Hloop3-l LD*AR7+,A VECS:org=0FF80H,len=0080HNEG ASTL A,*AR6+SPRAM:org=0060H,len=0020HSTM#sin x,AR6STMDARAM1:org=0080H,len=0010H#1,ARO STM#360,BKDARAM2:org=0090H,len=0010Hloop3:B loop3generate sinwaveDARAM3:org=0200H,len=0200HSECTIONSPAGE1:.text:EPROM PAGEO.data:EPROM PAGEOSTACK:SPRAM PAGE1sin_vars:DAR AMIPAGE1coefLs:DAR AMIPAGE1cos_vars:DARAM2PAGE1coefLc:DARAM2PAGE1sin_x:.vectors:align512{}DARAM3PAGE1VECS PAGEO在实际应用中,正弦波是通过□输出的选择每个正弦周期中的样点数、改D/A变每个样点之间的延迟,就能够产生不同频率的波形,也可以利用软件改变波形的幅度以及起始相位总体方案设计总体实现方案
1.我们知道一个角度为的正弦和余弦函数,都可以展开为泰勒级数,且其前xX13579%22・/、X X XX1-^-4x51一目x工1-sinx=x---------------------------112x38x93!5!7!9!x2x4X6X8-Acosx=1---------+--------^1-—21—-1——6!8!I7x8;五项可以看为:本程序的编程思想是这样的,正弦波的波形可以看为由无数点组成,这些点与x轴的每一个角度值相对应,那么我们可以利用处理器处理大量重复计算的优势来DSP计算,轴每一点对应的轴的值在轴取个点来进行逼近,由于程序的编制采x yx360用小数形式,其弧度大于的正弦值得不到,这就对正弦波的产生造成了障碍可由1于正弦波的特殊的对称形式给程序的编制找到了出口的弧度为即%之间的任意正弦、余弦值可以利用汇编程sin%
0.78541,〜序得到乂可以利用公式得到%之间的正弦值而之间的正N sin2i=2sinicos〜0~%弦曲线与%%之间的正弦曲线通过%=%这条轴左右对称,那么就可以得到%万的正〜〜弦值,而〃的正弦曲线的相反数通过了=%这条轴与万万左右对称这样万0〜〜2〜2万的正弦值也得到了一个周期内完整的正弦波就得到了正弦波产生的流程图如下具体实现步骤
2.本课程设计需要使用汇编语言产生正弦波,并通过的图形显示工具观C54X CCS察波形设计分以下几步完成启动操作如下CCS,建立新的工程文件:点击保存文件名为
1.Projectf New,sinx.pjt建立汇编源程序点击菜单命令,打开一个空白文档,将汇编源
2.File-New-Source File程序逐条输入后,单击菜单命令,文件类型保存为(),单击“保存”按Flie-Save*.asm钮,以上汇编程序被存盘建立连接命令文件点击菜单命令,打开一个空白文档,将链接
3.File-New-Source File命令文件逐条输入后,单击菜单命令,文件类型保存为(礼),单击“保Flie-Save cmd存”按钮,以上链接命令文件被存盘选择菜单中的选项,将汇编源程序和链接定位
4.Project AddFile toProject sin.asm sin.cmd文件依次添加到工程文件中选择菜单中的选项,并选择项来修改或添加编译、连接中
5.Project Optionsbuild options使用的参数选择窗口,在栏中写入输出文件的名字,如Linker“Output Filename”OUT还可以设置生成的文件名sin.out,map完成汇编,编译和链接,正确产生.文件点击菜单中的请注意
6.out ProjectRebuild all,在监视窗口显示的汇编,编译和链接的相关信息如果没有错误,将产生文件;sin.out如果有错,在监视窗口以红色字体显示出错误行,用鼠标双击该行,光标跳将至源程序相应的出错行修改错误后,重新汇编链接在选项中打开文件,使用选项完成编译、连接
7.Project sin.pjt Build使用菜单中的将文件装入然后选择程序执行过程
8.File LoadProgram OUTDebugs Run,中可以使用暂停程序的执行:Debug-Halt选择-〉菜单打开一个图形显示窗口将项改
9.View Graph-Time/Frequency StartAddress”为地址将项设置为将项设置为sin_x,“Acquisition BufferSize”360,“Display DataSize”360,将改为“DSP DataType”“16-bit signedinteger”即将对话框改为见下图Graph PropertyDialog这样,将在图形显示窗口中显示从(首地址)开始的个点的位有sin_x36016符号整数的图形主要参数
1.sintheta=x1-x2/2*3l-x2/4*51-x2/6*71-x2/8*
92.costheta=l-x2/2*31-x2/4*51-x2/6*7l-x-2/8*
93.sin2*theta=2*sin thetaMos theta源程序产生正弦波程序清单
1.sin.asm.title〃.〃为汇编文件取名为“sin.asm”・mmregs•定义存储器映像寄存器.def cintOO定义标号.ref sinx,d_xs,d_sinx,cosx,d_xc,d_cosx;为〃〃保留个存储空间sin_x:.usect〃sin_x〃,360;sin_x360;为堆栈速留个存储空间STACK:.usect STACK,1010k_theta.set286;theta=pi/
3600.5degPAO.set0_c_int00;定义文本程序代码段.text;设置堆栈指针STM#STACK+10,SPSTM k_theta,ARO;ARO--K_thetaincrementSTM0,ARI;ARI=X radSTM#sin_x,AR6;AR6--sinxSTM#90,BRC;form sinOdeg.sin90deg;重复执行块语句下条语句开始至次loopl-191RPTB loopl-1LDM ARI,ALD#d_xs,DP;DPdxs低位STL A,@d_xs;A16f d_xs低位STL A,@d_xc;A16f d_xc;调用程序CALL sinxsinx;调用程序CALL cosxconxLD#d_sinx,DP;DP-d_sinxLD@d_sinx,16,A;A=sinxMPYA@d_cosx;B=sin xMos xSTHBJ*AR6+;AR6--2*sinx*cosx;修改辅助寄存器MAR*AR1+0ARIloopl:STM#sin_x+89,AR7;sin91deg.--sinl79deg.;重复执行下条指令至STM#88,BRC loop2TRPTB loop2-l;处次90然后减去LD*AR7-,A;AR7-A,AR71低位一STL A,*AR6+;A16AR6loop2:STM#179,BRC;sinl80deg.--sin359deg.。