msp430g2553測頻率以及測峰值_第1頁
msp430g2553測頻率以及測峰值_第2頁
msp430g2553測頻率以及測峰值_第3頁
msp430g2553測頻率以及測峰值_第4頁
msp430g2553測頻率以及測峰值_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、北京尊孑科技學(xué)it教育資料電子設(shè)計綜合實驗項目報告項目名稱:MCU 交流 電壓參數(shù)測量小組成員:林伊、武正治學(xué) 號:20111112、20111201目錄項目要求 3題目 3要求 3基本要求 3發(fā)揮部分 3實現(xiàn)思路 4放大 4頻率 4A/D: 6顯示: 6代碼 7主程序: 7led頭文件 10項目要求題目:交流電壓參數(shù)的測量要求:用給定的MCU:msp430g2553制作交流電壓參數(shù)測試設(shè)備信號發(fā)生器圖表i基本要求:、用給定運放LM324制作一放大器a) 增益大于:20dBb) 帶寬大于:100KHz二、用指定MCUF口已制作的放大器制作頻率計a) 測量范圍:10Hz700KHzb) 顯示:3

2、位以上發(fā)揮部分:一、用A/D測量已給電壓的幅度,信號由已制作的放大器輸入a)測量范圍:輸入信號越小越好實現(xiàn)思路放大:首先分析題目要求,要實現(xiàn)放大20dB,頻率1700KHz的信號,通過公式 201g (Ad)得出Ad=10,即放大10倍必須使用運放1m324實現(xiàn),則需要知道該芯片的器件參數(shù),即增益帶寬積。通過數(shù)據(jù)手冊得知其增益帶寬積為6.4MHz,除去放大倍數(shù)得知能夠?qū)崿F(xiàn)該信號的放大,通過設(shè)計放大電路并焊接即可,放大電路為反向比例放大電路,見 Figure 1Figure 1頻率:實現(xiàn)頻率的測量,這一塊需使用到MCU測量頻率的方法有很多種,通過捕捉上升沿下降沿產(chǎn)生中斷,也可以不產(chǎn)生中斷, 還可

3、通過時鐘計數(shù)。 其中通過捕捉上升沿下降沿的思路 又分兩種,1、檢測上升沿后再檢測下一個上升沿(檢測下降沿后再檢測下一個下降沿)2、檢測上升沿后再檢測下降沿(檢測下降沿后再檢測上升沿)。這些思路對應(yīng)不同的采集方法又可以細(xì)分,其中方案1對于測量高頻信號有著較好的效果,方案2對于測低頻的信號較好,前提是占空比為50%若不為則變?yōu)闇y脈寬。這次的題目我采用的是用時鐘計數(shù)的方式,msp430g2553中含有2個時鐘,timer。和timer1 ,每個時鐘都有如下功能, 選擇時鐘來源:1、外部時鐘(即外部輸入的方波信號)2、 ACLK 3、smclk等。其中ACL©/外部所焊晶振,頻率為32768

4、Hz。由上述條件我使用timer0和timer1同時工作來進(jìn)行頻率的測量,首先外部晶振屬于手 表晶振,極易產(chǎn)生1s中斷,我首先用timer1產(chǎn)生1s中斷,再用timer0選擇使用外部時鐘源計數(shù),也就是需要被我們計數(shù)的信號輸入,這樣每一次上升沿,timer。計數(shù)器就會加一。這樣每秒中斷讀取timer。中寄存器的值就可以得出精確度極高的頻率,甚至都不需要換算。此種方案簡便易于實現(xiàn),故選用。流程圖:Figure 2方案選擇完畢,考慮如何把正弦信號轉(zhuǎn)換成方波信號輸入MCU此部分在考慮信號發(fā)生器只輸出正電的時候, 即正弦信號在0電位之上,我們可以完全不用設(shè)計任何外部電路,因為MCU內(nèi)部有施密特觸發(fā)器,可

5、以將正弦輸入變成方波,但是如果有負(fù)電壓輸入則會損壞MCU實際中由于LM324我們只允許單電源供電, 且放大電路為反向比例放大電路,所以只放大了輸入信號的負(fù)半周,并且將其搬到正半軸,所以輸入到單片機(jī)的是只有正的電壓,如圖:Figure 3所以不需要外部焊接電路實現(xiàn)波形轉(zhuǎn)換,但是由于本課程是為北京電設(shè)做準(zhǔn)備,本著此原則我組成員決定還是設(shè)計并焊接一個外部電路來實現(xiàn)波形轉(zhuǎn)換。波形轉(zhuǎn)換有兩種方法:1、使用過零比較器 2、使用施密特觸發(fā)器。由于本題目對輸入信號的頻率有要求,過零比較器涉及到運放,所以在頻率上有限制,為保證頻率不影響實現(xiàn), 我們選用數(shù)字的電路即施密特觸發(fā)器,數(shù)字電路一般頻率可以達(dá)到幾十兆,所

