MSP430初學(xué)者應(yīng)用筆記_第1頁(yè)
MSP430初學(xué)者應(yīng)用筆記_第2頁(yè)
MSP430初學(xué)者應(yīng)用筆記_第3頁(yè)
MSP430初學(xué)者應(yīng)用筆記_第4頁(yè)
MSP430初學(xué)者應(yīng)用筆記_第5頁(yè)
已閱讀5頁(yè),還剩54頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、電設(shè)工作小結(jié)之MSP430G2553學(xué)習(xí)筆記1  (2012-08-18 22:00:24)轉(zhuǎn)載標(biāo)簽: 電設(shè) msp430學(xué) 設(shè)計(jì)分類(lèi): 學(xué)習(xí)探討把這幾天的工作做一個(gè)小結(jié):第一版MSP430G2553學(xué)習(xí)筆記   Created on: 2012-8-18      Author: zhang bin 學(xué)習(xí)筆記for msp430g2553redesigned by zhang

2、 bin2012-08-18versions:12_08_01       一,MSP430G2553單片機(jī)的各個(gè)功能模塊  (一),IO口模塊,  1,我們所用的MSP430G2553有兩組IO口,P1和P2。  2,IO口的寄存器有:方向選擇寄存器PxDIR,輸出寄存器PxOUT,輸入寄存器PxIN,IO口內(nèi)部上拉或下拉電阻使能寄存器PxREN, IO口功能選擇寄存器PxSEL和PxSEL2,IO口中斷使能寄存器PxIE,中斷沿選擇寄存器PxIES,I

3、O口中斷標(biāo)志寄存器PxIFG。  3,所有的IO都帶有中斷,其中所有的P1口公用一個(gè)中斷向量,所有的P2口公用一個(gè)中斷向量。所以在使用中斷時(shí),當(dāng)進(jìn)入中斷后,還要判斷到底是哪一個(gè)IO口產(chǎn)生的中斷,判斷方法可以是判斷各個(gè)IO口的電平。   4,中斷標(biāo)志PxIFG需要軟件清除,也可以用軟件置位,從而用軟件觸發(fā)一個(gè)中斷。注意:在設(shè)置PxIESx時(shí)根據(jù)PxINx有可能會(huì)引起相應(yīng)的PxIFGx置位(具體的情況見(jiàn)用戶指南),所以在初始化完IO口中斷以后,正式使用IO中斷前要先將對(duì)應(yīng)的PxIFGx清零。程序如下:void IO_interrupt_i

4、nit()     /IO中斷初始化函數(shù)  P1REN |= BIT4+BIT5+BIT6+BIT7;     / pullup 內(nèi)部上拉電阻使能  /使用中斷時(shí),使能內(nèi)部的上拉電阻這樣當(dāng)該腳懸空是,電平不會(huì)跳變,防止懸空時(shí)電平跳變不停的觸發(fā)中斷  P1OUT = BIT4+BIT5+BIT6+BIT7;   / 當(dāng)引腳上的上拉或下拉電阻

5、使能時(shí),PxOUT選擇是上拉還是下來(lái)          /0:下拉,1:上拉   P1IE |= BIT4+BIT5+BIT6+BIT7;       / interrupt enabled P13中斷使能  P1IES |= BIT4+BIT5+BIT6+BIT7;   

6、60;      / Hi/lo edge  下降沿中斷  /P1IES &= BIT3;                         /上升沿觸發(fā)中斷  P1IFG 

7、&= (BIT4+BIT5+BIT6+BIT7);         /中斷標(biāo)志位清零  5,PxOUT:如果引腳選擇了內(nèi)部的上拉或下拉電阻使能,則PxOUT設(shè)定電阻是上拉還是下拉,0:下拉,1:上拉6,當(dāng)IO口不用時(shí),最好不要設(shè)為輸入,且為浮動(dòng)狀態(tài)(這是IO口的默認(rèn)狀態(tài)),因?yàn)楫?dāng)輸入為浮動(dòng)時(shí),輸入電壓有可能會(huì)在VIL和VIH之間,這樣會(huì)產(chǎn)生擊穿電流。所以不用的IO口可以設(shè)為輸出狀態(tài),或設(shè)為輸入狀態(tài)但通過(guò)外圍電路接至VCC或GND,或接一個(gè)上拉/下拉電阻。7,當(dāng)使用ms

8、p430g2553的IO口時(shí)要注意,因?yàn)間2553的IO口寄存器的操作,不像51,它不能單獨(dú)針對(duì)某一位進(jìn)行操作,必須對(duì)整個(gè)寄存器進(jìn)行操作。所以就不像51,g2553不可以定義bit型的數(shù)據(jù)。所以在使用msp的IO口時(shí)要注意對(duì)需要位的操作,而不要影響其他無(wú)關(guān)的位,可以 用 |  &  等按位操作的符號(hào)。在使用IO都控制其他外圍模塊時(shí)也要注意要使用的IO口的定義,可以用如下的定義方法:#define CLR_RS P2OUT&=BIT0;    /RS 

9、= P2.0#define SET_RS P2OUT|=BIT0;#define CLR_RW P2OUT&=BIT1; /RW = P2.1#define SET_RW P2OUT|=BIT1;#define CLR_EN P2OUT&=BIT2; /EN = P2.2#define SET_EN P2OUT|=BIT2; #define DataPort   

