新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 電設工作小結之——MSP430G2553學習筆記——2

        電設工作小結之——MSP430G2553學習筆記——2

        作者: 時間:2016-11-28 來源:網絡 收藏
        (四),ADC10

        1,ADC10是十位的AD,在g2553上有A0~A7八個可以外接的AD通道,A10接到片上的溫度傳感器上,其他的通道都接在內部的VCC或GND上。因為是10為的AD所以計算公式如下:

        本文引用地址:http://www.104case.com/article/201611/322837.htm

        2 ,ADC參考電壓的選擇:ADC的參考電壓可以為:

        由ADC控制寄存器0 ADC10CTL0控制。但是要提高ADC的精度的話,盡量不要用內部的參考電壓,最好外接一個比較穩定的電壓作為參考電壓,因為內部的產生的參考電壓不是特別穩定或精度不是特別的高。例如我在使用時遇到的情況如下:

        Vref設為2.5V但實際的值大概為2.475V, 選擇VCCVSS作為參考,用電壓表測得大概為3.58V還是不小的偏差的。

        另外,在有可能的情況下,盡量采用較大的VR+和VR-,以減小紋波對采樣結果的影響。

        3,ADC10的采樣方式有:單通道單次采樣,單通道多次采樣,多通道單次采樣,多通道多次采樣。

        4,DTC:因為ADC10只有一個采樣結果存儲寄存器ADC10MEM,所以除了在單通道單次采樣的模式下,其他的三個模式都必須使用DCT,否則轉換結果會不停地被新的結果給覆蓋。

        DTC是轉換結果傳送控制,也就是轉換結果可以不用CPU的干預,就可以自動地存儲在指定的存儲空間內。使用這種方式轉換速度快,訪問方便,適用于高速采樣模式中。DTC的使用可以從下面的例子中很容易看明白:

        #include <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通道多次轉換, 最大轉換通道為A1


        ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE; // ADC10ON, interrupt enabl參考電壓選默認值VCC和VSS

        //采樣保持時間為16 x ADC10CLKs,ADC內核開,中斷使能MSC多次轉換選擇開

        //如果MSC置位,則第一次開始轉換時需要觸發源觸發一次,以后的轉換會自動進行中斷使能

        //使用DTC時,當一個塊傳送結束,產生中斷


        //數據傳送控制寄存器0 ADC10DTC0設置為默認模式:單傳送塊模式,單塊傳送完停止

        ADC10DTC1 = 0x04; //數據傳送控制寄存器1 4 conversions定義在每塊的傳送數目一共采樣4次 所以單塊傳送4次

        //以后就停止了傳送 因為是兩通道的,所以是每個通道采樣數據傳送2次


        ADC10AE0 |= BIT0+BIT1;// P1.0 P1.1 ADC option select 使能模擬輸入腳A0 A1

        //不知道為什么,當P10 P11都懸空時,采樣值不同,用電壓表測得懸空電壓不同,但是當都接上采樣源的時候,

        //采樣是相同的

        }

        void main(void)

        {

        uint adc_sample[8]={0};//存儲ADC序列采樣結果

        WDTCTL = WDTPW+WDTHOLD;


        BCSCTL1 = CALBC1_12MHZ;//設定cpu時鐘DCO頻率為12MHz

        DCOCTL = CALDCO_12MHZ;


        P2DIR |=BIT3+BIT4;//液晶的兩條線


        init_lcd();

        ADC_init();


        wr_string(0,0,s1);

        wr_string(0,3,s2);


        for (;;)

        {

        ADC10CTL0 &= ~ENC;//ADC不使能其實這句話可以放在緊接著CPU喚醒之后的,因為CPU喚醒了,說明我們想要的

        //轉換數據傳送完成了,如果ADC繼續轉換,那么轉換結果也不再傳輸,是無用的。所以緊接著放在CPU喚醒之后

        //計時關閉ADC,有利于降低功耗

        while (ADC10CTL1 & BUSY);// Wait if ADC10 core is active等待忙

        ADC10SA = (unsigned int)adc_sample;//數據傳送開始地址寄存器設置DTC的開始地址Data buffer start

        //設置數據開始傳送的地址為數組adc_sample[]的首地址,因為寄存器ADC10SA和轉換結果都是16位的,所以要把

        //地址強制轉換為16位的int或unsigned int

        //應該也可以用指針直接訪問DTC的存儲區,還沒試過


        //例如:前面定義了單塊傳送4次數據,所以每次傳送完成了一個塊,也就是4次,就會把中斷標志位置位,產生中斷

        //因為上面設置的地址為數組adc_sample[]的首地址,所以每次轉換的結果就會傳送到該數組的前4位上,所以如果

        //一切正常的話,數組里應該是前4位為轉換的結果,后4位為初始值0通過下面的顯示,驗證轉換是正確的

        //一次觸發首先對A1、A0采樣,放入a[0]和a[1]中,再對A1、A0采樣,放入a[2]和a[3]中。如此循環下去。

        //驗證得知,當多通道采樣時,先采高的通道,再采低的通道。如上面每次采樣時,先采A1 再A0

        //因為一共采樣傳送4次,所以數組的后4位為初始值0

        ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion startADC使能,開始轉換 ADC10SC為采樣觸發源

        //不需要cpu的干預,DTC就可以把采樣結果存儲到指定的存儲區中

        __bis_SR_register(CPUOFF + GIE);// LPM0, ADC10_ISR will force exit如果轉換結果傳送完成,

        //就會進入中斷,CPU喚醒 繼續往下運行


        wr_int(2,0,adc_sample[0]);//顯示轉換結果A1

        wr_int(6,0,adc_sample[1]);//A0

        wr_int(0,1,adc_sample[2]);//A1

        wr_int(3,1,adc_sample[3]);//A0

        wr_int(6,1,adc_sample[4]);

        wr_int(0,2,adc_sample[5]);

        wr_int(3,2,adc_sample[6]);

        wr_int(6,2,adc_sample[7]);


        }

        }

        // ADC10 interrupt service routine

        #pragma vector=ADC10_VECTOR

        __interrupt void ADC10_ISR(void)//中斷響應以后,中斷標志位自動清零

        {

        __bic_SR_register_on_exit(CPUOFF);// Clear CPUOFF bit from 0(SR)

        }

        上面的例子是把存儲結果存儲在了uint型的數組中。也可以用指針直接指定要存放的地址,然后再用指針進行訪問(理論上可以,但還沒有試過)。也可以把存儲結果直接存放在一個16位的寄存器中,如:

        ADC10SA = (unsigned int)&TACCR1;// Data transfer location把轉換結果存儲在TACCR1所在的

        //位置處,就相當于存儲在TACCR1中 因為ADC轉換結果和寄存器TACCR1都是16位的,所以要把地址強制轉換為16位的

        //int 或 unsigned int型


        5,ADC采樣注意事項:用片上的ADC10進行采樣,如果外部分壓電路的電阻過大(比如幾K以上),AD引腳會把電壓拉高,使采樣結果發生很大的偏差。應換成小電阻(幾十~幾百歐),如果要求更精確的話,要加運放進行電壓跟隨。

        6,AD采樣交流信號:

        一般是50Hz,100Hz,1000Hz。方法是在交流信號的一個周期內采樣多次(如40次,30次等),然后利用公式可以求出交流信號的有效值,平均值等。

        7,片上溫度傳感器

        ADC的A10通道接片上的溫度傳感器,MSP430內嵌的溫度傳感器實際上就是一個輸出電壓隨環境溫度而變化的溫度二極管。

        當使用片上溫度傳感器時,采樣周期必須大于30us片上溫度傳感器的偏移很大,所以精確測量需要

        進行校準。選擇片上溫度傳感器INCH_10,ADC其他的設置都和外部通道的設置相同,包括參考電壓源的選擇和轉換存儲的選擇

        選擇了片上溫度傳感器,會自動地打開片上參考電壓源發生器作為溫度傳感器的電壓源,但是這并不會時能VREF+輸出,也不會

        影響AD轉換參考源的選擇,轉換參考源的選擇和其他通道的選擇相同

        公式為:VTEMP=0.00355(TEMPC)+0.986


        片上溫度傳感器的校準,可以參見我的溫度傳感器校準程序,也可以參考其他的論文。下面只給出程序的一部分:

        void ADC_init()

        {

        ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled 參考電壓選默認值VCC和VSS

        //采樣保持時間為16 x ADC10CLKs,ADC開,中斷使能

        ADC10CTL1 = INCH_10;// ADC輸入通道選擇A10,為內部的溫度傳感器

        //其他是默認,采樣觸發輸入源選擇為ADC10SC,采樣輸入信號不翻轉,轉換時鐘選擇內部時鐘源:ADC10OSC,3.7~6.3MHz

        //不分頻,單通道單次轉換

        //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,SPI

        USCI_B:支持I2C, SPI

        2,UART這個模塊沒什么好說的,和其他的一寫處理器如S12,ARM等差不多。只要設置好幾個控制寄存器,波特率,寫幾個收發函數就可以了。下面就給出msp430g2553于PC用UART通信的基本程序:

        #include"msp430g2553.h"


        unsigned char rev;

        char *string1="Helloworld!";

        char string2[]="Get it!";//是換行符


        void putchar(unsigned char c)//發送字符函數

        {

        while (!(IFG2&UCA0TXIFG));// USCI_A0 TX buffer ready? 等待TX buffer為空

        UCA0TXBUF = c;// TX -> RXed character發送字符c

        }


        void putstr(char *s)//發送字符串函數

        {

        IE2 &= ~UCA0RXIE;//發送時先關閉接收中斷,不接收

        while((*s)!=

        主站蜘蛛池模板: 象山县| 上高县| 广昌县| 治县。| 南靖县| 浙江省| 宝坻区| 靖远县| 富宁县| 彭水| 平湖市| 洱源县| SHOW| 无锡市| 余江县| 伊川县| 孟津县| 连州市| 淅川县| 沙坪坝区| 定安县| 桂平市| 福建省| 额济纳旗| 图片| 思茅市| 郸城县| 东丽区| 桃园市| 安阳市| 河曲县| 奇台县| 青岛市| 兰坪| 香格里拉县| 白河县| 漳州市| 内江市| 台北县| 扶余县| 赤壁市|