6、以肯定能夠符合要求,見下圖:Figure 4A/D:本題發(fā)揮部分要求采集正弦信號的峰值,所以涉及A/D轉(zhuǎn)換部分,由于輸入信號頻率在10Hz700KHz由于采樣定理,采樣頻率必須為被采樣信號的兩倍,雖然實際中最好為十倍,我們最后還是米用了兩倍。Msp430g2553此款芯片A/D采集過程若要穩(wěn)定起碼需要30個時鐘,我的 A/D模塊選用時鐘源smclk,其頻率為 8MHz貝U 8MHz除去30約為267KHz,其大于100KHz的兩倍,基本 滿足要求,在之前采集頻率的過程中我們有產(chǎn)生一個1s中斷,A/D平常每采集一次便把采集的值與最大值比較,把最大值留下,1s選取一次最大值顯示,并把之前最大值清除

7、。顯示:顯示我們采用LCD160Z采用四條數(shù)據(jù)線,三條控制線,在保證MCUOI腳夠用的前提下進(jìn)行顯示。代碼主程序:#include <msp430g2553.h>#include "LCD1602_Driver.h"#include <math.h>unsigned int FRE=0;unsigned char flag1=0;unsigned char flag2=0;unsigned int adc_sample=0;unsigned int adc_max=0;unsigned int temp=0;uchar LCDBuf16;/uchar

8、 LCDBuf25;uchar LCDBuf2="HZ"uchar LCDBuf3="MV"void main()WDTCTL = WDTPW + WDTHOLD;DCOCTL |= ( DCO0 + DCO1 );DCOCTL |= ( MOD4 + MOD3 + MOD2 + MOD1 + MOD0);/ 微調(diào) DCOCLKBCSCTL1 |= ( RSEL0 + RSEL2 + RSEL3);/14.8M SMCLKIO_Init();LCD_Init();/測頻初始TA0CTL |= TASSEL_0 + MC_1;TA0CCR0 = 0xfff