10、; P1OUT 8,g2553的P27和P26腳分別接外部晶體的輸出和輸入腳XOUT和XIN,默認(rèn)是自動(dòng)設(shè)為了晶振管腳功能,但是當(dāng)想把它們用為普通的IO時(shí),也可以,設(shè)置對(duì)應(yīng)的SEL設(shè)為普通的IO即可,如下:P2DIR |= BIT6+BIT7;    /把P26和P27配置為普通IO 并為輸出腳  默認(rèn)為晶振的輸入和輸出引腳 作為dac0832的    P2SEL &= (BIT6+BIT7); &

11、#160; /cs和wr控制端    P2SEL2 &= (BIT6+BIT7);   (二),時(shí)鐘系統(tǒng)     1,msp430能做到超低功耗,合理的時(shí)鐘模塊是功不可沒(méi)的。但是功能強(qiáng)大的時(shí)鐘模塊設(shè)置起來(lái)也相對(duì)復(fù)雜一些。     2,msp430的時(shí)鐘源有:(1),外接低頻晶振LFXT1CLK:低頻模式接手表晶體32768Hz,高頻模式450KHz8MHz;(2),外接高速晶振XT2CLK

12、:8MHz;(3),內(nèi)部數(shù)字控制振蕩器DCO:是一個(gè)可控的RC振蕩器,頻率在016MHz;(4),超低功耗低頻振蕩器VLO:不可控,420KHz 典型值為12KHz;     3,時(shí)鐘模塊:430的時(shí)鐘模塊有MCLK  SMCLK  ACLK :(1),主系統(tǒng)時(shí)鐘MCLK:提供給MSP430的CPU時(shí)鐘。可以來(lái)自LFXT1CLK  XT2CLK  DCO  VLO可選,默認(rèn)為DCO。(2),子系統(tǒng)時(shí)鐘SMCLK: 提

13、供給高速外設(shè)??梢詠?lái)自LFXT1CLK  XT2CLK  DCO  VLO可選,默認(rèn)為DCO。(3),輔助系統(tǒng)時(shí)鐘ACLK:提供給低速外設(shè)??蓙?lái)自LFXT1CLK  VLO。      4,內(nèi)部的振蕩器DCO和VLO提供的時(shí)鐘頻率不是很精確,隨外部環(huán)境變化較大。DCO默認(rèn)的頻率大概為800KHz,但我用示波器觀察的為1.086MHz左右,當(dāng)DCO設(shè)置的過(guò)高時(shí),用示波器可以看到波形不再是方波,而是類(lèi)似于正弦波。DCO可以用CCS提供的宏定義進(jìn)行相對(duì)比較精確的

14、設(shè)置,如下:DCOCTL = CALDCO_12MHZ;   /DCO設(shè)為12MHz   這種方法設(shè)DCO頻率比較精確,實(shí)際測(cè)得為12.08MHz左右 正弦波BCSCTL1 = CALBC1_12MHZ;用這種方法可以設(shè)置1,8,12,16MHz宏定義如下:#ifndef _DisableCalData SFR_8BIT(CALDCO_16MHZ);          

15、;             SFR_8BIT(CALBC1_16MHZ);                       SFR_8BIT(CALDCO_12MHZ);      &

16、#160;                SFR_8BIT(CALBC1_12MHZ);                       SFR_8BIT(CALDCO_8MHZ);  

17、0;                     SFR_8BIT(CALBC1_8MHZ);                        SFR_8B

18、IT(CALDCO_1MHZ);                        SFR_8BIT(CALBC1_1MHZ);                   

19、0;     #endif  5,使用超低功耗低頻振蕩器VLO可以很大程度地降低系統(tǒng)功耗,下面的例子是設(shè)置ACLK為VLO,MCLK為VLO的8分頻:#include  <msp430g2553.h> /1延時(shí)/#define CPU_F (double)16000000)/cpu frequency16000000#define CPU_F (double)1630)/cpu frequency1630 

20、0; /CPU的實(shí)際MCLK大約為13.05/8=1.63KHz#define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0)#define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0)  void main(void)  volatile unsigned int i;     &

21、#160;            / Volatile to prevent removal  WDTCTL = WDTPW + WDTHOLD;                 / Stop

22、0;watchdog timer   BCSCTL3 |= LFXT1S_2;                      / LFXT1 = VLO  低頻時(shí)鐘選擇為VLO ACLK選為VLO   IFG1 &=

23、 OFIFG;                           / Clear OSCFault flag  清除振蕩器錯(cuò)誤中斷標(biāo)志   _bis_SR_register(SCG1 + SCG0); 

24、60;         / Stop DCO  SCG1禁止SMCLK  SCG0禁止DCO   BCSCTL2 |= SELM_3 + DIVM_3;               / MCLK = 

25、LFXT1/8  /因?yàn)榍懊嬉呀?jīng)選擇了LFXT1 = VLO 所以MCLK選為VLO  8分頻  所以CPU的MCLK大約為1.5KHz   P1DIR = 0xFF;                        &#

26、160;    / All P1.x outputs  P1OUT = 0;                                / All 

27、;P1.x reset  P2DIR = 0xFF;                             / All P2.x outputs  P2OUT = 0; 

