DSP課程設(shè)計正弦波信號發(fā)生器報告_第1頁
DSP課程設(shè)計正弦波信號發(fā)生器報告_第2頁
DSP課程設(shè)計正弦波信號發(fā)生器報告_第3頁
DSP課程設(shè)計正弦波信號發(fā)生器報告_第4頁
DSP課程設(shè)計正弦波信號發(fā)生器報告_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

./DSP原理與應(yīng)用課程設(shè)計設(shè)計題目:正弦波信號發(fā)生器學(xué)校:學(xué)院:專業(yè)______同組人:、設(shè)計題目正弦波信號發(fā)生器設(shè)計目的學(xué)會使用CCS<CodeComposerStudio>集成開發(fā)環(huán)境軟件,在此集成開發(fā)環(huán)境下完成工程項目創(chuàng)建,程序編寫,編譯,,調(diào)試以與數(shù)據(jù)的分析。同時完成一個正弦波信號發(fā)生器的程序的編寫,并在集成開發(fā)環(huán)境下進(jìn)行模擬運(yùn)行,觀察結(jié)果。設(shè)計內(nèi)容編寫一個產(chǎn)生正弦波信號的程序,在CCS軟件下進(jìn)行模擬運(yùn)行,觀察輸出結(jié)果。設(shè)計原理正弦波信號發(fā)生器已被廣泛地應(yīng)用于通信、儀器儀表和工業(yè)控制等領(lǐng)域的信號處理系統(tǒng)中。通常有兩種方法可以產(chǎn)生正弦波,分別為查表法和泰勒級數(shù)展開法。查表法是通過查表的方式來實現(xiàn)正弦波,主要用于對精度要求不很高的場合。泰勒級數(shù)展開法是根據(jù)泰勒展開式進(jìn)行計算來實現(xiàn)正弦信號,它能精確地計算出一個角度的正弦和余弦值,且只需要較小的存儲空間。本次課程設(shè)計只要使用泰勒級數(shù)展開法來實現(xiàn)正弦波信號。1.產(chǎn)生正弦波的算法在高等數(shù)學(xué)中,正弦函數(shù)和余弦函數(shù)可以展開成泰勒級數(shù),其表達(dá)式為若要計算一個角度x的正弦和余弦值,可取泰勒級數(shù)的前5項進(jìn)行近似計算。由上述兩個式子可以推導(dǎo)出遞推公式,即sin<nx>=2cos<x>sin[<n-1>x]-sin[<n-2>x]cos<nx>=2cos<x>sin[<n-1>x]-cos[<n-2>x]由遞推公式可以看出,在計算正弦和余弦值時,不僅需要已知cos<x>,而且還需要sin[<n-1>x]、sin[<n-2>x]和cos[<n-2>x]。2.正弦波的實現(xiàn)=1\*GB2⑴計算一個角度的正弦值利用泰勒級數(shù)的展開式,可計算一個角度x的正弦值,并采用子程序的調(diào)用方式。在調(diào)用前先在數(shù)據(jù)存儲器d_xs單元中存放x的弧度值,計算結(jié)果存放在d_sinx單元中。實現(xiàn)計算一個角度的正弦值的程序片段如下:sinx:.defd_xs,d_sinx.datatable_s.word01C7H;C1=1/<8*9>.word030BH;C2=1/<6*7>.word0666H;C3=1/<4*5>.word1556H;C4=1/<2*3>d_coef_s.usect"coef_s",4d_xs.usect"sin_vars",1d_squr_xs.usect"sin_vars",1d_temp_s.usect"sin_vars",1d_sinx.usect"sin_vars",1d_l_s.usect"sin_vars",1.textSSBXFRCTSTM#d_coef_s,AR5;movecoeffstable_sRPT#3MVPD#table_s,*AR5+STM#d_coef_s,AR3STM#d_xs,AR2STM#d_l_s,AR4ST#7FFFH,d_l_sSQUR*AR2+,A;A=x^2STA,*AR2;<AR2>=x^2||LD*AR4,B;B=1MASR*AR2+,*AR3+,B,A;A=1-x^2/72,T=x^2MPYAA;A=T*A=x^2<1-x^2/72>STHA,*AR2;<d_temp>=x^2<1-x^2/72>MASR*AR2-,*AR3+,B,A;A=1-x^2/42<1-x^2/72>;T=x^2<1-x^2/72>MPYA*AR2+;B=x^2<1-x^2/42<1-x^2/72>>STB,*AR2;<d_temp>=x^2<1-x^2/42<1-x^2/72>>||LD*AR4,B;B=1MASR*AR2-,*AR3+,B,A;A=1-x^2/20<1-x^2/42<1-x^2/72>>MPYA*AR2+;B=x^2<1-x^2/20<1-x^2/42<1-x^2/72>>>STB,*AR2;<d_temp>=B||LD*AR4,B;B=1MASR*AR2-,*AR3,B,A;A=1-x^2/6<1-x^2/20<1-x^2/42<1-x^2/72>>>MPYAd_xs;B=x<1-x^2/6<1-x^2/20<1-x^2/42<1-x^2/72>>>>STHB,d_sinx;sin<theta>RET=2\*GB2⑵計算一個角度的余弦值利用余弦函數(shù)展開的泰勒級數(shù)的前五項計算一個角度的余弦值,可采用子程序的調(diào)用方式來實現(xiàn)。調(diào)用前先將x弧度值放在數(shù)據(jù)存儲器d_xc單元中,計算結(jié)果存放在d_cosx單元中。實現(xiàn)計算一個角度的余弦值的程序片段如下:cosx:.defd_xc,d_cosxd_coef_c.usect"coef_c",4.datatable_c.word0249H;C1=1/<7*8>.word0444H;C2=1/<5*6>.word0AABH;C3=1/<3*4>.word4000H;C4=1/2d_xc.usect"cos_vars",1d_squr_xc.usect"cos_vars",1d_temp_c.usect"cos_vars",1d_cosx.usect"cos_vars",1c_l_c.usect"cos_vars",1.textSSBXFRCTSTM#d_coef_c,AR5;movecoeffstable_cRPT#3MVPD#table_c,*AR5+STM#d_coef_c,AR3STM#d_xc,AR2STM#c_l_c,AR4ST#7FFFH,c_l_cSQUR*AR2+,A;A=x^2STA,*AR2;<AR2>=x^2||LD*AR4,B;B=1MASR*AR2+,*AR3+,B,A;A=1-x^2/56,T=x^2MPYAA;A=T*A=x^2〔1-x^2/56〕STHA,*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>>STB,*AR2;<d_temp>=x^2<1-x^2/30<1-x^2/56>>||LD*AR4,B;B=1MASR*AR2-,*AR3+,B,A;A=1-x^2/12<1-x^2/30<1-x^2/56>>SFTAA,-1,A;-1/2NEGAMPYA*AR2+;B=-x^2/2<1-x^2/12<1-x^2/30<1-x^2/56>>>MAR*AR2+RETDADD*AR4,16,B;B=-x^2/2<1-x^2/12<1-x^2/30<1-x^2/56>>>STHB,*AR2;cos<theta>RET=3\*GB2⑶正弦波的實現(xiàn)利用計算一個角度的正弦值和余弦值程序可實現(xiàn)正弦波。其實現(xiàn)步驟如下:第一步:利用sin_start和cos_start子程序,計算〔間隔為〕的正弦和余弦值;第二步:利用sin<2x>=2sin<x>cos<x>公式,計算的正弦值〔間隔為〕;第三步:通過復(fù)制,獲得的正弦值;第四步:將的正弦值重復(fù)從PA口輸出,便可得到正弦波。產(chǎn)生正弦波的程序片段如下:.mmregs.defstart.defd_xs,d_sinx,d_xc,d_cosx,sinx,cosxsin_x:.usect"sin_x",360STACK:.usect"STACK",10Hk_theta.set286;theta=pi/360<0.5deg>start:.textSTM#STACK+10H,SPSTMk_theta,AR0STM0,AR1STM#sin_x,AR6STM#90,BRCRPTBloop1-1LDMAR1,ALD#d_xs,DPSTLA,d_xsSTLA,d_xcCALLsinx;d_sinx=sin<x>CALLcosx;d_cosx=cos<x>LD#d_sinx,DPLDd_sinx,16,A;A=sin<x>MPYAd_cosx;B=sin<x>*cos<x>STHB,1,*AR6+;AR62*sin<x>MAR*AR1+0loop1:STM#sin_x+89,AR7;sin91<deg.>-sin179<deg.>STM#88,BRCRPTBloop2-1LD*AR7-,ASTLA,*AR6+loop2:STM#179,BRC;sin180<deg.>-sin359<deg.>STM#sin_x,AR7RPTBloop3-1LD*AR7+,ANEGASTLA,*AR6+loop3:STM#sin_x,AR6;generatesinwaveSTM#1,AR0STM#360,BKBloop3產(chǎn)生正弦波命令文件的程序片段如下:MEMORY{PAGE0:EPROM:org=0E000H,len=1000HVECS:org=0FF80H,len=0080HPAGE1:SPRAM:org=0060H,len=0020HDARAM1:org=0080H,len=0010HDARAM2:org=0090H,len=0010HDARAM3:org=0200H,len=0200H}SECTIONS{.text:>EPROMPAGE0.data:>EPROMPAGE0STACK:>SPRAMPAGE1sin_vars:>DARAM1PAGE1coef_s:>DARAM1PAGE1cos_vars:>DARAM2PAGE1coef_c:>DARAM2PAGE1sin_x:align<512>{}>DARAM3PAGE1.vectors:>VECSPAGE0}在實際應(yīng)用中,正弦波是通過D/A口輸出的。選擇每個正弦周期中的樣點數(shù)、改變每個樣點之間的延遲,就能夠產(chǎn)生不同頻率的波形,也可以利用軟件改變波形的幅度以與起始相位??傮w方案設(shè)計1.總體實現(xiàn)方案我們知道一個角度為x的正弦和余弦函數(shù),都可以展開為泰勒級數(shù),且其前五項可以看為:本程序的編程思想是這樣的,正弦波的波形可以看為由無數(shù)點組成,這些點與軸的每一個角度值相對應(yīng),那么我們可以利用DSP處理器處理大量重復(fù)計算的優(yōu)勢來計算,軸每一點對應(yīng)的y軸的值〔在x軸取360個點來進(jìn)行逼近〕,由于程序的編制采用小數(shù)形式,其弧度大于1的正弦值得不到,這就對正弦波的產(chǎn)生造成了障礙??捎捎谡也ǖ奶厥獾膶ΨQ形式給程序的編制找到了出口。的弧度為0.7854<1,即之間的任意正弦、余弦值可以利用匯編程序得到N又可以利用公式:得到之間的正弦值。而之間的正弦曲線與之間的正弦曲線通過這條軸左右對稱,那么就可以得到的正弦值,而的正弦曲線的相反數(shù)通過這條軸與左右對稱。這樣的正弦值也得到了。一個周期內(nèi)完整的正弦波就得到了。正弦波產(chǎn)生的流程圖如下:得到余弦值得到正弦值得到余弦值得到正弦值sinsin2a=2sinacosa得到得到的值得到得到的值得到的值得到的值得到得到的值循環(huán)輸出數(shù)據(jù)循環(huán)輸出數(shù)據(jù)2.具體實現(xiàn)步驟本課程設(shè)計需要使用C54X匯編語言產(chǎn)生正弦波,并通過CCS的圖形顯示工具觀察波形。設(shè)計分以下幾步完成:啟動CCS,操作如下:1.建立新的工程文件:點擊Project→New,保存文件名為sinx.pjt。2.建立匯編源程序:點擊File→New→SourceFile菜單命令,打開一個空白文檔,將匯編源程序逐條輸入后,單擊Flie→Save菜單命令,文件類型保存為〔*.asm〕,單擊"保存"按鈕,以上匯編程序被存盤。3.建立連接命令文件:點擊File→New→SourceFile菜單命令,打開一個空白文檔,將命令文件逐條輸入后,單擊Flie→Save菜單命令,文件類型保存為〔*.cmd〕,單擊"保存"按鈕,以上命令文件被存盤。4.選擇Project菜單中的AddFiletoProject選項,將匯編源程序sin.asm和定位sin.cmd文件依次添加到工程文件中。5.選擇Project菜單中的Options選項,并選擇buildoptions項來修改或添加編譯、連接中使用的參數(shù)。選擇Linker窗口,在"OutputFilename"欄中寫入輸出OUT文件的名字,如sin.out,還可以設(shè)置生成的map文件名。6.完成匯編,編譯和,正確產(chǎn)生.out文件:點擊Project菜單中的Rebuildall,請注意在監(jiān)視窗口顯示的匯編,編譯和的相關(guān)信息。如果沒有錯誤,將產(chǎn)生sin.out文件;如果有錯,在監(jiān)視窗口以紅色字體顯示出錯誤行,用鼠標(biāo)雙擊該行,光標(biāo)跳將至源程序相應(yīng)的出錯行。修改錯誤后,重新匯編。7.在Project選項中打開sin.pjt文件,使用Build選項完成編譯、連接。8.使用File菜單中的LoadProgram將OUT文件裝入。然后選擇Debug→Run,程序執(zhí)行過程中可以使用Debug→Halt暫停程序的執(zhí)行。9.選擇View->Graph->Time/Frequency菜單打開一個圖形顯示窗口。將"StartAddress"項改為地址sin_x,將"AcquisitionBufferSize"項設(shè)置為360,將"DisplayDataSize"項設(shè)置為360,將"DSPDataType"改為"16-bitsignedinteger"。即將GraphPropertyDialog對話框改為見下圖:這樣,將在圖形顯示窗口中顯示從sin_x〔首地址〕開始的360個點的16位有符號整數(shù)的圖形。主要參數(shù)1.sin<theta>=x<1-x^2/2*3<1-x^2/4*5<1-x^2/6*7<1-x^2/8*9>>>>2.cos<theta>=1-x^2/2*3<1-x^2/4*5<1-x^2/6*7<1-x^2/8*9>>>3.sin<2*theta>=2*sin<theta>*cos<theta>源程序1.產(chǎn)生正弦波程序清單sin.asm:.title"sin.asm";為匯編文件取名為"sin.asm".mmregs;定義存儲器映像寄存器.def_c_int00.refsinx,d_xs,d_sinx,cosx,d_xc,d_cosx;定義標(biāo)號sin_x:.usect"sin_x",360;為"sin_x"保留360個存儲空間STACK:.usect"STACK",10;為堆棧保留10個存儲空間k_theta.set286;theta=pi/360<0.5deg>PA0.set0_c_int00.text;定義文本程序代碼段STM#STACK+10,SP;設(shè)置堆棧指針STMk_theta,AR0;AR0-->K_theta<increment>STM0,AR1;<AR1>=X<rad>STM#sin_x,AR6;AR6-->sin<x>STM#90,BRC;formsin0<deg.>—sin90<deg>;重復(fù)執(zhí)行塊語句〔下條語句開始至loop1-1〕91次RPTBloop1-1LDMAR1,ALD#d_xs,DP;DPd_xsSTLA,d_xs;<A>低16位→d_xsSTLA,d_xc;<A>低16位→d_xcCALLsinx;調(diào)用sinx程序CALLcosx;調(diào)用conx程序LD#d_sinx,DP;DPd_sinxLDd_sinx,16,A;A=sin<x>MPYAd_cosx;B=sin<x>*cos<x>STHB,1,*AR6+;AR6-->2*sin<x>*cos<x>MAR*AR1+0;修改輔助寄存器AR1loop1:STM#sin_x+89,AR7;sin91<deg.>--sin179<deg.>STM#88,BRC;重復(fù)執(zhí)行下條指令至loop2-1RPTBloop2-1;處90次LD*AR7-,A;<<AR7>>→A,然后AR7減去1STLA,*AR6+;<A>低16位→AR6loop2:STM#179,BRC;sin180<deg.>--sin359<deg.>;<BRC>=179,重復(fù)執(zhí)行180次STM#sin_x,AR7;AR7指向sin_x首地址RPTBloop3-1;LD*AR7+,A;<<AR7>>→A,然后AR7加1NEGA;累加器變負(fù)STLA,*AR6+;A低16位→AR6loop3:STM#sin_x,AR6;generatesinwaveAR6指向sin_xSTM#1,AR0;AR01STM#360,BK;BK360loop4:PORTW*AR6+0%,PA0;PA0=*AR6+0%,向PA0輸出數(shù)據(jù)Bloop4;sinx:.defd_xs,d_sinx;定義標(biāo)號d_xs,d_sinx.data;定義數(shù)據(jù)代碼段table_s.word01c7h;c1=1/<8*9>.word030bh;c1=1/<6*7>.word0666h;c1=1/<4*5>.word1556h;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_squr_xs中sin_vars保留1個存儲空間d_temp_s.usect"sin_vars",1;為d_temp_s中sin_vars保留1個存儲空間d_sinx.usect"sin_vars",1;為d_sinx中sin_vars保留1個存儲空間c_l_s.usect"sin_vars",1;為d_xs中sin_vars保留1個存儲空間.text;定義代碼開始段SSBXFRCT;設(shè)置FRCT=1以解決冗余符號位STM#d_coef_s,AR5;AR5指向d_coef_s首地址RPT#3;重復(fù)下條指令4次MVPD#table_s,*AR5+;table_s中的數(shù)復(fù)制到AR5指向的單元STM#d_coef_s,AR3;AR3指向d_coef_s首地址STM#d_xs,AR2;AR2指向d_xs首地址STM#c_l_s,AR4;AR4指向c_l_s首地址ST#7FFFh,c_l_s;7FFFh→c_l_sSQUR*AR2+,A;AR2指向累加器A中的數(shù)值求其平方STA,*AR2;〔A〕左移16位→AR2||LD*AR4,B;〔AR4〕左移16位→BMASR*AR2+,*AR3+,B,A;從累加器A中減去〔AR2〕*〔AR3〕MPYAA;操作數(shù)與累加器A中高位相乘STHA,*AR2;〔A〕高16位→AR2MASR*AR2-,*AR3+,B,A;從累加器A中減去〔AR2〕*〔AR3〕MPYA*AR2+;AR2指向的數(shù)與累加器A的高16位相乘STB,*AR2;〔B〕左移16位→AR2||LD*AR4,B;〔AR4〕左移16位→BMASR*AR2-,*AR3+,B,A;從累加器A中減去〔AR2〕*〔AR3〕MPYA*AR2+;與累加器A中高16位相乘STB,*AR2;〔B〕左移16位→AR2||LD*AR4,B;〔AR4〕左移16位→BMASR*AR2-,*AR3+,B,A;從累加器A中減去〔AR2〕*〔AR3〕MPYAd_xs;d_xs指向的操作數(shù)與累加器A中高16位相乘STHB,d_sinx;〔B〕高16位→d_sinxRET;返回cosx:.defd_xc,d_cosx;定義標(biāo)號d_xc,d_cosxd_coef_c.usect"coef_c",4;為coef_c保留4個存儲空間.data;定義數(shù)據(jù)代碼段table_c.word0249h;c1=1/<7*8>.word0444h;c2=1/<6*5>.word0aabh;c3=1/<3*4>.word4000h;c4=1/2d_xc.usect"cos_vars",1;為d_xc中cos_vars保存1個存儲單元d_squr_xc.usect"cos_vars",1;為d_squr_xc中cos_vars保存1個存儲單元d_temp_c.usect"cos_vars",1;為d_temp_c中cos_vars保存1個存儲單元d_cosx.usect"cos_vars",1;為d_cosx中cos_vars保存1個存儲單元c_l_c.usect"cos_vars",1;為c_l_c中cos_vars保存1個存儲單元.text;定義文本代碼段SSBXFRCT;FRCT=1以清除冗余符號位STM#d_coef_c,AR5;AR5指向d_coef_c首地址RPT#3;重復(fù)下條指令4次MVPD#table_c,*AR5+;把table_c中的數(shù)復(fù)制到中AR5STM#d_coef_c,AR3;AR3指向d_coef_c首地址STM#d_xc,AR2;AR2指向d_xc首地址STM#c_l_c,AR4;AR4指向c_l_c首地址ST#7FFFh,c_l_c;7FFFh→c_l_cSQUR*AR2+,A;求X的平方存放在累加器A中STA,*AR2;〔A〕左移16位→AR2||LD*AR4,B;〔AR4〕左移16位→BMASR*AR2+,*AR3+,B,A;A=1-x^2/56,T=x^2MPYAA;A=T*A=x^2<1-x^2/56>STHA,*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>>STB,*AR2;<d_temp>=x^2<1-x^2/30<1-x^2/56>>||LD*AR4,B;B=1MASR*AR2-,*AR3+,B,A;A=1-x^2/12<1-x^2/30<1-x^2/56>>SFTAA,-1,A;-1/2NEGA;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>>>STHB,*AR2;cos<theta>RET;.end;2.*.cmd文件描述輸入文件和輸出文件,說明系統(tǒng)中有哪些可用存儲器、程序段、堆棧與復(fù)位向量和中斷向量等安排在什么地方。其中MEMORY段就是用來規(guī)定目標(biāo)存儲器的模型,通過這條指令,可以定義系統(tǒng)中所包含的各種形式的存儲器,以與它們占據(jù)的地址X圍;SECTIONS段說明如何將輸入段組合成輸出段以與在可執(zhí)行文件中定義輸出段、規(guī)定輸出段在存儲器中的位置等。正弦波程序命令文件sin.cmd:MEMORY{PAGE0:EPROM:org=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論