




已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
電設(shè)工作小結(jié)之MSP430G2553學(xué)習(xí)筆記1一,MSP430G2553單片機(jī)的各個功能模塊(一),IO口模塊,1,我們所用的MSP430G2553有兩組IO口,P1和P2。2,IO口的寄存器有:方向選擇寄存器PxDIR,輸出寄存器PxOUT,輸入寄存器PxIN,IO口內(nèi)部上拉或下拉電阻使能寄存器PxREN,IO口功能選擇寄存器PxSEL和PxSEL2,IO口中斷使能寄存器PxIE,中斷沿選擇寄存器PxIES,IO口中斷標(biāo)志寄存器PxIFG。3,所有的IO都帶有中斷,其中所有的P1口公用一個中斷向量,所有的P2口公用一個中斷向量。所以在使用中斷時,當(dāng)進(jìn)入中斷后,還要判斷到底是哪一個IO口產(chǎn)生的中斷,判斷方法可以是判斷各個IO口的電平。4,中斷標(biāo)志PxIFG需要軟件清除,也可以用軟件置位,從而用軟件觸發(fā)一個中斷。注意:在設(shè)置PxIESx時根據(jù)PxINx有可能會引起相應(yīng)的PxIFGx置位(具體的情況見用戶指南),所以在初始化完IO口中斷以后,正式使用IO中斷前要先將對應(yīng)的PxIFGx清零。程序如下:voidIO_interrupt_init()/IO中斷初始化函數(shù)P1REN|=BIT4+BIT5+BIT6+BIT7;/pull up內(nèi)部上拉電阻使能/使用中斷時,使能內(nèi)部的上拉電阻這樣當(dāng)該腳懸空是,電平不會跳變,防止懸空時電平跳變不停的觸發(fā)中斷P1OUT=BIT4+BIT5+BIT6+BIT7;/當(dāng)引腳上的上拉或下拉電阻使能時,PxOUT選擇是上拉還是下來/0:下拉,1:上拉P1IE|=BIT4+BIT5+BIT6+BIT7;/interruptenabledP13中斷使能P1IES|=BIT4+BIT5+BIT6+BIT7;/Hi/loedge下降沿中斷/P1IES&=BIT3;/上升沿觸發(fā)中斷P1IFG&=(BIT4+BIT5+BIT6+BIT7);/中斷標(biāo)志位清零5,PxOUT:如果引腳選擇了內(nèi)部的上拉或下拉電阻使能,則PxOUT設(shè)定電阻是上拉還是下拉,0:下拉,1:上拉6,當(dāng)IO口不用時,最好不要設(shè)為輸入,且為浮動狀態(tài)(這是IO口的默認(rèn)狀態(tài)),因?yàn)楫?dāng)輸入為浮動時,輸入電壓有可能會在VIL和VIH之間,這樣會產(chǎn)生擊穿電流。所以不用的IO口可以設(shè)為輸出狀態(tài),或設(shè)為輸入狀態(tài)但通過外圍電路接至VCC或GND,或接一個上拉/下拉電阻。7,當(dāng)使用msp430g2553的IO口時要注意,因?yàn)間2553的IO口寄存器的操作,不像51,它不能單獨(dú)針對某一位進(jìn)行操作,必須對整個寄存器進(jìn)行操作。所以就不像51,g2553不可以定義bit型的數(shù)據(jù)。所以在使用msp的IO口時要注意對需要位的操作,而不要影響其他無關(guān)的位,可以用|&等按位操作的符號。在使用IO都控制其他外圍模塊時也要注意要使用的IO口的定義,可以用如下的定義方法:#defineCLR_RSP2OUT&=BIT0;/RS=P2.0#defineSET_RSP2OUT|=BIT0;#defineCLR_RWP2OUT&=BIT1;/RW=P2.1#defineSET_RWP2OUT|=BIT1;#defineCLR_ENP2OUT&=BIT2;/EN=P2.2#defineSET_ENP2OUT|=BIT2;#defineDataPortP1OUT8,g2553的P27和P26腳分別接外部晶體的輸出和輸入腳XOUT和XIN,默認(rèn)是自動設(shè)為了晶振管腳功能,但是當(dāng)想把它們用為普通的IO時,也可以,設(shè)置對應(yīng)的SEL設(shè)為普通的IO即可,如下:P2DIR|=BIT6+BIT7;/把P26和P27配置為普通IO并為輸出腳默認(rèn)為晶振的輸入和輸出引腳作為dac0832的P2SEL&=(BIT6+BIT7);/cs和wr控制端P2SEL2&=(BIT6+BIT7);(二),時鐘系統(tǒng)1,msp430能做到超低功耗,合理的時鐘模塊是功不可沒的。但是功能強(qiáng)大的時鐘模塊設(shè)置起來也相對復(fù)雜一些。2,msp430的時鐘源有:(1),外接低頻晶振LFXT1CLK:低頻模式接手表晶體32768Hz,高頻模式450KHz8MHz;(2),外接高速晶振XT2CLK:8MHz;(3),內(nèi)部數(shù)字控制振蕩器DCO:是一個可控的RC振蕩器,頻率在016MHz;(4),超低功耗低頻振蕩器VLO:不可控,420KHz典型值為12KHz;3,時鐘模塊:430的時鐘模塊有MCLKSMCLKACLK:(1),主系統(tǒng)時鐘MCLK:提供給MSP430的CPU時鐘??梢詠碜訪FXT1CLKXT2CLKDCOVLO可選,默認(rèn)為DCO。(2),子系統(tǒng)時鐘SMCLK:提供給高速外設(shè)??梢詠碜訪FXT1CLKXT2CLKDCOVLO可選,默認(rèn)為DCO。(3),輔助系統(tǒng)時鐘ACLK:提供給低速外設(shè)??蓙碜訪FXT1CLKVLO。4,內(nèi)部的振蕩器DCO和VLO提供的時鐘頻率不是很精確,隨外部環(huán)境變化較大。DCO默認(rèn)的頻率大概為800KHz,但我用示波器觀察的為1.086MHz左右,當(dāng)DCO設(shè)置的過高時,用示波器可以看到波形不再是方波,而是類似于正弦波。DCO可以用CCS提供的宏定義進(jìn)行相對比較精確的設(shè)置,如下:DCOCTL=CALDCO_12MHZ;/DCO設(shè)為12MHz這種方法設(shè)DCO頻率比較精確,實(shí)際測得為12.08MHz左右正弦波BCSCTL1=CALBC1_12MHZ;用這種方法可以設(shè)置1,8,12,16MHz宏定義如下:#ifndef_DisableCalDataSFR_8BIT(CALDCO_16MHZ);SFR_8BIT(CALBC1_16MHZ);SFR_8BIT(CALDCO_12MHZ);SFR_8BIT(CALBC1_12MHZ);SFR_8BIT(CALDCO_8MHZ);SFR_8BIT(CALBC1_8MHZ);SFR_8BIT(CALDCO_1MHZ);SFR_8BIT(CALBC1_1MHZ);#endif5,使用超低功耗低頻振蕩器VLO可以很大程度地降低系統(tǒng)功耗,下面的例子是設(shè)置ACLK為VLO,MCLK為VLO的8分頻:#include/1延時/#defineCPU_F(double)16000000)/cpufrequency16000000#defineCPU_F(double)1630)/cpufrequency1630/CPU的實(shí)際MCLK大約為13.05/8=1.63KHz#definedelay_us(x)_delay_cycles(long)(CPU_F*(double)x/1000000.0)#definedelay_ms(x)_delay_cycles(long)(CPU_F*(double)x/1000.0)voidmain(void)volatileunsignedinti;/VolatiletopreventremovalWDTCTL=WDTPW+WDTHOLD;/StopwatchdogtimerBCSCTL3|=LFXT1S_2;/LFXT1=VLO低頻時鐘選擇為VLOACLK選為VLOIFG1&=OFIFG;/ClearOSCFaultflag清除振蕩器錯誤中斷標(biāo)志_bis_SR_register(SCG1+SCG0);/StopDCOSCG1禁止SMCLKSCG0禁止DCOBCSCTL2|=SELM_3+DIVM_3;/MCLK=LFXT1/8/因?yàn)榍懊嬉呀?jīng)選擇了LFXT1=VLO所以MCLK選為VLO8分頻所以CPU的MCLK大約為1.5KHzP1DIR=0xFF;/AllP1.xoutputsP1OUT=0;/AllP1.xresetP2DIR=0xFF;/AllP2.xoutputsP2OUT=0;/AllP2.xresetP1SEL|=BIT0+BIT4;/P10P14options功能選擇為外圍模塊/p10輸出ACLK,來自VLO,p14輸出SMCLK,因?yàn)榻沽薙MCLK,所以P14腳無波形輸出/VLO典型值為12KHz實(shí)際用示波器測得為:13.05KHz左右波動/所以CPU的實(shí)際MCLK大約為13.05/8=1.63KHzfor(;)P1OUT=BIT6;/P1.6閃爍delay_ms(1000);6,如上面的程序所示,其中的延遲函數(shù)用那種方法,使用系統(tǒng)的延遲周期函數(shù)_delay_cycles(intn);可以達(dá)到比較精確的延遲,如下:/more_/1延時/#defineCPU_F(double)16000000)/cpufrequency16000000#defineCPU_F(double)12000000)/cpufrequency12000000#definedelay_us(x)_delay_cycles(long)(CPU_F*(double)x/1000000.0)#definedelay_ms(x)_delay_cycles(long)(CPU_F*(double)x/1000.0)/2空函數(shù)#definenop()_NOP();7,系統(tǒng)上電后默認(rèn)使用的是DCO時鐘,DCO默認(rèn)的頻率大概為800KHz,但我用示波器觀察的為1.086MHz左右,當(dāng)DCO設(shè)置的過高時,用示波器可以看到波形不再是方波,而是類似于正弦波。(三),定時器Timer_A1,MSP430g2553具有兩個16位的定時器:Timer0_ATimer1_A。分別具有三個捕捉/比較寄存器,具有輸入捕捉,輸出比較功能。可以產(chǎn)生定時中斷,也可以產(chǎn)生PWM。2,產(chǎn)生PWM,例子如下:#includevoidTimer_A0_1_init()/TA0.1輸出PWMTACTL|=TASSEL_1+MC_1;/ACLK,增計(jì)數(shù)CCTL1=OUTMOD_7;/輸出模式為復(fù)位/置位CCR0=328;/時鐘頻率為32768HZ,100HZ/CCR1=164;/時鐘頻率為32768HZ,占空比CCR1/CCR0=50%CCR1=109;/占空比CCR1/CCR0=1/3TA0.1由P1.2P1.6輸出voidTimer_A1_2_init()/TA1.2輸出PWMTA1CTL|=TASSEL_1+MC_1;/ACLK,增計(jì)數(shù)TA1CCTL2=OUTMOD_7;/輸出模式為復(fù)位/置位,注意CCTL2要寫為TA1CCTL2TA1CCR0=164;/時鐘頻率為32768HZ,波形32768/CCR0=199HZTA1CCR2=41;/占空比CCR2/CCR0=1/4,注意CCR2要寫成TA1CCR2TA1.2由P2.4P2.5輸出voidTimer_A1_1_init()/TA1.1輸出PWMTA1CCTL1=OUTMOD_7;TA1CCR1=123;/占空比CCR1/CCR0=3/4,注意CCR1要寫成TA1CCR1TA1.1由P2.1P2.2輸出voidIO_init()P1SEL|=BIT2+BIT6;P1DIR|=BIT2+BIT6;/P1.2P1.6輸出TA0.1OUT1P2SEL|=BIT4+BIT5;P2DIR|=BIT4+BIT5;/P2.4P2.5輸出TA1.2OUT2P2SEL|=BIT1+BIT2;P2DIR|=BIT1+BIT2;/P2.1P2.2輸出TA1.1OUT1voidmain(void)WDTCTL=WDTPW+WDTHOLD;IO_init();Timer_A0_1_init();Timer_A1_2_init();Timer_A1_1_init();_BIS_SR(CPUOFF);/EnterLPM0進(jìn)入低功耗模式0SMCLKON,ACLKON3,Timer_A的捕獲/比較寄存器TAR寄存器是Timer_A的16位的計(jì)數(shù)寄存器。TACCRx是Timer_A的捕獲/比較寄存器,當(dāng)為捕獲模式時:當(dāng)捕獲發(fā)生時,把TAR的值裝載到TACCRx中。當(dāng)為比較模式時:TACCRx中裝的是要與TAR寄存器相比較的值。4,捕獲模式捕獲外部輸入的信號的上升沿或下降沿或上升沿下降沿都捕捉,當(dāng)捕捉發(fā)生時,把TAR的值裝載到TACCRx中,同時也可以進(jìn)入中斷,執(zhí)行相應(yīng)的操作。這樣利用捕捉上升沿或下降沿就可以計(jì)算外部輸入信號的周期,得出頻率。利用捕捉上升沿和下降沿可以得出輸入信號的高電平或低電平的持續(xù)時間。也可以算出占空比。下面是一個例子,是Timer_A捕獲初始化的程序:voidtimer_init()/使用Timer1_A時要特別注意各個寄存器的寫法,因?yàn)門imer0_A的寄存器都簡寫了,所以在寫/Timer1_A的寄存器時,要特別注意與Timer0_A的不同P1SEL|=BIT2;/選擇P12作為捕捉的輸入端子Timer0_A/TACCTL1|=CM_3+SCS+CAP+CCIE;/上下沿都觸發(fā)捕捉,用于測脈寬,同步模式、時能中斷CCI1ATACCTL1|=CM_1+SCS+CAP+CCIE;/上升沿觸發(fā)捕捉,同步模式、時能中斷CCI1ATACTL|=TASSEL1+MC_2;/選擇SMCLK時鐘作為計(jì)數(shù)時鐘源,不分頻增計(jì)數(shù)模式不行,必須連續(xù)計(jì)數(shù)模式P2SEL|=BIT1;/選擇P21作為捕捉的輸入端子Timer1_A/TA1CCTL1|=CM_3+SCS+CAP+CCIE;/上下沿都觸發(fā)捕捉,用于測脈寬,同步模式、時能中斷CCI1ATA1CCTL1|=CM_1+SCS+CAP+CCIE;/上升沿觸發(fā)捕捉,同步模式、時能中斷CCI1ATA1CTL|=TASSEL1+MC_2;/選擇SMCLK時鐘作為計(jì)數(shù)時鐘源,不分頻增計(jì)數(shù)模式不行,必須連續(xù)計(jì)數(shù)模式相對應(yīng)的中斷函數(shù)如下:#pragmavector=TIMER0_A1_VECTOR/Timer0_ACC1的中斷向量_interruptvoidTimer_A(void)/CCI0A使用的捕捉比較寄存器是TA0CCR0,TA0CCR0單獨(dú)分配給一個/中斷向量TIMER1_A0_VECTOR,所以進(jìn)入中斷后直接就是Timer0_ACC0產(chǎn)生的中斷,不用經(jīng)過類似/下面的方法判斷中斷源了。/Timer0_ACC1-4,TA0公用一個中斷向量TIMER0_A1_VECTOR,所以進(jìn)入了中斷后還要用下面/的方法進(jìn)行判斷是哪一個中斷源產(chǎn)生的中斷switch(TAIV)/如果是Timer0_ACC1產(chǎn)生的中斷case2:flag=1;LPM1_EXIT;/退出低功耗模式/_BIC_SR_IRQ(LPM1_bits);/_bic_SR_register_on_exit(LPM1_bits);break;case4:break;case10:break;#pragmavector=TIMER1_A1_VECTOR/Timer1_ACC1的中斷向量_interruptvoidTimer_A1(void)/P1OUT|=BIT0;/led調(diào)試用的/LPM1_EXIT;/退出低功耗模式因?yàn)槭褂玫氖荂CI0A使用的捕捉比較寄存器是TA1CCR0,TA1CCR0單獨(dú)分配給一個/中斷向量TIMER1_A0_VECTOR,所以進(jìn)入中斷后直接就是Timer1_ACC0產(chǎn)生的中斷,不用經(jīng)過類似/下面注釋掉的方法判斷。/而Timer1_ACC1-4,TA1則公用一個中斷向量TIMER1_A1_VECTOR,所以進(jìn)入了中斷后還要用下面/的方法進(jìn)行判斷是哪一個中斷源產(chǎn)生的中斷switch(TA1IV)/如果是Timer1_ACC1產(chǎn)生的中斷case2:flag=2;LPM1_EXIT;/退出低功耗模式/_BIC_SR_IRQ(LPM1_bits);/_bic_SR_register_on_exit(LPM1_bits);break;case4:break;case10:break;/如果要測量更低頻率的信號的話,可以在中斷中判斷溢出中斷發(fā)生的次數(shù),這樣就可以得到溢出的次數(shù),從而可以測量更/低頻率的信號5,Timer_A的計(jì)數(shù)模式計(jì)數(shù)模式有:增計(jì)數(shù)模式,連續(xù)計(jì)數(shù)模式和增減計(jì)數(shù)模式。具體的各個模式的詳解,參見用戶指南。6,定時器的定時中斷在使用定時器的定時中斷時,要注意定時器計(jì)數(shù)模式的選擇。在使用中斷時,要注意中斷向量的使用和中斷源的判斷,下面就舉一個例子,注釋的也較詳細(xì):#includeunsignedintt=0;voidmain(void)WDTCTL=WDTPW+WDTHOLD;/StopWDTP1DIR|=0x01;/P1.0outputCCTL0=CCIE;/CCTLx是捕獲/比較控制寄存器interruptenabledCCIE=0x0010時能定時器A中斷CCR0=50000;/捕獲/比較寄存器設(shè)置計(jì)數(shù)器CCR0的初值16位寄存器,最大值為65535/默認(rèn)SMCLK使用的是DCO,默認(rèn)的DCO大約為800KHz,而CCR0=50000,所以中斷產(chǎn)生的頻率大約為16HzTACTL=TASSEL_2+MC_2;/SMCLK,contmode連續(xù)計(jì)數(shù)模式從0計(jì)到0FFFFh/TACTL=TASSEL_2+MC_1;/SMCLK,upmode增計(jì)數(shù)模式從0計(jì)到CCR0_BIS_SR(LPM0_bits+GIE);/EnterLPM0w/interrupt進(jìn)入低功耗模式0,允許中斷/TimerA0interruptserviceroutine#pragmavector=TIMER0_A0_VECTOR_interruptvoidTimer_A(void)/CCIFG中斷被響應(yīng)后,該標(biāo)志位自動清零/P1OUT=0x01;/ToggleP1.0t+;if(t=5)P1OUT=BIT0;/ToggleP1.0t=0;CCR0+=50000;/AddOffsettoCCR0增加CCR0偏移/定時器總是從0開始往上計(jì)數(shù),一直到計(jì)滿再從0開始,在連續(xù)計(jì)數(shù)模式下,當(dāng)定時器的值等于CCR0時,產(chǎn)生中斷/在中斷中對CCR0增加50000,這樣的話定時器從當(dāng)前值到下一時刻再次等于CCR0時的間隔為50000,恒定/這樣產(chǎn)生中斷的時間間隔就相等了/所以在連續(xù)計(jì)數(shù)模式下,要想使中斷的時間間隔一定,就要有CCR0+=n;這句話/在中斷中CCR0不需要從新賦值,區(qū)別于51中斷的使用注意情況:還是把舉個例子吧:#includevoidmain(void)WDTCTL=WDTPW+WDTHOLD;/StopWDTP1DIR|=0x01;/P1.0outputTACTL=TASSEL_2+MC_2+TAIE;/SMCLK,contmode,interruptTAIE允許定時器溢出中斷_BIS_SR(LPM0_bits+GIE);/EnterLPM0w/interruptGIE允許中斷/Timer_A3InterruptVector(TA0IV)handler#pragmavector=TIMER0_A1_VECTOR_interruptvoidTimer_A(void)switch(TA0IV)/TAIV中斷向量寄存器用于case2:break;/CCR1notused捕獲/比較器1case4:break;/CCR2notused捕獲/比較器2case10:P1OUT=0x01;/overflow定時器溢出break;7,注意:定時器Timer0_A的時鐘可以選擇為外接時鐘輸入TACLK(P10),這樣當(dāng)外接一個信號時,定時器Timer0_A就相當(dāng)于一個計(jì)數(shù)器使用。這樣就可以用Timer0_A接外接信號,Timer1_A接標(biāo)準(zhǔn)的時鐘如32768Hz的晶振,就可以實(shí)現(xiàn)等精度測頻了。其實(shí)Timer1_A的時鐘也可以外接的,但是在g2553中沒有這個外接管腳(P37),所以就只能選擇正常的時鐘了。Timer0_A的外接時鐘輸入TACLK(P10)的設(shè)置如下:下面是我實(shí)現(xiàn)等精度測頻時,兩個定時器的初始化程序:voidtimer0_init()TACTL|=TASSEL_0+MC_2+TACLR;/選擇TACLK時鐘作為計(jì)數(shù)時鐘源,不分頻必須連續(xù)計(jì)數(shù)模式P1SEL|=BIT0;/P10為Timer0_A的時鐘TACLK輸入,接外部待測信號,這樣Timer0_A就當(dāng)作計(jì)數(shù)器用/Timer1_A采用ACLK作為時鐘源計(jì)數(shù),這樣ACLK就相當(dāng)于是標(biāo)準(zhǔn)信號,這樣兩個定時器相當(dāng)于都工作在計(jì)數(shù)器方式,/ACLK32768Hz作為標(biāo)準(zhǔn)信號,這樣可以實(shí)現(xiàn)等精度測頻voidtimer1_init()TA1CCTL0=CCIE;TA1CCR0=32768;/1s定時TA1CTL|=TASSEL_1+MC_2+TACLR;/選擇ACLK時鐘作為計(jì)數(shù)時鐘源,不分頻必須連續(xù)計(jì)數(shù)模式8,用定時器和比較器可以實(shí)現(xiàn)DAC使用定時器也可以實(shí)現(xiàn)串口通信(四),ADC101,ADC10是十位的AD,在g2553上有A0A7八個可以外接的AD通道,A10接到片上的溫度傳感器上,其他的通道都接在內(nèi)部的V或GND上。因?yàn)槭菫榈乃杂?jì)算公式如下:2 ,ADC參考電壓的選擇:ADC的參考電壓可以為:由ADC控制寄存器0 ADC10CTL0控制。但是要提高ADC的精度的話,盡量不要用內(nèi)部的參考電壓,最好外接一個比較穩(wěn)定的電壓作為參考電壓,因?yàn)閮?nèi)部的產(chǎn)生的參考電壓不是特別穩(wěn)定或精度不是特別的高。例如我在使用時遇到的情況如下:Vref設(shè)為2.5V但實(shí)際的值大概為2.475V, 選擇VCCVSS作為參考,用電壓表測得大概為3.58V還是不小的偏差的。另外,在有可能的情況下,盡量采用較大的VR+和VR-,以減小紋波對采樣結(jié)果的影響。3,ADC10的采樣方式有:單通道單次采樣,單通道多次采樣,多通道單次采樣,多通道多次采樣。4,DTC:因?yàn)锳DC10只有一個采樣結(jié)果存儲寄存器ADC10MEM,所以除了在單通道單次采樣的模式下,其他的三個模式都必須使用DCT,否則轉(zhuǎn)換結(jié)果會不停地被新的結(jié)果給覆蓋。DTC是轉(zhuǎn)換結(jié)果傳送控制,也就是轉(zhuǎn)換結(jié)果可以不用CPU的干預(yù),就可以自動地存儲在指定的存儲空間內(nèi)。使用這種方式轉(zhuǎn)換速度快,訪問方便,適用于高速采樣模式中。DTC的使用可以從下面的例子中很容易看明白:#include #include ser_12864.huchar s1=DTC:;uchar s2=2_cha_2_time_DTC;void ADC_init()ADC10CTL1 = CONSEQ_3 + INCH_1;/ 2通道多次轉(zhuǎn)換, 最大轉(zhuǎn)換通道為A1ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE; / ADC10ON, interrupt enabl參考電壓選默認(rèn)值VCC和VSS/采樣保持時間為16 x ADC10CLKs,ADC內(nèi)核開,中斷使能MSC多次轉(zhuǎn)換選擇開/如果MSC置位,則第一次開始轉(zhuǎn)換時需要觸發(fā)源觸發(fā)一次,以后的轉(zhuǎn)換會自動進(jìn)行中斷使能/使用DTC時,當(dāng)一個塊傳送結(jié)束,產(chǎn)生中斷/數(shù)據(jù)傳送控制寄存器0 ADC10DTC0設(shè)置為默認(rèn)模式:單傳送塊模式,單塊傳送完停止ADC10DTC1 = 0x04; /數(shù)據(jù)傳送控制寄存器1 4 conversions定義在每塊的傳送數(shù)目一共采樣4次 所以單塊傳送4次/以后就停止了傳送 因?yàn)槭莾赏ǖ赖模允敲總€通道采樣數(shù)據(jù)傳送2次ADC10AE0 |= BIT0+BIT1;/ P1.0 P1.1 ADC option select 使能模擬輸入腳A0 A1/不知道為什么,當(dāng)P10 P11都懸空時,采樣值不同,用電壓表測得懸空電壓不同,但是當(dāng)都接上采樣源的時候,/采樣是相同的void main(void)uint adc_sample8=0;/存儲ADC序列采樣結(jié)果WDTCTL = WDTPW+WDTHOLD;BCSCTL1 = CALBC1_12MHZ;/設(shè)定cpu時鐘DCO頻率為12MHzDCOCTL = CALDCO_12MHZ;P2DIR |=BIT3+BIT4;/液晶的兩條線init_lcd();ADC_init();wr_string(0,0,s1);wr_string(0,3,s2);for (;)ADC10CTL0 &= ENC;/ADC不使能其實(shí)這句話可以放在緊接著CPU喚醒之后的,因?yàn)镃PU喚醒了,說明我們想要的/轉(zhuǎn)換數(shù)據(jù)傳送完成了,如果ADC繼續(xù)轉(zhuǎn)換,那么轉(zhuǎn)換結(jié)果也不再傳輸,是無用的。所以緊接著放在CPU喚醒之后/計(jì)時關(guān)閉ADC,有利于降低功耗while (ADC10CTL1 & BUSY);/ Wait if ADC10 core is active等待忙ADC10SA = (unsigned int)adc_sample;/數(shù)據(jù)傳送開始地址寄存器設(shè)置DTC的開始地址Data buffer start/設(shè)置數(shù)據(jù)開始傳送的地址為數(shù)組adc_sample的首地址,因?yàn)榧拇嫫鰽DC10SA和轉(zhuǎn)換結(jié)果都是16位的,所以要把/地址強(qiáng)制轉(zhuǎn)換為16位的int或unsigned int/應(yīng)該也可以用指針直接訪問DTC的存儲區(qū),還沒試過/例如:前面定義了單塊傳送4次數(shù)據(jù),所以每次傳送完成了一個塊,也就是4次,就會把中斷標(biāo)志位置位,產(chǎn)生中斷/因?yàn)樯厦嬖O(shè)置的地址為數(shù)組adc_sample的首地址,所以每次轉(zhuǎn)換的結(jié)果就會傳送到該數(shù)組的前4位上,所以如果/一切正常的話,數(shù)組里應(yīng)該是前4位為轉(zhuǎn)換的結(jié)果,后4位為初始值0通過下面的顯示,驗(yàn)證轉(zhuǎn)換是正確的/一次觸發(fā)首先對A1、A0采樣,放入a0和a1中,再對A1、A0采樣,放入a2和a3中。如此循環(huán)下去。/驗(yàn)證得知,當(dāng)多通道采樣時,先采高的通道,再采低的通道。如上面每次采樣時,先采A1 再A0/因?yàn)橐还膊蓸觽魉?次,所以數(shù)組的后4位為初始值0ADC10CTL0 |= ENC + ADC10SC; / Sampling and conversion startADC使能,開始轉(zhuǎn)換 ADC10SC為采樣觸發(fā)源/不需要cpu的干預(yù),DTC就可以把采樣結(jié)果存儲到指定的存儲區(qū)中_bis_SR_register(CPUOFF + GIE);/ LPM0, ADC10_ISR will force exit如果轉(zhuǎn)換結(jié)果傳送完成,/就會進(jìn)入中斷,CPU喚醒 繼續(xù)往下運(yùn)行wr_int(2,0,adc_sample0);/顯示轉(zhuǎn)換結(jié)果A1wr_int(6,0,adc_sample1);/A0wr_int(0,1,adc_sample2);/A1wr_int(3,1,adc_sample3);/A0wr_int(6,1,adc_sample4);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)/中斷響應(yīng)以后,中斷標(biāo)志位自動清零_bic_SR_register_on_exit(CPUOFF);/ Clear CPUOFF bit from 0(SR)上面的例子是把存儲結(jié)果存儲在了uint型的數(shù)組中。也可以用指針直接指定要存放的地址,然后再用指針進(jìn)行訪問(理論上可以,但還沒有試過)。也可以把存儲結(jié)果直接存放在一個16位的寄存器中,如:ADC10SA = (unsigned int)&TACCR1;/ Data transfer location把轉(zhuǎn)換結(jié)果存儲在TACCR1所在的/位置處,就相當(dāng)于存儲在TACCR1中 因?yàn)锳DC轉(zhuǎn)換結(jié)果和寄存器TACCR1都是16位的,所以要把地址強(qiáng)制轉(zhuǎn)換為16位的/int 或 unsigned int型5,ADC采樣注意事項(xiàng):用片上的ADC10進(jìn)行采樣,如果外部分壓電路的電阻過大(比如幾K以上),AD引腳會把電壓拉高,使采樣結(jié)果發(fā)生很大的偏差。應(yīng)換成小電阻(幾十幾百歐),如果要求更精確的話,要加運(yùn)放進(jìn)行電壓跟隨。6,AD采樣交流信號:一般是50Hz,100Hz,1000Hz。方法是在交流信號的一個周期內(nèi)采樣多次(如40次,30次等),然后利用公式可以求出交流信號的有效值,平均值等。7,片上溫度傳感器ADC的A10通道接片上的溫度傳感器,MSP430內(nèi)嵌的溫度傳感器實(shí)際上就是一個輸出電壓隨環(huán)境溫度而變化的溫度二極管。當(dāng)使用片上溫度傳感器時,采樣周期必須大于30us片上溫度傳感器的偏移很大,所以精確測量需要進(jìn)行校準(zhǔn)。選擇片上溫度傳感器INCH_10,ADC其他的設(shè)置都和外部通道的設(shè)置相同,包括參考電壓源的選擇和轉(zhuǎn)換存儲的選擇選擇了片上溫度傳感器,會自動地打開片上參考電壓源發(fā)生器作為溫度傳感器的電壓源,但是這并不會時能VREF+輸出,也不會影響AD轉(zhuǎn)換參考源的選擇,轉(zhuǎn)換參考源的選擇和其他通道的選擇相同公式為:VTEMP=0.00355(TEMPC)+0.986片上溫度傳感器的校準(zhǔn),可以參見我的溫度傳感器校準(zhǔn)程序,也可以參考其他的論文。下面只給出程序的一部分:void ADC_init()ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; / ADC10ON, interrupt enabled 參考電壓選默認(rèn)值VCC和VSS/采樣保持時間為16 x ADC10CLKs,ADC開,中斷使能ADC10CTL1 = INCH_10;/ ADC輸入通道選擇A10,為內(nèi)部的溫度傳感器/其他是默認(rèn),采樣觸發(fā)輸入源選擇為ADC10SC,采樣輸入信號不翻轉(zhuǎn),轉(zhuǎn)換時鐘選擇內(nèi)部時鐘源:ADC10OSC,3.76.3MHz/不分頻,單通道單次轉(zhuǎn)換/ADC10AE0 |= 0x02;/ PA.1 ADC option select 使能模擬輸入腳A1/P1DIR |= 0x01;/ Set P1.0 to output direction/所以是P11為ADC輸入腳,P10控制led(五),通用串行通信接口(USCI)1,USCI_A:支持UART,IrDA,SPIUSCI_B:支持I2C, SPI2,UART這個模塊沒什么好說的,和其他的一寫處理器如S12,ARM等差不多。只要設(shè)置好幾個控制寄存器,波特率,寫幾個收發(fā)函數(shù)就可以了。下面就給出msp430g2553于PC用UART通信的基本程序:#includemsp430g2553.hunsigned char rev;char *string1=Helloworld!;char string2=Get it!n;/n是換行符void putchar(unsigned char c)/發(fā)送字符函數(shù)while (!(IFG2&UCA0TXIFG);/ USCI_A0 TX buffer ready? 等待TX buffer為空UCA0TXBUF = c;/ TX - RXed character發(fā)送字符cvoid putstr(char *s)/發(fā)送字符串函數(shù)IE2 &= UCA0RXIE;/發(fā)送時先關(guān)閉接收中斷,不接收while(*s)!=0)/如果沒有發(fā)完,就繼續(xù)循環(huán)發(fā)送putchar(*s);/ putchar(n);/發(fā)送換行符s+;IE2 |= UCA0RXIE;/發(fā)送完了打開接收中斷void main(void)WDTCTL = WDTPW + WDTHOLD;/ Stop WDTP1DIR=BIT0;BCSCTL1 = CALBC1_1MHZ;/ Set DCO 為1MHzDCOCTL = CALDCO_1MHZ;P1SEL = BIT1 + BIT2 ;/ P1.1 = RXD, P1.2=TXDP1SEL2 = BIT1 + BIT2;/第二外圍模式選擇/UCA0CTL1 |= UCSSEL_2;/ SMCLK 其他默認(rèn):軟件復(fù)位使能 USCI邏輯保持在復(fù)位狀態(tài),用于設(shè)置串口/UCA0CTL0全部為默認(rèn)狀態(tài):無奇偶校驗(yàn),LSB first,8bit_data,一位停止位,UART模式,異步模式/UCA0BR0 = 8;/ SMCLK 1MHz 1152008/UCA0BR1 = 0;/ 1MHz 115200/UCA0MCTL = UCBRS2 + UCBRS0;/ Modulation UCBRSx = 5/下面是選擇ACLK,波特率設(shè)置為固定的UCA0CTL1 |= UCSSEL_1;/ACLKUCA0BR0 = 3;/ ACLK 32768Hz 960032768Hz/9600 = 3.41UCA0BR1 = 0;/ 32768Hz 9600UCA0MCTL = UCBRS1 + UCBRS0;/ Modulation UCBRSx = 3UCA0CTL1 &= UCSWRST;/ *Initialize USCI state machine*初始化釋放,可以操作IE
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字化背景下紡織業(yè)產(chǎn)業(yè)鏈重構(gòu)考核試卷
- 信托與智能電網(wǎng)信息化融合考核試卷
- 品牌形象與售后服務(wù)關(guān)系探討考核試卷
- 老舍《買彩票》閱讀練習(xí)及答案
- 二手房房屋買賣協(xié)議書合集7篇
- 幼兒園各種安全教育
- 沙家浜活動策劃方案
- 棋牌比賽活動方案
- 榔頭教學(xué)活動策劃方案
- 樓盤義診活動方案
- 《電子料基礎(chǔ)知識》課件
- 采購合規(guī)培訓(xùn)
- 手表鑒定培訓(xùn)課件
- 黨建標(biāo)準(zhǔn)化建設(shè)培訓(xùn)
- 石油勘探合同三篇
- 中日醫(yī)療日語
- 臨時停車場設(shè)施建設(shè)方案
- AQL抽樣標(biāo)準(zhǔn)培訓(xùn)教材
- 天津市2023-2024學(xué)年七年級上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 防汛應(yīng)急預(yù)案 防汛應(yīng)急預(yù)案
- 面向數(shù)據(jù)遷移的超算快線技術(shù)白皮書 2024
評論
0/150
提交評論