28、0;                              / All P2.x reset   P1SEL |= BIT0+BIT4;      

29、0;         / P10 P14options  功能選擇為外圍模塊  /p10輸出ACLK,來(lái)自VLO,p14輸出SMCLK,  因?yàn)榻沽薙MCLK,所以P14腳無(wú)波形輸出  /VLO典型值為12KHz  實(shí)際用示波器測(cè)得為:13.05KHz 左右波動(dòng)  /所以CPU的實(shí)際MCLK大約為13.05/8=1.63KHz  

30、60; for (;)      P1OUT = BIT6;          / P1.6 閃爍    delay_ms(1000);     6,如上面的程序所示,其中的延遲函數(shù)用那種方法,使用系統(tǒng)的延遲周期函數(shù)_delay_cycles(int n); 可以達(dá)到比

31、較精確的延遲,如下: /more_/1延時(shí)/#define CPU_F (double)16000000)/cpu frequency16000000#define CPU_F (double)12000000)/cpu frequency12000000#define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0)#define delay_ms(x) _delay_cycles(long)(CPU_F*(doub

32、le)x/1000.0)/2空函數(shù)#define nop() _NOP();    7,系統(tǒng)上電后默認(rèn)使用的是DCO時(shí)鐘,DCO默認(rèn)的頻率大概為800KHz,但我用示波器觀察的為1.086MHz左右,當(dāng)DCO設(shè)置的過(guò)高時(shí),用示波器可以看到波形不再是方波,而是類(lèi)似于正弦波。    (三),定時(shí)器Timer_A   1,MSP430g2553具有兩個(gè)16位的定時(shí)器:Timer0_A   Timer1_A。分別具有三個(gè)捕捉/比較寄存器,具有輸

33、入捕捉,輸出比較功能。可以產(chǎn)生定時(shí)中斷,也可以產(chǎn)生PWM。   2,產(chǎn)生PWM,例子如下: #include <msp430g2553.h>  void Timer_A0_1_init()  /TA0.1輸出PWMTACTL|= TASSEL_1+MC_1;/ACLK,增計(jì)數(shù)CCTL1=OUTMOD_7;/輸出模式為復(fù)位/置位CCR0=328;/時(shí)鐘頻率為32768HZ,100HZ/CCR1=164;/時(shí)鐘頻率為32768HZ,占空比CCR1/CCR0=50%CCR1=10

34、9;/占空比CCR1/CCR0=1/3                              TA0.1由P1.2 P1.6輸出  void Timer_A1_2_init()    /TA1.2輸出PWMTA1CT

35、L|= TASSEL_1+MC_1;/ACLK,增計(jì)數(shù)TA1CCTL2=OUTMOD_7;/輸出模式為復(fù)位/置位,注意CCTL2要寫(xiě)為T(mén)A1CCTL2 TA1CCR0=164;/時(shí)鐘頻率為32768HZ,波形32768/CCR0=199HZTA1CCR2=41;/占空比CCR2/CCR0=1/4,注意CCR2要寫(xiě)成TA1CCR2       TA1.2由P2.4 P2.5輸出   void Timer_A1_1_init()  

36、0;/TA1.1輸出PWM  TA1CCTL1=OUTMOD_7; TA1CCR1=123;   /占空比CCR1/CCR0=3/4,注意CCR1要寫(xiě)成TA1CCR1   TA1.1由P2.1 P2.2輸出   void IO_init()  P1SEL|=BIT2+BIT6; P1DIR|=BIT2+BIT6;/P1.2 P1.6輸出   TA0.1   

37、OUT1  P2SEL|=BIT4+BIT5; P2DIR|=BIT4+BIT5;/P2.4 P2.5輸出   TA1.2   OUT2  P2SEL|=BIT1+BIT2; P2DIR|=BIT1+BIT2; /P2.1 P2.2輸出  TA1.1   OUT1  void main(void) WDTCTL=WDTPW+WDTHOLD; 

38、60;   IO_init(); Timer_A0_1_init();Timer_A1_2_init();Timer_A1_1_init();  _BIS_SR(CPUOFF);                          / Enter LPM0

39、60; 進(jìn)入低功耗模式0 SMCLK ON,ACLK ON   3,Timer_A的捕獲/比較寄存器TAR寄存器是Timer_A的16位的計(jì)數(shù)寄存器。TACCRx是Timer_A的捕獲/比較寄存器,當(dāng)為捕獲模式時(shí):當(dāng)捕獲發(fā)生時(shí),把TAR的值裝載到TACCRx中。當(dāng)為比較模式時(shí):TACCRx中裝的是要與TAR寄存器相比較的值。   4,捕獲模式捕獲外部輸入的信號(hào)的上升沿或下降沿或上升沿下降沿都捕捉,當(dāng)捕捉發(fā)生時(shí),把TAR的值裝載到TACCRx中,同時(shí)也可以進(jìn)入中斷,執(zhí)行相應(yīng)的操作。這樣利用捕捉上升

