dsp課程設(shè)計--多波形信號發(fā)生器_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  DSP課程設(shè)計報告</b></p><p>  ——多波形信號發(fā)生器</p><p><b>  目 錄</b></p><p><b>  一、實驗?zāi)康?</b></p><p><b>  二、實驗內(nèi)容3</b>&l

2、t;/p><p><b>  三、實驗原理3</b></p><p>  1.產(chǎn)生連續(xù)的波形的方法3</p><p>  1.1 查表法:3</p><p><b>  1.2計算法:3</b></p><p>  2. TLV320AIC23B的內(nèi)部結(jié)構(gòu)及工作原理4&

3、lt;/p><p><b>  四、程序設(shè)計5</b></p><p><b>  五、程序調(diào)試11</b></p><p><b>  1、編譯過程11</b></p><p>  2、.cmd程序(5502.cmd)全文及其解釋:11</p><p&

4、gt;  3、程序運行結(jié)果(圖形和數(shù)據(jù)顯示):13</p><p>  六、硬件輸出演示:16</p><p>  七、實驗感想與體會18</p><p><b>  八、參考文獻18</b></p><p><b>  一、實驗?zāi)康?lt;/b></p><p>  1.

5、學(xué)習并掌握D/A轉(zhuǎn)換器的初始化設(shè)置及其應(yīng)用</p><p>  2.學(xué)習并掌握使用DSP產(chǎn)生正弦波的原理和算法,進而掌握任意信號波形(如三角波、鋸齒波、矩形波等信號)產(chǎn)生的原理和算法。</p><p>  3.比較產(chǎn)生信號的兩種主要方法(查表法和計算法)的優(yōu)缺點。</p><p>  4.熟練使用軟件CCS3.3對程序的完整調(diào)試過程。</p><

6、p><b>  二、實驗內(nèi)容</b></p><p>  使用DSP產(chǎn)生300~16000Hz的正弦、方波、鋸齒波和三角波信號,輸出信號的幅度從0~1Vrms(有效值)。要求使用計算法,并且頻率可變、幅度可變。 </p><p>  本實驗要求用軟件CCS3.3編程實現(xiàn),并與硬件連接進行功能演示。</p><p><b>  

7、三、實驗原理</b></p><p>  1.產(chǎn)生連續(xù)的波形的方法</p><p><b>  1.1 查表法:</b></p><p>  把事先將需要輸出的數(shù)據(jù)計算好,存儲在DSP中,然后依次輸出就可以了。查表法的優(yōu)點是速度快,可以產(chǎn)生頻率較高的波形,而且不占用DSP的計算時間;查表法的缺點在于需要占用DSP的內(nèi)部的存儲空間,尤

8、其對采樣頻率比較大的輸出波形,這樣,需要占用的內(nèi)部的空間將更大,而DSP內(nèi)部的存儲空間畢竟有所限制。這使得查表法的應(yīng)用場合十分有限。 </p><p><b>  1.2計算法:</b></p><p>  采用計算的方法依次計算數(shù)據(jù)而后輸出,然后再計算而后輸出。計算法的優(yōu)缺點正好和查表法相反。即:其優(yōu)點是不占用DSP的存儲空間,其缺點是占用DSP的計算時間,使得執(zhí)行

9、程序的開銷變大。本實驗將用第二種方法即計算法產(chǎn)生一個正弦波信號,從DA輸出。由余弦信號的遞推公式: </p><p>  得知:如果需要產(chǎn)生連續(xù)的余弦信號,必須知道首先兩個余弦值的大小,然后就可以利用上式計算出后面的數(shù)據(jù),這就是下面編程依據(jù)的核心算法。 </p><p>  正弦函數(shù)和余弦函數(shù)的泰勒級數(shù)數(shù)學(xué)表達式為:</p><p><b>  ,<

10、/b></p><p><b>  ,.</b></p><p>  如果要計算一個角度ⅹ的正弦和余弦值,可以取其前五項進行近似計算。</p><p>  也可以用遞推公式求正弦和余弦值:</p><p>  利用遞推公式計算正弦和余弦值需已知cos(x)、sin(n-1)x、sin(n-2)x和cos(n-2)x

11、的值。用這種方法,求少數(shù)點可以,如產(chǎn)生連續(xù)正弦、余弦波,則累積誤差太大,不可取。</p><p>  最終產(chǎn)生信號的頻率為f0=fs/N,其中N為抽樣點數(shù)。</p><p>  2. TLV320AIC23B的內(nèi)部結(jié)構(gòu)及工作原理</p><p>  TLV320AIC23B是TI公司生產(chǎn)的高性能語音CODEC芯片,16、20、24、32位串行A/D、D/A轉(zhuǎn)換電路。