9、f;TA1CTL |= TASSEL_1 + MC_1 + TAIE;TA1CCR0 = 32767;TA1CCTL0 |= CCIE;P1DIR &= BIT0;P1SEL |= BIT0;_bis_SR_register(GIE);while(1)if(0=flag1);elseflag1=0;TA0CTL |= TACLR;TA0CTL = TASSEL_0 + MC_1;TA1CTL = TASSEL_1 + MC_1 + TAIE;while(0=flag1);flag1=0;/顯示頻率for(int i=0;i<5;i+)temp = FRE/(10000/(unsi

10、gned int)(pow(10,i);LCDBuf1i = temp + '0'FRE = FRE%(10000/(unsigned int)(pow(10,i);LCDBuf15 = 0;LCD_Disp_string(0,0,LCDBuf1);LCD_Disp_string(5,0,LCDBuf2);/測幅初始flag2=1;TA1CTL = TASSEL_1 + MC_1 + TAIE;TA1CCR0 = 32767;/打開時鐘/ADC10CTL0 = SREF_0 + ADC10SHT_2 + MSC + ADC10ON + ADC10IE;/ADC10CTL1 =

11、INCH_1 + ADC10SSEL_3 + CONSEQ_2;/ADC10AE0 = 0x02;/ADC10DTC0 = ADC10B1;/ADC10DTC1 = 0xC8;/ADC10CTL0 &= ENC;/先關(guān)閉 adc,待至U BUSYti清零,每次都必須等待/while (ADC10CTL1 & BUSY); / Wait if ADC10 core is active/ADC10SA = (unsigned int)adc_sample; / Data buffer start /ADC10CTL0 |= ENC + ADC10SC;ADC10CTL0 = SRE

12、F_0 + ADC10SHT_2 + MSC + ADC10ON;ADC10CTL1 = INCH_1 + ADC10SSEL_3 + CONSEQ_0;ADC10AE0 = 0x02;ADC10CTL0 |= ADC10ON;doADC10CTL0 |= ENC+ADC10SC;while(ADC10CTL0 &ADC10IFG)=0);adc_sample = ADC10MEM;if(adc_max<adc_sample)adc_max = adc_sample;while(0=flag1);adc_max = adc_max*(3300/1023);while(0=flag

13、1);flag2=0;/*/ 篩選for(int i=0;i<200;i+)if(adc_samplei>adc_max)adc_max=adc_samplei;*/ 顯示幅值for(int i=0;i<5;i+)temp = adc_max/(10000/(unsigned int)(pow(10,i);LCDBuf1i = temp + '0'adc_max = adc_max%(10000/(unsigned int)(pow(10,i);LCDBuf15 = 0;LCD_Disp_string(0,1,LCDBuf1);LCD_Disp_string(

14、5,1,LCDBuf3);adc_max = 0;/ Timer A1 interrupt service routine#pragma vector=TIMER1_A0_VECTOR_interrupt void Timer1_A (void)if(0=flag2)TA0CTL = 0;TA1CTL = 0;TA1CTL |= TACLR;FRE=TA0R;flag1=1;TA0CTL = TASSEL_0 + MC_0;TA1CTL = TASSEL_1 + MC_0;/TA0CTL |= TACLR;/TA0CTL = TASSEL_0 + MC_1;/TA1CTL = TASSEL_1

15、 + MC_1 + TAIE;/測了一次還沒開elseTA1CTL = TASSEL_1 + MC_0;flag1=1;/ ADC10 interrupt service routine#pragma vector=ADC10_VECTOR_interrupt void ADC10_ISR (void)flag1=1;ADC10CTL0 &= ENC;lcd頭文件#include "msp430g2553.h"#define SET_LCD_1602_E P2OUT |= 0x04/P2.2#define CLR_LCD_1602_E P2OUT &= 0x

16、04#define SET_LCD_1602_RS P2OUT |= 0x01/P2.0#define CLR_LCD_1602_RS P2OUT &= 0x01#define SET_LCD_1602_RW P2OUT |= 0x02/P2.1#define CLR_LCD_1602_RW P2OUT &= 0x02# define LCD_IO_OUT P1OUT# define LCD_IO_DIR P1DIR# define LCD_IO_IN P1IN# define LCD_IO_SEL P1SEL#define ucharunsigned char#define

17、uintunsigned intvoid IO_Init(void);void LCD_Init(void);void LCD_Check_busy(void); / 檢測LCD否在忙,即能否接收數(shù)據(jù)和指令void LCD_Write_Command(uchar command);void LCD_Write_Data(uchar dat);void LCD_Set_xy( uchar x, uchar y );uchar LCD_Read_Sta(void);uchar LCD_Read_Data(uchar x,uchar y);void User_def_char(uchar n,uch

18、ar *s); /輸入用戶自定義字符(5*8 點陣字符),07共8個字符void LCD_Disp_char(uchar x,uchar y,uchar dat);void LCD_Disp_string(uchar x,uchar y,uchar *s);uchar large=0; /當(dāng)large 為1時,為5*8點陣;為0時,為5*10點陣void IO_Init(void) LCD_IO_SEL &= 0xF0;LCD_IO_DIR |= 0x07 ;P2DIR |= 0x07;P2SEL &= 0x07;void LCD_Init(void)LCD_Write_Com

19、mand(0x28);LCD_Write_Command(0x0F);LCD_Write_Command(0x06);LCD_Write_Command(0x01);void LCD_Check_busy(void)uchar flag=0x80;flag &= LCD_Read_Sta();while(flag = 0x80) _delay_cycles(100); flag &= LCD_Read_Sta();void LCD_WAte_Command(uchar command)LCD_Check_busy();CLR_LCD_1602_RS;CLR_LCD_1602_R

20、W;CLR_LCD_1602_E;uchar temp;temp = command & (0x3C);if(temp=(0x26)|(temp=(0x2C)|(temp=(0x36)|(temp=(0x3C)large = 0;/ 為 5*10 點陣elselarge = 1;LCD_IO_DIR |= 0xF0;LCD_IO_OUT = (command&(0XF0)+(LCD_IO_OUT&(0x0F);SET_LCD_1602_E;CLR_LCD_1602_E;command <<= 4;LCD_IO_OUT = (command&(0XF0

21、)+(LCD_IO_OUT&(0x0F);SET_LCD_1602_E;CLR_LCD_1602_E;void LCD_Write_Data(uchar dat)LCD_Check_busy();SET_LCD_1602_RS;CLR_LCD_1602_RW;CLR_LCD_1602_E;LCD_IO_DIR |= 0xF0;LCD_IO_OUT = (dat&(0XF0)+(LCD_IO_OUT&(0x0F);SET_LCD_1602_E;CLR_LCD_1602_E;dat <<= 4;LCD_IO_OUT = (dat&(0XF0)+(LCD_

22、IO_OUT&(0x0F);SET_LCD_1602_E;CLR_LCD_1602_E;void LCD_Set_xy(uchar x,uchar y) uchar address;if (y = 0)address = 0x80 + x;elseaddress = 0xC0 + x;LCD_Write_Command(address); uchar LCD_Read_Sta(void) uchar sta;CLR_LCD_1602_RS; /讀入狀態(tài)信息高四位數(shù)據(jù)SET_LCD_1602_RW;CLR_LCD_1602_E;LCD_IO_DIR &= 0xF0;SET_LCD_1602_E;_delay_cycles(10);sta = LCD_IO_IN;CLR_LCD_1602_E;SET_LCD_1602_E;/讀入狀態(tài)信息低四位數(shù)據(jù)_delay_cycles(10);uchar temp;temp = LCD_IO_IN;CLR_LCD_1602_E;sta &= 0xF0;temp >>= 4;temp &am

溫馨提示

  • 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

提交評論