40、沿或下降沿就可以計(jì)算外部輸入信號(hào)的周期,得出頻率。利用捕捉上升沿和下降沿可以得出輸入信號(hào)的高電平或低電平的持續(xù)時(shí)間。也可以算出占空比。下面是一個(gè)例子,是Timer_A捕獲初始化的程序:void timer_init()      /使用Timer1_A時(shí)要特別注意各個(gè)寄存器的寫(xiě)法,因?yàn)門(mén)imer0_A的寄存器都簡(jiǎn)寫(xiě)了,所以在寫(xiě)/Timer1_A的寄存器時(shí),要特別注意與Timer0_A的不同P1SEL |= BIT2;    /選擇P12作為捕捉的輸入端子 

41、 Timer0_A /TACCTL1 |=CM_3+SCS+CAP+CCIE;  /上下沿都觸發(fā)捕捉,用于測(cè)脈寬,同步模式、時(shí)能中斷  CCI1ATACCTL1 |=CM_1+SCS+CAP+CCIE;  /上升沿觸發(fā)捕捉,同步模式、時(shí)能中斷  CCI1A    TACTL |= TASSEL1+MC_2;  /選擇SMCLK時(shí)鐘作為計(jì)數(shù)時(shí)鐘源,不分頻   增計(jì)數(shù)模式

42、不行,必須連續(xù)計(jì)數(shù)模式   P2SEL |= BIT1;    /選擇P21作為捕捉的輸入端子    Timer1_A  /TA1CCTL1 |=CM_3+SCS+CAP+CCIE;  /上下沿都觸發(fā)捕捉,用于測(cè)脈寬,同步模式、時(shí)能中斷  CCI1A  TA1CCTL1 |=CM_1+SCS+CAP+CCIE;  /上升沿觸發(fā)捕捉,同步模式、時(shí)能中

43、斷  CCI1A  TA1CTL |= TASSEL1+MC_2;  /選擇SMCLK時(shí)鐘作為計(jì)數(shù)時(shí)鐘源,不分頻   增計(jì)數(shù)模式不行,必須連續(xù)計(jì)數(shù)模式   相對(duì)應(yīng)的中斷函數(shù)如下: #pragma vector=TIMER0_A1_VECTOR   /Timer0_A CC1  的中斷向量_interrupt void Timer_A(void) /

44、 CCI0A 使用的捕捉比較寄存器是TA0CCR0,TA0CCR0單獨(dú)分配給一個(gè)    /中斷向量TIMER1_A0_VECTOR,所以進(jìn)入中斷后直接就是Timer0_A CC0產(chǎn)生的中斷,不用經(jīng)過(guò)類(lèi)似   /下面的方法判斷中斷源了  。/Timer0_A CC1-4, TA0公用一個(gè)中斷向量 TIMER0_A1_VECTOR,所以進(jìn)入了中斷后還要用下面    /的方法進(jìn)行判斷是哪一個(gè)中斷源產(chǎn)生的中斷

45、60; switch(TAIV)    /如果是Timer0_A CC1產(chǎn)生的中斷    case 2:      flag=1;   LPM1_EXIT;      /退出低功耗模式  / _BIC_SR_IRQ(LPM1_bits);   /_bic_SR_register_

46、on_exit(LPM1_bits);   break;     case 4: break;  case 10:break;    #pragma vector=TIMER1_A1_VECTOR      /Timer1_A CC1  的中斷向量_interrupt void Timer_A1(void)&

47、#160;/ P1OUT|=BIT0;  /led調(diào)試用的/ LPM1_EXIT;      /退出低功耗模式  因?yàn)槭褂玫氖荂CI0A 使用的捕捉比較寄存器是TA1CCR0,TA1CCR0單獨(dú)分配給一個(gè)                /中斷向量TIMER1_A0_VECTOR,所以進(jìn)入中斷后直接就是Time

48、r1_A CC0產(chǎn)生的中斷,不用經(jīng)過(guò)類(lèi)似               /下面注釋掉的方法判斷  。               /而Timer1_A CC1-4, TA1則公用一個(gè)中斷向量 TIMER1_A1_VECTOR,所以進(jìn)入了中斷后

49、還要用下面       /的方法進(jìn)行判斷是哪一個(gè)中斷源產(chǎn)生的中斷  switch(TA1IV)    /如果是Timer1_A CC1產(chǎn)生的中斷    case 2:      flag=2;   LPM1_EXIT;      /退出低功耗模式 &

50、#160; / _BIC_SR_IRQ(LPM1_bits);   /_bic_SR_register_on_exit(LPM1_bits);   break;     case 4:break;  case 10:break;   /如果要測(cè)量更低頻率的信號(hào)的話,可以在中斷中判斷溢出中斷發(fā)生的次數(shù),這樣就可以得到溢出的次數(shù),從而可以測(cè)量更/低頻率的信號(hào)   5,Ti

51、mer_A的計(jì)數(shù)模式計(jì)數(shù)模式有:增計(jì)數(shù)模式,連續(xù)計(jì)數(shù)模式和增減計(jì)數(shù)模式。具體的各個(gè)模式的詳解,參見(jiàn)用戶指南。   6,定時(shí)器的定時(shí)中斷在使用定時(shí)器的定時(shí)中斷時(shí),要注意定時(shí)器計(jì)數(shù)模式的選擇。在使用中斷時(shí),要注意中斷向量的使用和中斷源的判斷,下面就舉一個(gè)例子,注釋的也較詳細(xì):#include <msp430g2553.h> unsigned int t=0; void main(void)  WDTCTL = WDTPW + WDTHOL

