基于MSP430F6638的信號采集與分析系統實驗.doc_第1頁
基于MSP430F6638的信號采集與分析系統實驗.doc_第2頁
基于MSP430F6638的信號采集與分析系統實驗.doc_第3頁
基于MSP430F6638的信號采集與分析系統實驗.doc_第4頁
基于MSP430F6638的信號采集與分析系統實驗.doc_第5頁
已閱讀5頁,還剩5頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

信號采集與分析系統實驗一、 實驗目的本實驗目的是利用實驗箱構建一個信號采集和分析系統。二、 實驗內容三、 實驗步驟1、鍵盤及LED的設計與制作 編寫單片機程序,控制按鍵,控制燈的亮滅, 測試所有能控制的按鍵和LED 2、液晶屏顯示的設計與制作 測試在液晶屏上顯示波形和數據 3、以信號發生器輸入單頻正弦波,以16個 指示燈代表16個單頻點,頻點在200Hz 10kHz任選,信號發生器每次產生一種頻點 正弦波,AD采集,對應頻點的指示燈會亮;4、把指示燈顯示頻點改成用液晶顯示 5、液晶屏同時顯示頻譜和時域波形四、實驗原理1、AD采樣模塊在這個模塊中,每過一段時間,AD采樣器采集一個數據存入數組中,并將存儲的二進制數轉換成對應的電壓值,通過代碼:collect0t.real = ADC12MEM0*3.0 / 0x03ff;實現。采集滿N個值之后,令標志變量flag=1,表示一組數據采集完畢,進入下一模塊,即FFT變換。我們將信號發生器輸出的模擬電壓范圍設定為0V2V ,這是因為:若電壓值太大,會導致結果波形失真;若出現負電壓,則因為AD模塊不支持負電壓的采集,結果可能會出現錯誤。2、FFT處理模塊該模塊將采集進來的數據進行FFT變換,變換后的實部即為頻譜,用于LCD的頻譜繪制。繪制時,以各頻點的幅頻值與最大幅頻值的相對大小進行繪制;變換后模值最大的頻點對應的頻率即為待測頻率,用fre表示,便于屏幕及LED頻率顯示;根據求得的fre,可求得若干函數值,用于LCD的時域波形繪制。3、 LCD液晶屏顯示模塊該模塊用于顯示時域波形、頻譜、學號、所測頻率等內容。關鍵語句:清屏:etft_AreaSet(0,0,239,319,0);/清屏顯示:sprintf(buffer, Frequency: %5d Hz,fre);etft_DisplayString(buffer, 0, 32, 0xFFFF, 0x0000);/顯示頻率同時,在模塊中加入了延時語句,使得波形可以保持一定的時間。時間到后,LCD會進行刷新,重新顯示波形和數據。4、LED燈顯示模塊LED1作為采樣指示燈,ADC模塊每采一次樣閃爍一次,由于采樣頻率極高,但中斷調用間隔較長,實際顯示為每次進入ADC采樣中斷LED1閃爍一下。使用LED2、LED3、LED4、LED5顯示頻率,標號分別為5.7、4.7、4.6、4.5。受LED燈數目的限制,當用LED顯示頻率時(二進制表示),只能精確到1kHz。如當1500=fre2500時,用2kHz表示,燈顯示為0010;當5500=fre6500時,用6kHz表示,燈顯示為0110,其余類似。通過以上模塊,可以實現以下功能:AD模塊采集N個數據后,FFT模塊對數據進行處理,FFT變換后,實部為頻譜,用于LCD的頻譜繪制;模值最大的頻點為所求頻率,在LED和LCD上顯示;再求得一些采樣點的函數值,在LCD上繪制時域波形。最終,頻率顯示在LED燈和LCD上,波形和頻譜顯示在LCD上。圖像保持一段時間后,LCD會進行刷新,重新顯示波形和數據。附錄:1、 鍵盤及LED的設計與制作#include #include #include #include dr_i2c.h#include dr_tft.h#define TEMP_ADDR 0x2A#define TEMP_LOCAL 0x00#define TEMP_REMOTE 0x01#define TEMP_CONFIG1 0x09#define TEMP_CONFIG2 0x0A#define TEMP_NCORR 0x21#define BATT_ADDR 0x55#define BATT_VOLTAGE 0x04#define BATT_CURRENT 0x10#define BATT_SOC 0x1C#define BATT_CAPA 0x0C#define BATT_FLAG 0x06int TEMP_LOCAL_INDEX;int TEMP_REMOTE_INDEX;int BATT_VOLTAGE_INDEX;int BATT_CURRENT_INDEX;int BATT_SOC_INDEX;int BATT_CAPA_INDEX;int BATT_FLAG_INDEX;typedef struct const volatile uint8_t* PxIN; volatile uint8_t* PxOUT; volatile uint8_t* PxDIR; volatile uint8_t* PxREN; volatile uint8_t* PxSEL; GPIO_TypeDef;const GPIO_TypeDef GPIO4 = &P4IN, &P4OUT, &P4DIR, &P4REN, &P4SEL;const GPIO_TypeDef GPIO5 = &P5IN, &P5OUT, &P5DIR, &P5REN, &P5SEL;const GPIO_TypeDef GPIO8 = &P8IN, &P8OUT, &P8DIR, &P8REN, &P8SEL;const GPIO_TypeDef* LED_GPIO5 = &GPIO4, &GPIO4, &GPIO4, &GPIO5, &GPIO8;const uint8_t LED_PORT5 = BIT5, BIT6, BIT7, BIT7, BIT0;void initClock() while(BAKCTL & LOCKIO) / Unlock XT1 pins for operation BAKCTL &= (LOCKIO); UCSCTL6 &= XT1OFF; /啟動XT1 P7SEL |= BIT2 + BIT3; /XT2引腳功能選擇 UCSCTL6 &= XT2OFF; /啟動XT2 while (SFRIFG1 & OFIFG) /等待XT1、XT2與DCO穩定 UCSCTL7 &= (DCOFFG+XT1LFOFFG+XT2OFFG); SFRIFG1 &= OFIFG; UCSCTL4 = SELA_XT1CLK + SELS_XT2CLK + SELM_XT2CLK; /避免DCO調整中跑飛 UCSCTL1 = DCORSEL_5; /6000kHz23.7MHz UCSCTL2 = 20000000 / (4000000 / 16); /XT2頻率較高,分頻后作為基準可獲得更高的精度 UCSCTL3 = SELREF_XT2CLK + FLLREFDIV_16; /XT2進行16分頻后作為基準 while (SFRIFG1 & OFIFG) /等待XT1、XT2與DCO穩定 UCSCTL7 &= (DCOFFG+XT1LFOFFG+XT2OFFG); SFRIFG1 &= OFIFG; UCSCTL5 = DIVA_1 + DIVS_1 + DIVM_1; /設定幾個CLK的分頻 UCSCTL4 = SELA_XT1CLK + SELS_DCOCLK + SELM_DCOCLK; /設定幾個CLK的時鐘源int main( void ) / Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; initClock(); initI2C(); initTFT(); etft_AreaSet(0,0,319,239,0); int i; for(i=0;iPxDIR |= LED_PORTi; /設置各LED燈所在端口為輸出方向 P4REN |= 0x1F; /使能按鍵端口上的上下拉電阻 P4OUT |= 0x1F; /上拉狀態 uint8_t last_btn = 0x1F, cur_btn, temp; while(1) int temp1, temp2; char buffer41; cur_btn = P4IN & 0x1F; temp = (cur_btn last_btn) & last_btn; /找出剛向下跳變的按鍵 last_btn = cur_btn; int i; for(i=0;i5;+i) if(temp & (1 PxOUT = LED_PORTi; /翻轉對應的LED _delay_cycles(3276); /延時大約100ms temp1=7-i; temp2=5-i; sprintf(buffer, Switch %d LED %d, temp1, temp2); etft_DisplayString(buffer, 0, 0, 0xFFFF, 0x0000); sprintf(buffer, temp %d, temp); etft_DisplayString(buffer, 0, 16, 0xFFFF, 0x0000); _delay_cycles(2000000); 2、信號采集與顯示#include #include #include #include math.h#include dr_tft.h#define N 256 /FFT點數#define PI 3olatile long IntDegF;volatile long IntDegC;void initClock() while(BAKCTL & LOCKIO) / Unlock XT1 pins for operation BAKCTL &= (LOCKIO); UCSCTL6 &= XT1OFF; /啟動XT1 P7SEL |= BIT2 + BIT3; /XT2引腳功能選擇 UCSCTL6 &= XT2OFF; /啟動XT2 while (SFRIFG1 & OFIFG) /等待XT1、XT2與DCO穩定 UCSCTL7 &= (DCOFFG+XT1LFOFFG+XT2OFFG); SFRIFG1 &= OFIFG; UCSCTL4 = SELA_XT1CLK + SELS_XT2CLK + SELM_XT2CLK; /避免DCO調整中跑飛 UCSCTL1 = DCORSEL_5; /6000kHz23.7MHz UCSCTL2 = 20000000 / (4000000 / 16); /XT2頻率較高,分頻后作為基準可獲得更高的精度 UCSCTL3 = SELREF_XT2CLK + FLLREFDIV_16; /XT2進行16分頻后作為基準 while (SFRIFG1 & OFIFG) /等待XT1、XT2與DCO穩定 UCSCTL7 &= (DCOFFG+XT1LFOFFG+XT2OFFG); SFRIFG1 &= OFIFG; UCSCTL5 = DIVA_1 + DIVS_1 + DIVM_1; /設定幾個CLK的分頻 UCSCTL4 = SELA_XT1CLK + SELS_DCOCLK + SELM_DCOCLK; /設定幾個CLK的時鐘源struct compxfloat real,imag;struct compx collectN,collect0N; /AD采集到的值unsigned long fs = 28500; /采樣頻率int i,j,fre;float temp_frc,z;unsigned int t=0,k=0,flag=0,n=0,c=0;/*函數原型:struct compx EE(struct compx b1,struct compx b2)函數功能:對兩個復數進行乘法運算輸入參數:兩個以聯合體定義的復數a,b輸出參數:a和b的乘積,以聯合體的形式輸出*/struct compx EE(struct compx a,struct compx b)struct compx c;c.real=a.real*b.real-a.imag*b.imag;c.imag=a.real*b.imag+a.imag*b.real;return(c);/*函數原型:void FFT(struct compx *xin)函數功能:對輸入的復數組進行快速傅里葉變換(FFT)輸入參數:*xin復數結構體組的首地址指針,struct型*/void FFT(struct compx *xin) int f,m,nv2,nm1,i,k,l,j=0; struct compx u,w,t;int le,lei,ip; /FFT運算核,使用蝶形運算完成FFT運算nv2=N/2; /變址運算,即把自然順序變成倒位序,采用雷德算法 nm1=N-1; for(i=0;inm1;i+) if(ij) /如果ij,即進行變址 t=xinj; xinj=xini; xini=t; k=nv2; /求j的下一個倒位序 while(k=j) /如果k=j,表示j的最高位為1 j=j-k; /把最高位變成0 k=k/2; /k/2,比較次高位,依次類推,逐個比較,直到某個位為0 j=j+k; /把0改為1f=N; for(l=1;(f=f/2)!=1;l+) /計算l的值,即計算蝶形級數 ; for(m=1;m=l;m+) / 控制蝶形結級數 /m表示第m級蝶形,l為蝶形級總數l=log(2)N le=2(m-1); /le蝶形結距離,即第m級蝶形的蝶形結相距le點 lei=le/2; /同一蝶形結中參加運算的兩點的距離 u.real=1.0; /u為蝶形結運算系數,初始值為1 u.imag=0.0; w.real=cos(PI/lei); /w為系數商,即當前系數與前一個系數的商 w.imag=-sin(PI/lei); for(j=0;j=lei-1;j+) /控制計算不同種蝶形結,即計算系數不同的蝶形結 for(i=j;i=N-1;i=i+le) /控制同一蝶形結運算,即計算系數相同蝶形結 ip=i+lei; /i,ip分別表示參加蝶形運算的兩個節點 t=EE(xinip,u); /蝶形運算,詳見公式 xinip.real=xini.real-t.real; xinip.imag=xini.imag-t.imag; xini.real=xini.real+t.real; xini.imag=xini.imag+t.imag; u=EE(u,w); /改變系數,進行下一個蝶形運算 void main( void )float yN;/ Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; initClock(); initTFT(); REFCTL0 &= REFMSTR; / Reset REFMSTR to hand over control to / ADC12_A ref control registers ADC12CTL0 = 0x0050 ; / Internal ref = 1.5V ADC12CTL1 = ADC12SHP; / enable sample timer ADC12MCTL0 = ADC12INCH_13; / ADC i/p ch A10 = temp sense i/p ADC12IE = 0x001; / ADC_IFG upon conv result-ADCMEMO _delay_cycles(75); / 75us delay to allow Ref to settle ADC12CTL0 |= ADC12ENC; P8DIR |= BIT0; P5DIR |= BIT7; P4DIR |= BIT5+BIT6+BIT7; char buffer81; etft_AreaSet(0,0,239,319,0);/清屏 sprintf(buffer, Name:Zhao Zhenqi); etft_DisplayString(buffer, 0, 0, 0xFFFF, 0x0000); sprintf(buffer, Student Number:22920132203719); etft_DisplayString(buffer, 0, 16, 0xFFFF, 0x0000); while(1) ADC12CTL0 |= ADC12SC; / Sampling and conversion start _bis_SR_register(LPM4_bits + GIE); / LPM0 with interrupts enabled _no_operation(); if(flag=1) /FFT處理模塊 FFT(collect); for(i=0;iN;i+) /求變換后結果的模值,存入復數的實部部分 collecti.real=sqrt(collecti.real*collecti.real+collecti.imag*collecti.imag); temp_frc=collect1.real; fre=1; for(i=2;itemp_frc)/求出最大幅值對應的頻點 temp_frc=collecti.real; fre=i; fre=fre*fs/N;/所測頻率 for(i=0;i80;i+) yi=sin(float)i*PI*fre/2/fs); /LCD液晶屏顯示模塊etft_AreaSet(32,0,239,319,0);/清屏 sprintf(buffer, Frequency: %5d Hz,fre); etft_DisplayString(buffer, 0, 32, 0xFFFF, 0x0000); sprintf(buffer,.); for(i=0;i80;i+) etft_DisplayString(buffer,(i)*4,(int)(yi+1)*10+90),0xFFFF,0x0000);/繪制波形 sprintf(buffer,*); for(j=1;j=500&fre=1500&fre=2500&fre=3500&fre=4500&fre=5500&fre=6

溫馨提示

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

評論

0/150

提交評論