MSP430微控制器的諸多系列中都有內(nèi)嵌的溫度傳感器。本文提出了一種基于這個(gè)傳感器的溫度報(bào)警系統(tǒng)的方案。然后分析了產(chǎn)生虛警和漏警的原因,并提出了減小這兩種概率的辦法,最后給出了以MSP430F449為例的C語言程序。 1. 系統(tǒng)的總體方案 MSP430微控制器MCU(Micro ControllerUnit)是TI公司推出的一款具有豐富片上外圍的強(qiáng)大功能的超低功耗16位混合信號(hào)處理器。其中包括一系列的器件,可以應(yīng)用在不同的場(chǎng)合。MSP430與MCS-51的一個(gè)顯著不同就是它在片內(nèi)集成了模數(shù)轉(zhuǎn)換(ADC)模塊,使得A/D轉(zhuǎn)換得以容易的實(shí)現(xiàn)。其中在MSP430的13x、14x、43x、44x系列器件中,都有內(nèi)嵌的溫度傳感器。它的輸出送入ADC12模塊的通道10,然后對(duì)其進(jìn)行A/D轉(zhuǎn)換,進(jìn)而可以測(cè)量芯片內(nèi)的溫度。在本告警系統(tǒng)中就是采用這個(gè)溫度傳感器的輸出來實(shí)現(xiàn)溫度的實(shí)時(shí)告警。 圖1 基于MSP430F449內(nèi)嵌溫度傳感器的溫度告警系統(tǒng)原理圖 2. 溫度傳感器的測(cè)溫原理和過程 MSP430內(nèi)嵌的溫度傳感器實(shí)際上就是一個(gè)輸出電壓隨環(huán)境溫度而變化的溫度二極管,表1是它的一些基本電氣特性。按照TI公司提供的資料,這個(gè)溫度二極管輸出的電壓和對(duì)應(yīng)的溫度近似成簡(jiǎn)單的線性關(guān)系。所測(cè)溫度可由的公式(1)求出:
VST :ADC模塊的通道10測(cè)量到的電壓,單位mV; V0℃ :0℃時(shí)傳感器的輸出的電壓,單位mV; TC SENSOR :傳感器的傳感電壓,即輸出電壓隨溫度的變化情況,單位mV/℃。數(shù)值上等于溫度每升高1℃,增加的輸出電壓。 對(duì)于12位的ADC模塊,VST可以通過下面的A/D轉(zhuǎn)換公式求得:
VR+:正參考電壓,可以取內(nèi)部參考VREF+ 、AVcc或者外部參考VeREF+ ,單位mV; VR-:負(fù)參考電壓,單位mV。通常取VR-=AVss,在這種情況下,求VST的公式進(jìn)一步簡(jiǎn)化為:
表1:MSP430微控制器溫度傳感器電氣特性表
很容易發(fā)現(xiàn)這個(gè)溫度傳感器具有較大的測(cè)量誤差,實(shí)驗(yàn)也證明了這一點(diǎn)。這將導(dǎo)致較大的虛警概率或漏警概率。因此要想實(shí)用它,必須要進(jìn)行誤差校正,以減小這兩個(gè)概率。產(chǎn)生誤差的原因主要有以下幾個(gè)方面: 0℃基準(zhǔn)參考電壓誤差 由表1可見,V0℃的最大誤差可達(dá)5%。所以由它導(dǎo)致的最大誤差為: 用TRT 表示室溫,VRT表示室溫下溫度傳感器的輸出電壓,則由公式(1)可得:
傳感電壓誤差 對(duì)于工業(yè)級(jí)標(biāo)準(zhǔn),工作溫度范圍為:-20℃ ~ +85℃。而對(duì)于一個(gè)實(shí)際的系統(tǒng),絕大多數(shù)時(shí)間工作在0℃ ~ +50℃之間。因此,用做基準(zhǔn)參考會(huì)導(dǎo)致較大的積累誤差。從表1可以看出,由傳感電壓引入的最大誤差約為 。如果待測(cè)溫度為50℃,用0℃作參考,則最大誤差為:℃;而用室溫(假定TRT = 25℃)作參考,則誤差為:℃,比用0℃作參考時(shí)減小了一半。因此采用室溫作為溫度參考,是減小積累誤差的一個(gè)較好的方案。不過由傳感電壓引入的誤差相對(duì)于 來說還是比較小的。 A/D轉(zhuǎn)換引入的誤差 由芯片資料可見,對(duì)于12位A/D,因漏電流引入的誤差 采用內(nèi)嵌溫度傳感器測(cè)量溫度,要受到很多方面的影響。除了上面討論的方法,還有減小誤差的一般方法,比如多次測(cè)量取平均等。所以要綜合考慮各方面的因素,才能取得滿意的效果。 4. 軟件描述 MSP430另一個(gè)突出優(yōu)點(diǎn)就是用C語言編寫程序簡(jiǎn)捷而且編譯效率很高。下面就以MSP430F449為例來簡(jiǎn)要描述這個(gè)系統(tǒng)的軟件實(shí)現(xiàn)。圖3為程序流程。 #include "msp430x44x.h" // 包含頭文件 #include #define Trt 25 //預(yù)先測(cè)量到的室溫 #define Th 50 //高溫告警溫度 #define Tl 0 //低溫告警溫度 int i=0, k=0,Vrt; //定義全局變量 int ADC_Result[16]; float T; //測(cè)量到的溫度 void init(void); //初始化函數(shù) void ADC12(void); //A/D轉(zhuǎn)換函數(shù) void Alarm(float t); //告警處理函數(shù) void init(void) { TACTL=TASSEL1+TACLR+MC_1; //定時(shí)器初始化,工作在"up"模式 CCTL0|=CCIE; //使能CCR0中斷 CCR0=0x0FF; //設(shè)定定時(shí)值 _EINT(); //打開中斷 P2DIR|=BIT0+BIT1; //P2.0和P2.1為告警輸出; } void ADC12(void) { ADC12CTL0 &=~ ENC; //在進(jìn)行設(shè)置時(shí)首先復(fù)位ADC的轉(zhuǎn)換使能 ADC12CTL0 = ADC12ON+REF2_5V+SHT0_8; //采用內(nèi)部2.5V參考,打開通道10REFON自動(dòng)打開 ADC12CTL1 = SHP+ADC12SSEL_2; //上升沿采樣,主時(shí)鐘,MEM0 ADC12MCTL0 = EOS + INCH_10+SREF_1; //選擇通道10,Vref+為參考電壓,進(jìn)行溫度測(cè)量 ADC12CTL0 |= ENC; ADC12CTL0 |= ADC12SC; // 開始轉(zhuǎn)換 if ((ADC12IFG & BIT0)==1) //如果轉(zhuǎn)換完畢,讀走數(shù)據(jù) ADC_Result=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++;i<16) //連續(xù)進(jìn)行16次轉(zhuǎn)換,提高精度 { ADC12(); ADC_Sum +=ADC_Result; //求和 i++; } ADC_Sum>>=4; //將ADC_Sum右移4位,相當(dāng)于除以16.得到平均的結(jié)果; Vst=( ADC_Sum /4095.0)*2500; //完成轉(zhuǎn)換,得到電壓值 k++; #ifndef Trt T=(Vst-986)/3.35; //測(cè)出用0度作基準(zhǔn)的溫度 #else if (k==1) Vrt=Vst; //如果定義Trt,則將第一次的轉(zhuǎn)換結(jié)果作為室溫下的Vrt T=(Vst-Vrt)/3.35+Trt; //測(cè)出用室溫作基準(zhǔn)時(shí)的溫度 #endif Alarm(T); //告警處理 } void main (void) { init(); //初始化 LPM1; //進(jìn)入低功耗模式1; } 5. 結(jié)束語 本文只是對(duì)告警部分進(jìn)行了描述,若是再加上液晶就可以實(shí)時(shí)顯示溫度,加上鍵盤就可以對(duì)室溫、告警溫度進(jìn)行預(yù)設(shè),再對(duì)上述程序進(jìn)行一些改進(jìn)就是一個(gè)實(shí)用的系統(tǒng)了。因這兩部分相對(duì)比較簡(jiǎn)單和成熟,文中沒有進(jìn)行進(jìn)一步討論。 |