52、D;                 / Stop WDT  P1DIR |= 0x01;                       &#

53、160;    / P1.0 output   CCTL0 = CCIE;   / CCTLx是捕獲/比較控制寄存器   interrupt enabled  CCIE=0x0010  時(shí)能定時(shí)器A中斷   CCR0 = 50000;   /捕獲/比較寄存器  

54、0;設(shè)置計(jì)數(shù)器CCR0的初值  16位寄存器,最大值為65535                /默認(rèn)SMCLK使用的是DCO,默認(rèn)的DCO大約為800KHz,而CCR0=50000,所以中斷產(chǎn)生的頻率大約為16Hz  TACTL = TASSEL_2 + MC_2;       

55、0;          / SMCLK, contmode  連續(xù)計(jì)數(shù)模式從0計(jì)到0FFFFh  /TACTL = TASSEL_2 + MC_1;                  / SMCLK, 

56、;upmode  增計(jì)數(shù)模式從0計(jì)到CCR0   _BIS_SR(LPM0_bits + GIE);                 / Enter LPM0 w/ interrupt  進(jìn)入低功耗模式0,允許中斷 / Timer A0 interrupt&#

57、160;service routine#pragma vector=TIMER0_A0_VECTOR_interrupt void Timer_A (void)    /CCIFG中斷被響應(yīng)后,該標(biāo)志位自動(dòng)清零   /P1OUT = 0x01;                  

58、          / Toggle P1.0t+;if(t=5)P1OUT = BIT0;           / Toggle P1.0t=0;   CCR0 += 50000;        &

59、#160;                   / Add Offset to CCR0  增加CCR0偏移      /定時(shí)器總是從0開(kāi)始往上計(jì)數(shù),一直到計(jì)滿再?gòu)?開(kāi)始,在連續(xù)計(jì)數(shù)模式下,當(dāng)定時(shí)器的值等于CCR0時(shí),產(chǎn)生中斷  /在中斷中對(duì)CCR0增加50000,這樣

60、的話定時(shí)器從當(dāng)前值到下一時(shí)刻再次等于CCR0時(shí)的間隔為50000,恒定  /這樣產(chǎn)生中斷的時(shí)間間隔就相等了 /所以在連續(xù)計(jì)數(shù)模式下,要想使中斷的時(shí)間間隔一定,就要有CCR0 += n;這句話                              

61、                /在中斷中CCR0不需要從新賦值,區(qū)別于51 中斷的使用注意情況:還是把舉個(gè)例子吧:#include <msp430g2553.h> void main(void)  WDTCTL = WDTPW + WDTHOLD;      

62、60;          / Stop WDT  P1DIR |= 0x01;                            / P1.0&#

63、160;output  TACTL = TASSEL_2 + MC_2 + TAIE;           / SMCLK, contmode, interrupt  TAIE允許定時(shí)器溢出中斷   _BIS_SR(LPM0_bits + GIE);     

64、            / Enter LPM0 w/ interrupt  GIE允許中斷 / Timer_A3 Interrupt Vector (TA0IV) handler#pragma vector=TIMER0_A1_VECTOR_interrupt void Timer_A(void) switch(&#

65、160;TA0IV )    /TAIV中斷向量寄存器  用于    case  2: break;                          / CCR1 not

66、0;used   捕獲/比較器1   case  4: break;                          / CCR2 not used    捕獲/比較器2

67、0;  case 10: P1OUT = 0x01;                  / overflow  定時(shí)器溢出            break;    &#

68、160; 7,注意:定時(shí)器Timer0_A的時(shí)鐘可以選擇為外接時(shí)鐘輸入TACLK(P10),這樣當(dāng)外接一個(gè)信號(hào)時(shí),定時(shí)器Timer0_A就相當(dāng)于一個(gè)計(jì)數(shù)器使用。這樣就可以用Timer0_A接外接信號(hào),Timer1_A接標(biāo)準(zhǔn)的時(shí)鐘如32768Hz的晶振,就可以實(shí)現(xiàn)等精度測(cè)頻了。其實(shí)Timer1_A的時(shí)鐘也可以外接的,但是在g2553中沒(méi)有這個(gè)外接管腳(P37),所以就只能選擇正常的時(shí)鐘了。Timer0_A的外接時(shí)鐘輸入TACLK(P10)的設(shè)置如下:下面是我實(shí)現(xiàn)等精度測(cè)頻時(shí),兩個(gè)定時(shí)器的初始化程序:void timer0_init()TACTL |= TA

69、SSEL_0+MC_2+TACLR;  /選擇TACLK時(shí)鐘作為計(jì)數(shù)時(shí)鐘源,不分頻   必須連續(xù)計(jì)數(shù)模式 P1SEL |= BIT0;   /P10為T(mén)imer0_A的時(shí)鐘TACLK輸入,接外部待測(cè)信號(hào),這樣Timer0_A就當(dāng)作計(jì)數(shù)器用/Timer1_A采用ACLK作為時(shí)鐘源計(jì)數(shù),這樣ACLK就相當(dāng)于是標(biāo)準(zhǔn)信號(hào),這樣兩個(gè)定時(shí)器相當(dāng)于都工作在計(jì)數(shù)器方式,/ACLK 32768Hz作為標(biāo)準(zhǔn)信號(hào),這樣可以實(shí)現(xiàn)等精度測(cè)頻void timer1_init() TA

