DSP技術應用實驗報告_第1頁
DSP技術應用實驗報告_第2頁
DSP技術應用實驗報告_第3頁
DSP技術應用實驗報告_第4頁
DSP技術應用實驗報告_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

XXXXXX大學碩士試驗匯報課程名稱:DSP技術應用綜合設計名稱:電量參數計算和發(fā)送學生姓名:班級學號:學科名稱:5月25日一、綜合試驗題目和要求試驗設計要求要求1:對給定波形信號,采取TMS320F28335浮點功效計算該信號以下時域參數:信號周期T(頻率f也需要計算),信號均方根大小Vrms、平均值Vavg(即直流量)、峰峰值Vpp。其中,均方根Vrms計算公式(數字量離散公式)以下:式中,N為采樣點數,u(i)為采樣序列中第i個采樣點。要求2:所設計軟件需要計算采樣波形周期個數,并控制采樣點數大于1個波形周期,小于3個波形周期大小。要求3:對采樣數據經過串口發(fā)送至PC界面。試驗目標主要考評學生對TMS320F28335浮點處理器、A/D模塊、SCI模塊和信號時域分析等知識掌握。產生波形可選擇正弦波,也能夠是其它任意波形。假如波形中添加了隨機噪聲,則提議采取軟件設計中加入數字濾波算法,不然可能計算中產生較大誤差。試驗所需頻率不能太大,(提議范圍:10Hz~100kHz),采樣點提議在256點左右(自己任意設定也可,不少于32點)。二、硬件框圖圖1系統(tǒng)硬件框圖圖1給出了該綜合試驗硬件框圖,首先經過小鍵盤設置波形參數,包含頻率、幅值以及波形等。然后經過信號發(fā)生器產生模擬信號,由DSP28335AD通道6進行采樣處理。DSP與PC機之間經過串口進行通信,由DSP28335SCIb通道處理。ADC模塊有16個轉換通道,可配置成兩個獨立8通道轉換模塊,分別對應于管理器A和B,依照用戶需求,兩個獨立8通道轉換模塊能夠級聯(lián)成一個8通道模塊,在ADC模塊中盡管能夠多通道輸入和有兩個排序器,但只有一個A/D轉換器能夠。兩個8通道模塊能夠自動對一系列轉換進行排序,而且每個模塊都能夠經過多路復用開關選擇任何一個通道。在級聯(lián)模式下,自動排序器將作為一個單一8通道排序器。對于每個排序器,當轉換結束時,選擇通道轉換結果被儲存在對應結果存放器中。在DSP28335,自動排序模式允許用戶對統(tǒng)一通道進行數次采樣。模擬輸入與數字輸出關系以下圖2ADC模塊結構框圖外設時鐘HSPCLK經過ADCTRL3存放器SDCCLKPS(3:0)位分頻,然后再經過經過ADCTRL1存放器中CPS位進行二分頻。另外,ADC模塊還能夠經過擴展采樣/獲取周期,調整信號源阻抗,這是由ADCTRL1存放器中ACQ_PS(3:0)位決定。這些位并不影響采樣/保持和轉換過程,但能夠經過增大脈沖長度增加采樣時間長度。圖3ADC內核時鐘以及采樣/保持時鐘三、程序流程圖1、主程序流程圖程序使用兩個中止:ADC中止和CPU定時器2中止。ADC用于對波形進行采樣、濾波、存放以及計算波形有效值、峰峰值、平均值,并使用串口發(fā)送;CPU定時器2中止用于計算波形周期和頻率。圖4主程序流程圖圖4給出了主程序流程圖,該程序主要步驟是進行初始化——使能中止——等候中止響應。2、子程序流程圖圖5ADC中止服務子程序圖6定時器2中止服務子程序圖7濾波程序段圖8求最大值最小值程序段圖9求有效值和平均值程序段圖10串口通信程序段圖5~圖10給出了全部子程序框圖,下面分別說明各個程序設計思想:(1)AD中止子程序(圖5):該程序對波形進行采樣,濾波以及存放,并求出有效值,峰峰值和平均值。采樣后波形存放在一個長度為1024數組里。為了降低CPU開銷,程序設定為采樣累計到1024個點后再進行波形有效值,峰峰值和平均值計算。(2)定時器2中止子程序(圖6):該程序經過定時器中止來實現(xiàn)對波形等時間間隔判斷和處理,從而能夠較為精準計算出波形周期和頻率。在波形每次正向過零點時,計算出兩次過零點時間間隔,并乘以定時器2中止周期,從而得到波形實際周期。定時器2中止周期設置為10us。(3)濾波程序(圖7):該程序對1024個點進行了低通值濾波,依照此次采樣點和上次采樣點,來修正此次采樣值。濾波公式如下,程序中取K=0.15。(4)求最大值最小值程序(圖8):該程序定義數組第一個值為初值,再比較1023個點,假如找到更大點,則賦給最大值對應變量;假如找到更小點就賦給最小值對應變量。(5)求有效值和平均值程序段(圖9):有效值計算:將1024個點平方值相加求平均后,再開根號。平均值計算:將1024個點求和然后求平均。(6)SCI通信程序(圖10):PC端為串口接收助手,為了使顯示界面上顯示是實際數值,發(fā)送之前將關于數據量個十百千位拆開,并轉換為ASCII碼進行發(fā)送。在發(fā)送之前檢測SCIb_buff是否為空,若不為空則等候。串口發(fā)送子程序定義了一個計數器,以控制串口發(fā)送速率。四、試驗結果和分析1、軟件調試結果圖11900Hz1200mV正弦波調試結果(上圖)圖121700Hz800mV正弦波調試結果(上圖)圖13800Hz1000mV三角波調試結果(上圖)2、結果分析(1)從圖11所表示調試結果波形圖能夠看出,濾波后波形平滑度顯著變好,說明低通濾波效果良好。各個波形參數MIN(最小值)、MAX(最大值)、VRM(有效值)、FRE(頻率)、PER(周期)均和實際輸入指標誤差在5%以內,說明電參量計算方法準確性良好。(2)從圖12所表示試驗波形能夠看出,當輸入波形電參量改變時,輸出電參量值也發(fā)生了相同改變,且誤差值在5%以內。由ADC采樣頻率能夠得到,本程序能夠計算出頻率最低為150Hz正弦波周期。(3)比較圖13和前兩幅波形能夠得出,本程序在對三角波進行采樣時,波形濾波效果良好,電參量計算準確,也達成了良好效果。由此驗證了本程序通用性,并深入驗證了程序準確性。(4)經過試驗結果總結出本程序在以下方面需要深入改進:AD采樣速率以及采樣窗口大小現(xiàn)在為確定值,當波形頻率改變范圍較大時,會影響到采樣結果,如:當頻率過大時,采樣波形每個周期點數減小,將直接影響各個電參量計算結果;當頻率過小時,采樣窗口不能采樣出一個完整波形周期,也將直接影響各個電參量計算結果。這是需要深入作出改進地方。五、源程序#include"DSP2833x_Device.h"http://DSP2833xHeaderfileIncludeFile#include"DSP2833x_Examples.h"http://DSP2833xExamplesIncludeFile#include"math.h"http://Perruptvoidadc_isr(void);interruptvoidISRTimer2(void);voidnumber_count(void); //確定周期采樣點,計算頻率和有效值并發(fā)送數據voidscib_fifo_init(); voidInitScibGpio(void); //串口初始化程序voidnumber_C(unsignedlongi); //數字各位拆分函數#if(CPU_FRQ_150MHZ)//Default-150MHzSYSCLKOUT#defineADC_MODCLK0x3//HSPCLK=SYSCLKOUT/2*ADC_MODCLK2=150/(2*3)=25.0MHz#endif#if(CPU_FRQ_100MHZ)#defineADC_MODCLK0x2//HSPCLK=SYSCLKOUT/2*ADC_MODCLK2=100/(2*2)=25.0MHz#endif#defineADC_CKPS0x1//ADCmoduleclock=HSPCLK/2*ADC_CKPS=25.0MHz/(1*2)=12.5MHz#defineADC_SHCLK0xf//S/HwidthinADCmoduleperiods=16ADCclocks#defineAVG1000//Averagesamplelimit#defineZOFFSET0x00//AverageZerooffset#defineBUF_SIZE160//Samplebuffersize//Globalvariablesusedinthisexample:Uint16LoopCount;Uint16ConversionCount;Uint16Voltage1[1024];Uint16i=0;Uint16j=0;Uint16Ticker[50];//在AD采樣例程基礎上修改,以下為新定義變量:Uint16ADt1,ADt2,ADt,ADt3,ADt4;//AD時間間隔Uint16Voltagelb[1024];Uint16vref=500;//參考值intPreConversion=0;intcrosszero=0;Uint32t1,t2,t,t3,t4;//定時器時間間隔floatData=0.0;floatVavg=0.0;//平均值floatVmax=0.0;//最大值floatVmin=0.0;//最小值floatVrms=0.0;//有效值floatVpp=0.0;//峰峰值floatfrequency=0;floatperiod=0;floatMAX=0.0;floatMIN=0.0;//以下為整型變量,用于串口發(fā)送Uint16T=0;//周期msUint16F=0;//Uint16V=0;//有效值mvUint16max=0;//最大值mvUint16min=0;//最小值mvunsignedintTX_flag=0; //串口發(fā)送時間間隔標志unsignedintTX_Ticker=500; //串口發(fā)送周期間隔main(){//Step1.InitializeSystemControl://PLL,WatchDog,enablePeripheralClocks//ThisexamplefunctionisfoundintheDSP2833x_SysCtrl.cfile.InitSysCtrl();//Step2.InitializeGPIO://ThisexamplefunctionisfoundintheDSP2833x_Gpio.cfileand//illustrateshowtosettheGPIOtoit'sdefaultstate.InitGpio();//SkippedforthisexampleInitScibGpio();//*********************起初遺漏了這句話**************************//Step3.ClearallinterruptsandinitializePIEvectortable://DisableCPUinterruptsDINT;//InitializethePIEcontrolregisterstotheirdefaultstate.//ThedefaultstateisallPIEinterruptsdisabledandflags//arecleared.//ThisfunctionisfoundintheDSP2833x_PieCtrl.cfile.InitPieCtrl();//DisableCPUinterruptsandclearallCPUinterruptflags:IER=0x0000;IFR=0x0000;//InitializethePIEvectortablewithpointerstotheshellInterrupt//ServiceRoutines(ISR).//Thiswillpopulatetheentiretable,eveniftheinterrupt//isnotusedinthisexample.Thisisusefulfordebugpurposes.//TheshellISRroutinesarefoundinDSP2833x_DefaultIsr.c.//ThisfunctionisfoundinDSP2833x_PieVect.c.InitPieVectTable();//Interruptsthatareusedinthisexamplearere-mappedto//ISRfunctionsfoundwithinthisfile.EALLOW;//ThisisneededtowritetoEALLOWprotectedregisterPieVectTable.ADCINT=&adc_isr;PieVectTable.TINT2=&ISRTimer2;EDIS;InitXintf(); /*設置CPU*/InitCpuTimers();ConfigCpuTimer(&CpuTimer2,150,10);//中止時間10us. 1MHzStartCpuTimer2();CpuTimer2Regs.TCR.all=0x4001;//Usewrite-onlyinstructiontosetTSSbit=0/*開中止*/ IER|=M_INT14;//EnableTINT0inthePIE:Group1interrupt7PieCtrlRegs.PIEIER1.bit.INTx7=1;//Step4.InitializealltheDevicePeripherals://ThisfunctionisfoundinDSP2833x_InitPeripherals.c//InitPeripherals();//NotrequiredforthisexampleInitAdc();//Forthisexample,inittheADCscib_fifo_init();//Step5.Userspecificcode,enableinterrupts://EnableADCINTinPIEPieCtrlRegs.PIEIER1.bit.INTx6=1;IER|=M_INT1;//EnableCPUInterrupt1EINT;//EnableGlobalinterruptINTMERTM;//EnableGlobalrealtimeinterruptDBGMLoopCount=0;ConversionCount=0;AdcRegs.ADCTRL1.bit.ACQ_PS=ADC_SHCLK;AdcRegs.ADCTRL3.bit.ADCCLKPS=ADC_CKPS;AdcRegs.ADCTRL1.bit.SEQ_CASC=1;//0Non-CascadedMode;1CascadedModeAdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=0x1;AdcRegs.ADCTRL2.bit.RST_SEQ1=0x1;AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x6;AdcRegs.ADCMAXCONV.bit.MAX_CONV1=15;AdcRegs.ADCTRL2.bit.SOC_SEQ1=0x1;for(i=0;i<1024;i++){ Voltagelb[i]=0; }//Waitforinterruptfor(;;);}//******************此中止完成AD采樣以及相關波形參數計算(除周期外)**********************interruptvoidadc_isr(void){//********************************采樣并濾波************************************************ Voltage1[ConversionCount]=AdcRegs.ADCRESULT0>>4; PreConversion=ConversionCount-1; if(PreConversion<0)PreConversion=1024; Voltagelb[ConversionCount]=Voltage1[ConversionCount]*0.15+Voltagelb[PreConversion]*0.85;//一階滯后濾波 if(ConversionCount==1024) { ConversionCount=0;//************************計算有效值,平均值,峰峰值程序段***************************////Vavg平均值,Vmax最大值,Vmin最小值,Vrms有效值,Vpp峰-峰值 Vavg=0; Data=0; Vmax=Voltagelb[0]; Vmin=Voltagelb[0]; for(i=0;i<1024;i++) { Data+=Voltagelb[i]*Voltagelb[i]; Vavg+=Voltagelb[i]; if(Vmax<Voltagelb[i])Vmax=Voltagelb[i]; if(Vmin>Voltagelb[i])Vmin=Voltagelb[i]; } Data=Data/1024; Vrms=sqrt(Data);//計算有效值 Vavg=Vavg/1024;//計算平均值 Vpp=Vmax-Vmin;//計算峰-峰值//**************************計算有效值,平均值,峰峰值程序段結束********************// T=period*1000000; F=frequency; Vrms=Vrms*3/4095;MAX=Vmax*3/4095; MIN=Vmin*3/4095; V=Vrms*1000; max=MAX*1000; min=MIN*1000;//得出整型值單位均為mvnumber_count();//調用串口發(fā)送 } elseConversionCount++;//ReinitializefornextADCsequenceAdcRegs.ADCTRL2.bit.RST_SEQ1=1;//ResetSEQ1AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;//ClearINTSEQ1bitPieCtrlRegs.PIEACK.all=PIEACK_GROUP1;//AcknowledgeinterrupttoPIEAdcRegs.ADCTRL2.bit.SOC_SEQ1=0x1;return;}//*************************此中止中計算波形周期,10us執(zhí)行一次********************************interruptvoidISRTimer2(void){ CpuTimer2.InterruptCount++;//32位無符號整型:最大 if(CpuTimer2.InterruptCount>)CpuTimer2.InterruptCount=0; if((Voltagelb[PreConversion]<vref)&&(vref<Voltagelb[ConversionCount])&&(crosszero==0))//第1個交點 { crosszero=1; t1=CpuTimer2.InterruptCount; ADt1=ConversionCount; } if((Voltagelb[PreConversion]>vref)&&(vref>Voltagelb[ConversionCount])&&(crosszero==1))//第2個交點 { crosszero=2; t2=CpuTimer2.InterruptCount; ADt2=ConversionCount; } if((Voltagelb[PreConversion]<vref)&&(vref<Voltagelb[ConversionCount])&&(crosszero==2))//第3個交點 { crosszero=0; t3=CpuTimer2.InterruptCount; ADt3=ConversionCount; if(t3<=t1)//計算一個周期定時器間隔 t=+t3-t1; else t=t3-t1; period=t*0.00001; frequency=1/period;} PieCtrlRegs.PIEACK.all|=0x01;//去除中止響應位}voidnumber_count(void){ //此處定時發(fā)送數據 TX_flag++; //統(tǒng)計發(fā)送時間間隔標志 if(TX_flag>=TX_Ticker) { TX_flag=0; //需要發(fā)送頻率、有效值、最大值、最小值 ScibRegs.SCITXBUF='{'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='M'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='I'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='N'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF=':'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); number_C(min); ScibRegs.SCITXBUF='m'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='v'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF=','; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='M'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='A'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='X'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF=':'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); number_C(max); ScibRegs.SCITXBUF='m'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='v'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF=','; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='V'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='R'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='M'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF=':'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); number_C(V); ScibRegs.SCITXBUF='m'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='v'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF=','; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='F'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='R'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='E'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF=':'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); number_C(F); ScibRegs.SCITXBUF='H'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='Z'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF=','; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='P'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='E'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='R'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF=':'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); number_C(T); ScibRegs.SCITXBUF='u'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='s'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='}'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); ScibRegs.SCITXBUF='\t'; while(ScibRegs.SCIFFTX.bit.TXFFST!=0); } //清有效值和周期采樣點數,為下周期做準備}voidscib_fifo_init() //串口B初始化{ ScibRegs.SCICCR.all=0x0007;//1個停頓位、無奇偶校驗 ScibRegs.SCICTL1.all=0x0003;//使能TX、RX ScibRegs.SCICTL2.all=0x0003; ScibRegs.SCICTL2.bit.TXINTENA=1; ScibRegs.SCICTL2.bit.RXBKINTENA=1; ScibRegs.SCIHBAUD=0x0001; ScibRegs.SCILBAUD=0x00e7; //波特率9600 ScibRegs.SCICCR.bit.LOOPBKENA=0;//禁止自檢模式 ScibRegs.SCICTL1.all=0x0023; ScibRegs.SCIFFTX.bit.TXFIFOXRESET=0; ScibRegs.SCIFFRX.bit.RXFIFORESET=0; ScibRegs.SCIFFTX.all=0xE040; ScibRegs.SCIFFRX.all=0x204f; ScibRegs.SCIFFCT.all=0x0;}voidInitScibGpio(void){ EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO18=0; //GPIO18上拉 GpioCtrlRegs.GPAPUD.bit.GPIO19=0; //GPI

溫馨提示

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

評論

0/150

提交評論