12、</p><p>  采樣速率:可通過DSP編程來設(shè)置,范圍8KHz~96KHz。 </p><p>  內(nèi)含抗混疊濾波器和重構(gòu)濾波器。</p><p>  //AIC23波特率設(shè)置,CLKIN=CLKOUT=MCLK,采樣率32KHz,時鐘模式為普通模式, </p><p>  Uint16 Sample_Rate_Control[2] =

13、 {</p><p>  Codec_SRC_REV, </p><p>  SRC_CLKIN(0)+SRC_CLKOUT(0)+SRC_SR(6)</p><p>  +SRC_BOSR(0)+SRC_USB(0)</p><p><b>  }; </b></p><p>  在AIC23中

14、設(shè)置如下:</p><p>  // AIC23的波特率設(shè)置,采樣率為32k,CLKIN=CLKOUT=MCLK</p><p>  // 時鐘模式設(shè)為普通模式,基過采樣率為250Fs</p><p><b>  //96k 7</b></p><p><b>  //48k 0</b></p

15、><p><b>  //32k 6</b></p><p><b>  //8k 3</b></p><p>  Uint16 Sample_Rate_Control[2] = { </p><p>  Codec_SRC_REV,</p><p>  SRC_

16、CLKIN(0)+SRC_CLKOUT(0)+SRC_SR(6)+SRC_BOSR(0)+SRC_USB(0)};</p><p>  本報告中所有程序的采樣頻率波特率均為32000Hz</p><p><b>  四、程序設(shè)計 </b></p><p>  我們的設(shè)計圍繞要求展開,需要實現(xiàn)的基本功能為:</p><p>

17、;  產(chǎn)生正弦、方波、三角波、鋸齒波四種波形</p><p>  波形幅度、頻率可借助GEL的slider調(diào)整</p><p>  通過對GEL的學(xué)習,我們發(fā)現(xiàn)其slider也可以實現(xiàn)選擇波形,于是整個演示過程就不需要切換程序了。</p><p>  主程序設(shè)計思路如下圖:</p><p><b>  代碼:</b>&l

18、t;/p><p>  #include <math.h></p><p>  #include <stdio.h></p><p>  #include <csl.h></p><p>  #include <csl_chip.h></p><p>  #include &l

19、t;csl_i2c.h></p><p>  #include <csl_pll.h></p><p>  #include <csl_mcbsp.h></p><p>  #include <csl_emif.h></p><p>  #include <csl_emifBhal.h>&

20、lt;/p><p>  #include <stdio.h></p><p>  //#include "E2PROM_Function.h"</p><p>  #include "CODEC.h"</p><p>  #define Nx 360 //每周期抽取點數(shù)&

21、lt;/p><p>  #pragma DATA_SECTION(output1,"data_out1"); //存放sin數(shù)據(jù),浮點型</p><p>  float output1[Nx]; </p><p>  #pragma DATA_SECTION(output2,"data_out2"); //存放sin數(shù)

22、據(jù),浮點型</p><p>  float output2[Nx]; </p><p>  #pragma DATA_SECTION(output3,"data_out3"); //存放sin數(shù)據(jù),浮點型</p><p>  float output3[Nx]; </p><p>  #pragma DATA_SEC

23、TION(output4,"data_out4"); //存放sin數(shù)據(jù),浮點型</p><p>  float output4[Nx]; </p><p>  #pragma DATA_SECTION(output,"data_out"); //存放sin數(shù)據(jù),定點型</p><p>  int output[

24、Nx],gain=1,gainnew=0,frq=300,wave=1; </p><p>  #undef CODEC_ADDR</p><p>  #define CODEC_ADDR 0x1A</p><p>  // 定義McBSP的句柄</p><p>  MCBSP_Handle hMcbsp;</p><p

25、>  /*------------------------------------------------------------------------------------*/</p><p><b>  //</b></p><p>  // FUNCTION: MAIN</p><p><b>  //</b&g