70、1CCTL0 = CCIE;TA1CCR0 = 32768;    /1s定時(shí) TA1CTL |= TASSEL_1+MC_2+TACLR;  /選擇ACLK時(shí)鐘作為計(jì)數(shù)時(shí)鐘源,不分頻   必須連續(xù)計(jì)數(shù)模式 8,用定時(shí)器和比較器可以實(shí)現(xiàn)DAC   使用定時(shí)器也可以實(shí)現(xiàn)串口通信 (四),ADC10 1,ADC10是十位的AD,在g2553上有A0A7八個(gè)可以外接的AD通道,A10

71、接到片上的溫度傳感器上,其他的通道都接在內(nèi)部的V或GND上。因?yàn)槭菫榈乃杂?jì)算公式如下: 2 ,ADC參考電壓的選擇:ADC的參考電壓可以為: 由ADC控制寄存器0 ADC10CTL0控制。但是要提高ADC的精度的話,盡量不要用內(nèi)部的參考電壓,最好外接一個(gè)比較穩(wěn)定的電壓作為參考電壓,因?yàn)閮?nèi)部的產(chǎn)生的參考電壓不是特別穩(wěn)定或精度不是特別的高。例如我在使用時(shí)遇到的情況如下:Vref設(shè)為2.5V  但實(shí)際的值大概為2.475V, 選擇VCC  VSS作為參考,用電壓表測(cè)得大概為3.58V  還是不小的偏差的。另外,在有可能

72、的情況下,盡量采用較大的VR+和VR-,以減小紋波對(duì)采樣結(jié)果的影響。    3,ADC10的采樣方式有:?jiǎn)瓮ǖ绬未尾蓸?,單通道多次采樣,多通道單次采樣,多通道多次采樣?,DTC:因?yàn)锳DC10只有一個(gè)采樣結(jié)果存儲(chǔ)寄存器ADC10MEM,所以除了在單通道單次采樣的模式下,其他的三個(gè)模式都必須使用DCT,否則轉(zhuǎn)換結(jié)果會(huì)不停地被新的結(jié)果給覆蓋。DTC是轉(zhuǎn)換結(jié)果傳送控制,也就是轉(zhuǎn)換結(jié)果可以不用CPU的干預(yù),就可以自動(dòng)地存儲(chǔ)在指定的存儲(chǔ)空間內(nèi)。使用這種方式轉(zhuǎn)換速度快,訪問(wèn)方便,適用于高速采樣模式中。DTC的使用可以從下面的例子中很容易看明白:#include &

73、lt;msp430g2553.h>#include "ser_12864.h"uchar s1="DTC:"uchar s2="2_cha_2_time_DTC"void ADC_init() ADC10CTL1 = CONSEQ_3 + INCH_1;     / 2通道多次轉(zhuǎn)換, 最大轉(zhuǎn)換通道為A1  ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE; / ADC10ON, interrupt en

74、abl  參考電壓選默認(rèn)值VCC和VSS  /采樣保持時(shí)間為16 x ADC10CLKs,ADC內(nèi)核開(kāi),中斷使能   MSC多次轉(zhuǎn)換選擇開(kāi)  /如果MSC置位,則第一次開(kāi)始轉(zhuǎn)換時(shí)需要觸發(fā)源觸發(fā)一次,以后的轉(zhuǎn)換會(huì)自動(dòng)進(jìn)行  中斷使能  /使用DTC時(shí),當(dāng)一個(gè)塊傳送結(jié)束,產(chǎn)生中斷  /數(shù)據(jù)傳送控制寄存器0 ADC10DTC0設(shè)置為默認(rèn)模式:?jiǎn)蝹魉蛪K模式,單塊傳送完停止  ADC10DTC1 = 0x04; /數(shù)據(jù)傳送控制寄存器1

75、4 conversions  定義在每塊的傳送數(shù)目  一共采樣4次 所以單塊傳送4次  /以后就停止了傳送 因?yàn)槭莾赏ǖ赖模允敲總€(gè)通道采樣數(shù)據(jù)傳送2次  ADC10AE0 |= BIT0+BIT1;         / P1.0 P1.1 ADC option select 使能模擬輸入腳A0 A1     /不知道為什么,當(dāng)P10 P11都懸空時(shí),采樣值不同,用電壓表測(cè)得

76、懸空電壓不同,但是當(dāng)都接上采樣源的時(shí)候,  /采樣是相同的 void main(void)uint adc_sample8=0;    /存儲(chǔ)ADC序列采樣結(jié)果WDTCTL = WDTPW+WDTHOLD;    BCSCTL1 = CALBC1_12MHZ;  /設(shè)定cpu時(shí)鐘DCO頻率為12MHz    DCOCTL = CALDCO_12MHZ;    P2DIR |=BIT3+B

77、IT4;      /液晶的兩條線    init_lcd();    ADC_init();    wr_string(0,0,s1);    wr_string(0,3,s2);    for (;)           AD

