關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > 基于MSP430內嵌溫度傳感器的溫度告警系統

        基于MSP430內嵌溫度傳感器的溫度告警系統

        作者: 時間:2009-11-30 來源:網絡 收藏
        A/D轉換引入的誤差
        由芯片資料可見,對于12位A/D,因漏電流引入的誤差1LSB,這個誤差可以忽略不記。但是由于布線技術和電源和地線等的不良而導致的電源線、地線上的紋波和噪聲脈沖對轉換結果的影響卻不能不考慮。如圖1所示,如果數字地DVss和模擬地AVss是分開供電的,則可以在這兩點之間接入反相并接的二極管對,以消除700mV的電壓差。另外如果參考電壓(VR+ - VR-)較小,那么紋波的影響會變得更明顯,從而影響轉換精度。因此,電源的清潔無噪聲對A/D轉換的精度有很大的影響。當然在可能的情況下還是要盡量采用較大的(VR+ - VR- )。還有就是盡量不要采用內部參考,內部參考不太穩定,會影響轉換的精度。仔細安排各自接地點的旁路電容對于減小噪聲的影響也是很有用的。圖1給出了一種典型的退耦電容配置方式,在芯片的電源以及外接參考電壓(圖中沒有畫出)的引腳上并接一個10uF的鉭電容和一個0.1uF的瓷片電容能夠較好的起到抑制噪聲的作用。

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

        采用內嵌測量,要受到很多方面的影響。除了上面討論的方法,還有減小誤差的一般方法,比如多次測量取平均等。所以要綜合考慮各方面的因素,才能取得滿意的效果。

        4. 軟件描述
        另一個突出優點就是用C語言編寫程序簡捷而且編譯效率很高。下面就以F449為例來簡要描述這個的軟件實現。圖3為程序流程。

        #include msp430x44x.h // 包含頭文件
        #include math.h> //包含數學運算頭文件
        #define Trt 25 //預先測量到的室溫
        #define Th 50 //高溫告警
        #define Tl 0 //低溫告警溫度
        int i=0, k=0,Vrt; //定義全局變量
        int ADC_Result[16];
        float T; //測量到的溫度
        void init(void); //初始化函數
        void ADC12(void); //A/D轉換函數
        void Alarm(float t); //告警處理函數
        void init(void)
        {
        TACTL=TASSEL1+TACLR+MC_1; //定時器初始化,工作在up模式
        CCTL0|=CCIE; //使能CCR0中斷
        CCR0=0x0FF; //設定定時值
        _EINT(); //打開中斷
        P2DIR|=BIT0+BIT1; //P2.0和P2.1為告警輸出;
        }
        void ADC12(void)
        {
        ADC12CTL0 =~ ENC; //在進行設置時首先復位ADC的轉換使能
        ADC12CTL0 = ADC12ON+REF2_5V+SHT0_8; //采用內部2.5V參考,打開通道10REFON自動打開
        ADC12CTL1 = SHP+ADC12SSEL_2; //上升沿采樣,主時鐘,MEM0
        ADC12MCTL0 = EOS + INCH_10+SREF_1; //選擇通道10,Vref+為參考電壓,進行溫度測量
        ADC12CTL0 |= ENC;
        ADC12CTL0 |= ADC12SC; // 開始轉換
        if ((ADC12IFG BIT0)==1) //如果轉換完畢,讀走數據
        ADC_Result[i]=ADC12MEM0;
        }
        void Alarm(float t)
        {
        if(t>=Th)
        P2OUT|=BIT1; //高溫告警
        else if(t=Tl)
        P2OUT|=BIT0; //低溫告警
        else
        P2OUT=~(BIT0+BIT1); //無告警
        }
        interrupt[TIMERA0_VECTOR] void Timer_A (void) //中斷處理子程序//
        {
        int ADC_Sum=0;
        float Vst;
        for (i=0;i++;i16) //連續進行16次轉換,提高精度
        {
        ADC12();
        ADC_Sum +=ADC_Result[i]; //求和
        i++;
        }
        ADC_Sum>>=4; //將ADC_Sum右移4位,相當于除以16.得到平均的結果;
        Vst=( ADC_Sum /4095.0)*2500; //完成轉換,得到電壓值
        k++;
        #ifndef Trt
        T=(Vst-986)/3.35; //測出用0度作基準的溫度
        #else
        if (k==1) Vrt=Vst; //如果定義Trt,則將第一次的轉換結果作為室溫下的Vrt
        T=(Vst-Vrt)/3.35+Trt; //測出用室溫作基準時的溫度
        #endif
        Alarm(T); //告警處理
        }
        void main (void)
        {
        init(); //初始化
        LPM1; //進入低功耗模式1;
        }

        5. 結束語
        本文只是對告警部分進行了描述,若是再加上液晶就可以實時顯示溫度,加上鍵盤就可以對室溫、告警溫度進行預設,再對上述程序進行一些改進就是一個實用的了。因這兩部分相對比較簡單和成熟,文中沒有進行進一步討論。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 磐石市| 建德市| 连州市| 肇源县| 丘北县| 黄龙县| 荥阳市| 麻栗坡县| 革吉县| SHOW| 沙坪坝区| 中江县| 蓬莱市| 江山市| 河北区| 和田市| 铜梁县| 印江| 丽水市| 贵德县| 邵阳县| 武清区| 东兰县| 无极县| 雷州市| 时尚| 徐州市| 兴山县| 沅江市| 阳朔县| 崇信县| 廊坊市| 平遥县| 辽阳县| 五大连池市| 岑溪市| 新昌县| 塘沽区| 临洮县| 修水县| 荆州市|