26、t;</p><p>  /*------------------------------------------------------------------------------------*/</p><p>  void main(void)</p><p><b>  {</b></p><p>  Uin

27、t16 i=0,k=0;</p><p>  float input0=0,x1;</p><p>  float a,b,c,d,e,f,g,h,ii,step;//step為角度步長 </p><p>  step=360.0/Nx; // Nx為360度內(nèi)取樣點數(shù)</p><p>  /********

28、*********新增函數(shù)段*****************/</p><p>  for(i=0;i<=Nx-1;i++) </p><p><b>  {</b></p><p>  float angle,xx;</p><p>  angle=input0+step*i;</p><p

29、>  x1=3.1415926*angle/180; </p><p><b>  xx=x1*x1;</b></p><p>  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*

30、h;</p><p>  // 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/17))))))));//數(shù)學(xué)總公式</p><p>  // fprintf(stdout,"COMPUTE%f",ii); fprintf(stdout,&

31、quot;\n "); //輸出計算的正弦波的數(shù)值,x2=e</p><p>  output1[i]= 32767*ii; //利用泰勒級數(shù)計算出正弦波的數(shù)值,存放到output1中</p><p>  // output[i]=gain*output1[i]/1024;</p><p>  }

32、// 正弦波</p><p>  output2[0]=0; </p><p>  for(i=0;i<=(Nx-1)/2;i++)</p><p><b>  {</b></p><p>  output2[i+1]=output2[i]+2;</p><p><b>  }&

33、lt;/b></p><p>  for(i=(Nx+1)/2;i<=(Nx-1);i++)</p><p><b>  {</b></p><p>  output2[i+1]=output2[i]-2;</p><p>  } // 三角波</p>

34、<p>  for(i=0;i<=(Nx-1)/2;i++)</p><p><b>  {</b></p><p>  output3[i]=500;</p><p><b>  }</b></p><p>  for(i=(Nx+1)/2;i<=(Nx-1);i++)<

35、;/p><p><b>  {</b></p><p>  output3[i]=0;</p><p>  } // 方波</p><p>  output4[0]=0;</p><p>  for(i=0;i<=(Nx-1);i++)</p>

36、;<p><b>  {</b></p><p>  output4[i+1]=output4[i]+2;</p><p><b>  }</b></p><p>  // Initialize CSL library - This is REQUIRED !!! </p><p> 

37、 CSL_init();</p><p>  // The main frequency of system is 240MHz</p><p>  // 該頻率是為了設(shè)置IIC模塊的需要設(shè)置的,為了使用I2C_setup函數(shù)</p><p>  PLL_setFreq(1, 0xC, 0, 1, 3, 3, 0);</p><p><

38、b>  //EMIF初始化</b></p><p>  Emif_Config(); </p><p>  // Open McBSP port 1 and get a McBSP type handle</p><p>  hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);</p>

39、<p>  // Config McBSPport 1 by use previously defined structure</p><p>  Mcbsp_Config(hMcbsp);</p><p><b>  //I2C初始化</b></p><p>  I2C_cofig(); </p><p>

40、  //CODEC寄存器初始化</p><p>  inti_AIC(); </p><p>  /*------------------------------------------------------------------------------------*/ </p><p>  // Receive the ADC

41、 output data of CODEC </p><p>  // Then output the received data to DAC of CODEC </p><p>  /*------------------------------------------------------------------------------------*/</p>&l

42、t;p><b>  while(1)</b></p><p><b>  {</b></p><p>  if(wave==1)</p><p><b>  {</b></p><p>  if(gain!=gainnew)</p><p><

43、;b>  {</b></p><p>  for(i=0;i<Nx;i++)</p><p><b>  {</b></p><p>  output[i]=gain*output1[i]/204800;</p><p><b>  }</b></p><

44、p>  gainnew=gain;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(wave==2)</p><p><b>  {</b></p><p>  if(gain!=

45、gainnew)</p><p><b>  {</b></p><p>  for(i=0;i<Nx;i++)</p><p><b>  {</b></p><p>  output[i]=gain*output2[i]/1024;</p><p><b>

46、;  }</b></p><p>  gainnew=gain;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(wave==3)</p><p><b>  {</b>&l

47、t;/p><p>  if(gain!=gainnew)</p><p><b>  {</b></p><p>  for(i=0;i<Nx;i++)</p><p><b>  {</b></p><p>  output[i]=gain*output3[i]/1024

48、;</p><p><b>  }</b></p><p>  gainnew=gain;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else(wave==4);</p><p

49、><b>  {</b></p><p>  if(gain!=gainnew)</p><p><b>  {</b></p><p>  for(i=0;i<Nx;i++)</p><p><b>  {</b></p><p>  ou

50、tput[i]=gain*output4[i]/1024;</p><p><b>  }</b></p><p>  gainnew=gain;</p><p><b>  }</b></p><p><b>  }</b></p><p>  whi

51、le(!MCBSP_xrdy(hMcbsp)) {};</p><p>  MCBSP_write16(hMcbsp, output[k]);</p><p>  while(!MCBSP_xrdy(hMcbsp)) {};</p><p>  MCBSP_write16(hMcbsp, output[k]);</p><p>  k=k+(

52、frq/88.235);</p><p>  if (k>=Nx) k=k%Nx;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  GEL文件如下:</b></p><p>  Volum

53、e.gel</p><p><b>  /*</b></p><p>  * Copyright 1998 by Texas Instruments Incorporated.</p><p>  * All rights reserved. Property of Texas Instruments Incorporated.</p

54、><p>  * Restricted rights to use, duplicate or disclose this code are</p><p>  * granted through contract.</p><p><b>  */</b></p><p>  /* ======== volume.ge

55、l ========*/</p><p>  menuitem "Application Control"</p><p>  slider Gain(0,1000,1,1, gainParm)</p><p><b>  {</b></p><p>  gain = gainParm;</p&

56、gt;<p><b>  }</b></p><p>  menuitem "Application Control"</p><p>  slider Frq(300,16000,100,100, frqParm)</p><p><b>  {</b></p><p

57、>  frq = frqParm;</p><p><b>  }</b></p><p>  menuitem "Application Control"</p><p>  slider Wave(1,4,1,1, waveParm)</p><p><b>  {</b&g

58、t;</p><p>  wave = waveParm;</p><p><b>  }</b></p><p><b>  五、程序調(diào)試</b></p><p><b>  1、編譯過程</b></p><p>  在編譯程序之前,還要做一些準備工作

59、,即這項工程的文件添加等。如library的庫文件就需要自己從TI(或CCS5000)文件夾中尋找添加:</p><p>  csl5502x.lib是軟件仿真所用的仿真器所必需的庫文件;</p><p>  rts55x.lib,這個庫提供目標DSP運行時間支持(runtime-support)。 </p><p>  2、.cmd程序(5502.cmd)全文及其

60、解釋:</p><p>  2.1 .cmd文件類型及作用:</p><p>  .cmd是鏈接器命令文件,用于存儲器配置。</p><p>  2.2 .cmd文件結(jié)構(gòu):</p><p>  .cmd由兩條鏈接偽指令來描述:MEMORY 和SECTIONS,其中:</p><p>  MEMORY定義用戶目標系統(tǒng)存儲

61、器的配置;</p><p>  SECTIONS控制段的構(gòu)建和存儲器的分配。 </p><p>  首先存儲器空間是需要配置的,因為DSP不同的空間占用相同的地址,因此需要人工分配。 </p><p>  2.3 5502.cmd全文及其解釋如下:</p><p><b>  MEMORY</b></p>

62、<p><b>  {</b></p><p>  MMR : origin = 0000000h, length = 00000c0h </p><p>  SPRAM : origin = 00000c0h, length = 0000040</p><p>  VECS : origin = 0000100h,

63、 length = 0000100h</p><p>  DARAM0 : origin = 0000200h, length = 0007E00h</p><p>  DARAM1 : origin = 0008000h, length = 0008000h</p><p>  CE0 : origin = 0010000h, length = 03f

64、0000h /* 對應(yīng)ZBTRAM空間 */</p><p>  FLASH : origin = 0400000h, length = 0100000h/* Flash 空間 */</p><p>  /* FLASH : origin = 0410000h, length = 00f0000h*/</p><p>  EXTEND:

65、origin = 0500000h, length = 0300000h/* 狀態(tài)/控制寄存器、UARTA、UARTB、USB、和擴展總線所對應(yīng)的空間 */</p><p>  SDRAM : origin = 0800000h, length = 03FFFFCh/* SDRAM 空間*/</p><p>  CE3 : origin = 0c00000h, length

66、 = 03f8000h/* SDRAM 空間*/</p><p>  PDROM : origin = 0ff8000h, length = 07f00h</p><p>  RESET_VECS : origin = 0ffff00h, length = 000ffh /* reset vector */</p><p><b>  }

67、 </b></p><p><b>  SECTIONS</b></p><p><b>  {</b></p><p>  .vectors : {} > VECS /* interrupt vector table */</p><p>  .cini

68、t : {} > DARAM1 /*把.cinit輸出段分配到DARAM1中的*/</p><p>  .text : {} > DARAM1 </p><p>  .Audio_in_data1: {}> SDRAM</p><p>  .Audio_in_data2: {}> SDRAM</p>&l

69、t;p>  .Audio_in_data3: {}> SDRAM</p><p>  .Audio_out_data1: {} > SDRAM </p><p>  .Audio_out_data2: {} > SDRAM</p><p>  .Audio_out_data3: {} > SDRAM</p><p&

70、gt;  data_out : {} > SDRAM</p><p>  data_out1 : {} > SDRAM</p><p>  /*以上對應(yīng)主程序部分*/</p><p>  .stack : {} > DARAM0</p><p>  .sysstack: {} > DARAM0 </p>

71、<p>  .sysmem : {} > DARAM0 </p><p>  .cio : {} > DARAM1 </p><p>  .data : {} > DARAM1 </p><p>  .bss : {} > DARAM1 </p><p>  .const :

72、{} > DARAM1 </p><p>  .csldata: {} > DARAM0 </p><p>  dmaMem: {} > DARAM0 </p><p><b>  }</b></p><p>  根據(jù)上面的具體文件作以下補充:</p><p>  se

73、ctions是COFF文件中最重要的概念,它至少包含以下三個段:</p><p>  .text 段:包含可執(zhí)行代碼;</p><p>  .data 段:包含初始化數(shù)據(jù);</p><p>  .bss 段: 為未初始化變量保留存儲空間。其他為自定義段(或匯編器生成段),如:.usect段,.sect段,.cinit段等。 </p><p&g

74、t;  初始化代碼段:包含數(shù)據(jù)或可執(zhí)行代碼,C/C++ compiler 產(chǎn)生下面的初始化段:</p><p>  .cinit 段:包含初始化變量表和常數(shù),C/C++ 的全局變量;</p><p>  .const 段:包含由C/C++限定的字符串常數(shù)和數(shù)據(jù);</p><p>  (假如 constant也不是定義為 volatile).</p>

75、<p>  .text 段:包含所有的可執(zhí)行代碼,還有字符串匯編產(chǎn)生的常數(shù)。</p><p>  .cmd文件的細節(jié)問題:</p><p>  未初始化段:存儲器中的保留空間(通常是RAM)。程序可以在運行時使用這個空間,建立和存儲變量。</p><p>  匯編器compiler 建立如下未初始化段:</p><p>  .

76、bss段:為global and static variables保留空間。當使用-c 鏈接選項,程序啟動時,C/C++ boot 程序?qū)?cinit段的數(shù)據(jù)拷出,存到.bss段中。</p><p>  .stack 段:為C/C++系統(tǒng)堆棧system stack分配存儲器,其存儲器可以傳送變量。 </p><p>  1、鏈接命令語言是ASCII碼形式的文件。它支持C語言的“/

77、* */”作為注釋,但不支持“//”。</p><p>  2、鏈接命令文件中的常數(shù)可以采用匯編語言格式,也可以采用C語言格式,或者混用。</p><p>  3、程序運行結(jié)果(圖形和數(shù)據(jù)顯示): </p><p>  加載Volume.gel打開三個slider顯示如圖:</p><p>  編譯成功后,選擇File菜單中的Load Pr

78、ogram選項。</p><p><b>  3.1 圖形顯示:</b></p><p>  選擇View中的Graph的第一項,修改項如圖所示:</p><p>  圖形顯示參數(shù)界面及其修改</p><p> ?。?)、Start Address:</p><p>  該選項是選擇圖像的輸出從哪

79、個變量的地址開始,在本程序中為output,是軟件仿真和硬件演示的數(shù)據(jù)出口;</p><p> ?。?)、Acquisition Buffer Size/Display Data Size:</p><p>  這兩個數(shù)值用于設(shè)置輸出函數(shù)畫出的點數(shù),通常是一樣的。圖中所選32000/1000*2是根據(jù)程序編寫output時,其數(shù)組長度為Nx,即抽樣點數(shù),由公式Nx=Fs/F0得出,又因為本

80、程序輸出為左右聲道疊加,故Nx為抽樣點數(shù)的2倍。</p><p> ?。?)、DSP Data Type:</p><p>  這里我們選擇16-bit signed integer.</p><p>  單擊OK,選擇正弦和三角波時截圖如下:</p><p><b>  六、硬件輸出演示:</b></p>

81、<p><b>  正弦波</b></p><p><b>  方波</b></p><p><b>  鋸齒波</b></p><p><b>  三角波</b></p><p>  通過gain和fre調(diào)節(jié)增益大小和頻率大小,幅度調(diào)節(jié)范圍為

82、1-1000,頻率調(diào)節(jié)范圍為300-16000Hz。</p><p>  誤差分析:產(chǎn)生誤差的原因除了實驗板內(nèi)部結(jié)構(gòu)和噪聲的問題外,最主要的是程序中隨著頻率的變化,由Nx=Fs/F0算出的抽樣點數(shù)需要取整,因此可能會帶來一些誤差。另外在高頻部分隨著頻率的增加,干擾越來越明顯,波形失真嚴重。</p><p><b>  八、參考文獻</b></p><

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論