78、C10CTL0 &= ENC;   /ADC不使能  其實(shí)這句話可以放在緊接著CPU喚醒之后的,因?yàn)镃PU喚醒了,說(shuō)明我們想要的     /轉(zhuǎn)換數(shù)據(jù)傳送完成了,如果ADC繼續(xù)轉(zhuǎn)換,那么轉(zhuǎn)換結(jié)果也不再傳輸,是無(wú)用的。所以緊接著放在CPU喚醒之后     /計(jì)時(shí)關(guān)閉ADC,有利于降低功耗        while (ADC10CTL1 & BUSY);&#

79、160;              / Wait if ADC10 core is active  等待忙        ADC10SA = (unsigned int)adc_sample;   /數(shù)據(jù)傳送開(kāi)始地址寄存器  設(shè)置DTC的開(kāi)始地址  Data buffer start

80、60;       /設(shè)置數(shù)據(jù)開(kāi)始傳送的地址為數(shù)組adc_sample的首地址,因?yàn)榧拇嫫鰽DC10SA和轉(zhuǎn)換結(jié)果都是16位的,所以要把        /地址強(qiáng)制轉(zhuǎn)換為16位的int或unsigned int        /應(yīng)該也可以用指針直接訪問(wèn)DTC的存儲(chǔ)區(qū),還沒(méi)試過(guò)        

81、/例如:前面定義了單塊傳送4次數(shù)據(jù),所以每次傳送完成了一個(gè)塊,也就是4次,就會(huì)把中斷標(biāo)志位置位,產(chǎn)生中斷        /因?yàn)樯厦嬖O(shè)置的地址為數(shù)組adc_sample的首地址,所以每次轉(zhuǎn)換的結(jié)果就會(huì)傳送到該數(shù)組的前4位上,所以如果        /一切正常的話,數(shù)組里應(yīng)該是前4位為轉(zhuǎn)換的結(jié)果,后4位為初始值0  通過(guò)下面的顯示,驗(yàn)證轉(zhuǎn)換是正確的      &

82、#160; /一次觸發(fā)首先對(duì)A1、A0采樣,放入a0和a1中,再對(duì)A1、A0采樣,放入a2和a3中。如此循環(huán)下去。        /驗(yàn)證得知,當(dāng)多通道采樣時(shí),先采高的通道,再采低的通道。如上面每次采樣時(shí),先采A1 再A0        /因?yàn)橐还膊蓸觽魉?次,所以數(shù)組的后4位為初始值0         ADC10CTL0 |= ENC +

83、 ADC10SC; / Sampling and conversion start   ADC使能,開(kāi)始轉(zhuǎn)換 ADC10SC為采樣觸發(fā)源        /不需要cpu的干預(yù),DTC就可以把采樣結(jié)果存儲(chǔ)到指定的存儲(chǔ)區(qū)中        _bis_SR_register(CPUOFF + GIE);    / LPM0, ADC10_ISR will force exit&

84、#160; 如果轉(zhuǎn)換結(jié)果傳送完成,        /就會(huì)進(jìn)入中斷,CPU喚醒 繼續(xù)往下運(yùn)行        wr_int(2,0,adc_sample0);   /顯示轉(zhuǎn)換結(jié)果  A1        wr_int(6,0,adc_sample1);   /A0 

85、       wr_int(0,1,adc_sample2);   /A1        wr_int(3,1,adc_sample3);   /A0        wr_int(6,1,adc_sample4);        

86、wr_int(0,2,adc_sample5);        wr_int(3,2,adc_sample6);        wr_int(6,2,adc_sample7);       / ADC10 interrupt service routine#pragma vector=ADC10_VECTOR_interrupt void ADC10_ISR(void

87、)  /中斷響應(yīng)以后,中斷標(biāo)志位自動(dòng)清零  _bic_SR_register_on_exit(CPUOFF);        / Clear CPUOFF bit from 0(SR)上面的例子是把存儲(chǔ)結(jié)果存儲(chǔ)在了uint型的數(shù)組中。也可以用指針直接指定要存放的地址,然后再用指針進(jìn)行訪問(wèn)(理論上可以,但還沒(méi)有試過(guò))。也可以把存儲(chǔ)結(jié)果直接存放在一個(gè)16位的寄存器中,如:ADC10SA = (unsigned int)&TACCR1;   &

88、#160;    / Data transfer location  把轉(zhuǎn)換結(jié)果存儲(chǔ)在TACCR1所在的    /位置處,就相當(dāng)于存儲(chǔ)在TACCR1中 因?yàn)锳DC轉(zhuǎn)換結(jié)果和寄存器TACCR1都是16位的,所以要把地址強(qiáng)制轉(zhuǎn)換為16位的    /int 或 unsigned int型 5,ADC采樣注意事項(xiàng):用片上的ADC10進(jìn)行采樣,如果外部分壓電路的電阻過(guò)大(比如幾K以上),AD引腳會(huì)把電壓拉高,使采樣結(jié)果發(fā)生很大的偏差。應(yīng)換成小電阻(幾十幾百

89、歐),如果要求更精確的話,要加運(yùn)放進(jìn)行電壓跟隨。  6,AD采樣交流信號(hào):一般是50Hz,100Hz,1000Hz。方法是在交流信號(hào)的一個(gè)周期內(nèi)采樣多次(如40次,30次等),然后利用公式可以求出交流信號(hào)的有效值,平均值等。  7,片上溫度傳感器ADC的A10通道接片上的溫度傳感器,MSP430內(nèi)嵌的溫度傳感器實(shí)際上就是一個(gè)輸出電壓隨環(huán)境溫度而變化的溫度二極管。當(dāng)使用片上溫度傳感器時(shí),采樣周期必須大于30us    片上溫度傳感器的偏移很大,所以精確測(cè)量需要進(jìn)行校準(zhǔn)。選擇片上溫度傳感器INCH_10,ADC其他的設(shè)

90、置都和外部通道的設(shè)置相同,包括參考電壓源的選擇和轉(zhuǎn)換存儲(chǔ)的選擇選擇了片上溫度傳感器,會(huì)自動(dòng)地打開(kāi)片上參考電壓源發(fā)生器作為溫度傳感器的電壓源,但是這并不會(huì)時(shí)能VREF+輸出,也不會(huì)影響AD轉(zhuǎn)換參考源的選擇,轉(zhuǎn)換參考源的選擇和其他通道的選擇相同公式為:VTEMP=0.00355(TEMPC)+0.986片上溫度傳感器的校準(zhǔn),可以參見(jiàn)我的溫度傳感器校準(zhǔn)程序,也可以參考其他的論文。下面只給出程序的一部分:void ADC_init()ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; / ADC10ON, interrupt enabled 參考電壓選默認(rèn)值VCC和

91、VSS/采樣保持時(shí)間為16 x ADC10CLKs,ADC開(kāi),中斷使能ADC10CTL1 = INCH_10;       / ADC輸入通道選擇A10,為內(nèi)部的溫度傳感器/其他是默認(rèn),采樣觸發(fā)輸入源選擇為ADC10SC,采樣輸入信號(hào)不翻轉(zhuǎn),轉(zhuǎn)換時(shí)鐘選擇內(nèi)部時(shí)鐘源:ADC10OSC,3.76.3MHz/不分頻,單通道單次轉(zhuǎn)換/ADC10AE0 |= 0x02;              

92、           / PA.1 ADC option select 使能模擬輸入腳A1/P1DIR |= 0x01;                            / Set P1.0 to out

93、put direction  /所以是P11為ADC輸入腳,P10控制led  (五),通用串行通信接口(USCI)   1,USCI_A:支持UART,  IrDA,  SPI      USCI_B:支持I2C, SPI   2,UART   這個(gè)模塊沒(méi)什么好說(shuō)的,和其他的一寫(xiě)處理器如S12,ARM等差不多。只要設(shè)置好幾個(gè)控制寄存器,波特率,寫(xiě)幾個(gè)收發(fā)函數(shù)就可以了

94、。下面就給出msp430g2553于PC用UART通信的基本程序:#include  "msp430g2553.h"unsigned char rev;char *string1="Helloworld!"char string2="Get it!n"    /n是換行符void putchar(unsigned char c)    /發(fā)送字符函數(shù)while (!(IFG2&UCA0TXIFG);  

95、60;             / USCI_A0 TX buffer ready? 等待TX buffer為空UCA0TXBUF = c;                    / TX -> RXed character  發(fā)送字符cvoi

96、d putstr(char *s)   /發(fā)送字符串函數(shù)IE2 &= UCA0RXIE;   /發(fā)送時(shí)先關(guān)閉接收中斷,不接收while(*s)!='0')    /如果沒(méi)有發(fā)完,就繼續(xù)循環(huán)發(fā)送putchar(*s);/ putchar('n');     /發(fā)送換行符s+;IE2 |= UCA0RXIE;    /發(fā)送完了打開(kāi)接收中斷void main(void)&#

97、160; WDTCTL = WDTPW + WDTHOLD;                 / Stop WDT  P1DIR=BIT0;  BCSCTL1 = CALBC1_1MHZ;                

98、    / Set DCO 為1MHz  DCOCTL = CALDCO_1MHZ;  P1SEL = BIT1 + BIT2 ;                     / P1.1 = RXD, P1.2=TXD  P1SEL2 = BIT1 + BIT2;  &#

99、160;  /第二外圍模式選擇/  UCA0CTL1 |= UCSSEL_2;           / SMCLK 其他默認(rèn):軟件復(fù)位使能 USCI邏輯保持在復(fù)位狀態(tài),用于設(shè)置串口  /UCA0CTL0全部為默認(rèn)狀態(tài):無(wú)奇偶校驗(yàn),LSB first,8bit_data,一位停止位,UART模式,異步模式/  UCA0BR0 = 8;      &#

100、160;                       / SMCLK 1MHz 115200    8/  UCA0BR1 = 0;               

101、;               / 1MHz 115200/  UCA0MCTL = UCBRS2 + UCBRS0;               / Modulation UCBRSx = 5  /下面是選擇ACLK,波特率設(shè)置為固定的  

102、;UCA0CTL1 |= UCSSEL_1;      /ACLK  UCA0BR0 = 3;                              / ACLK 32768Hz 9600  &#

103、160;32768Hz/9600 = 3.41  UCA0BR1 = 0;                              / 32768Hz 9600  UCA0MCTL = UCBRS1 + UCBRS0;               / Modulation UCBRSx = 3  UCA0CTL1 &= UCSWRST;           

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論