1. 系統(tǒng)的總體方案
MSP430微控制器MCU(Micro Controller Unit)是TI公司推出的一款具有豐富片上外圍的強大功能的超低功耗16位混合信號處理器,。其中包括一系列的器件,可以應(yīng)用在不同的場合,。MSP430與MCS-51的一個顯著不同就是它在片內(nèi)集成了模數(shù)轉(zhuǎn)換(ADC)模塊,,使得A/D轉(zhuǎn)換得以容易的實現(xiàn)。其中在MSP430的13x,、14x,、43x、44x系列器件中,,都有內(nèi)嵌的溫度傳感器,。它的輸出送入ADC12模塊的通道10,然后對其進行A/D轉(zhuǎn)換,,進而可以測量芯片內(nèi)的溫度,。在本告警系統(tǒng)中就是采用這個溫度傳感器的輸出來實現(xiàn)溫度的實時告警。
圖1 基于MSP430F449內(nèi)嵌溫度傳感器的溫度告警系統(tǒng)原理圖
本系統(tǒng)的基本方案是這樣的:ADC12模塊的通道10對芯片的溫度進行測量,,當測量溫度高于或者低于預(yù)設(shè)告警值時,,便通過I/O端口的輸出來驅(qū)動LED,顯示告警狀態(tài),。芯片在整個過程中處于低功耗模式,。本系統(tǒng)的原理比較簡單,圖1給出其簡單的原理圖,。
2. 溫度傳感器的測溫原理和過程
MSP430內(nèi)嵌的溫度傳感器實際上就是一個輸出電壓隨環(huán)境溫度而變化的溫度二極管,,表1是它的一些基本電氣特性。按照TI公司提供的資料,,這個溫度二極管輸出的電壓和對應(yīng)的溫度近似成簡單的線性關(guān)系,。所測溫度可由的公式(1)求出:
![]() |
(1) |
其中,T:測量到溫度,,單位℃,;
VST :ADC模塊的通道10測量到的電壓,單位mV,;
V0℃ :0℃時傳感器的輸出的電壓,,單位mV;
TC SENSOR :傳感器的傳感電壓,,即輸出電壓隨溫度的變化情況,,單位mV/℃。數(shù)值上等于溫度每升高1℃,,增加的輸出電壓,。
對于12位的ADC模塊,VST可以通過下面的A/D轉(zhuǎn)換公式求得:
![]() |
(2) |
其中,ADC12CH10:通道10所測得的溫度傳感器的12位A/D值,;
VR+:正參考電壓,,可以取內(nèi)部參考VREF+ 、AVcc或者外部參考VeREF+ ,,單位mV,;
VR-:負參考電壓,單位mV,。通常取VR-=AVss,,在這種情況下,求VST的公式進一步簡化為:
![]() |
(3) |
由(1)式和(3)式可見,,把A/D轉(zhuǎn)換所得的結(jié)果VST經(jīng)過簡單轉(zhuǎn)換就可得到對應(yīng)的溫度,。
表1:MSP430微控制器溫度傳感器電氣特性表
參數(shù) | 測試條件 | 最小值 | 典型值 | 最大值 | 單位 |
V0℃ | Vcc= 2.2V/3V | 986 - 5% | 986 | 986 + 5% | mV |
TCSENSOR | Vcc= 2.2V/3V,TA=0℃ | 3.55 -3% | 3.55 | 3.55 +3% | mV/℃ |
tSENSOR | Vcc= 2.2V/3V | 30 | μs |
3. 測量誤差及其減小辦法
很容易發(fā)現(xiàn)這個溫度傳感器具有較大的測量誤差,實驗也證明了這一點,。這將導(dǎo)致較大的虛警概率或漏警概率,。因此要想實用它,必須要進行誤差校正,,以減小這兩個概率,。產(chǎn)生誤差的原因主要有以下幾個方面:
0℃基準參考電壓誤差
由表1可見,V0℃的最大誤差可達5%,。所以由它導(dǎo)致的最大誤差為:,。這么大的誤差,無疑會導(dǎo)致很大的虛警或者漏警概率,,所以必須要對它進行校準,。
用TRT 表示室溫,VRT表示室溫下溫度傳感器的輸出電壓,,則由公式(1)可得:
![]() |
(4) |
由式(1)減式(4)可得:
![]() |
(5) |
因為MSP430是低功耗的,,所以在開機的一段時間內(nèi),它的片內(nèi)外溫度可以認為是一樣的,。因此我們可以用溫度計測量出開機時的室溫TRT,,將開機時測得的VST作為VRT,然后將VRT和TRT代入(5)式進行溫度計算,。這樣就消除(至少是減?。┝擞蒝0℃不準確而導(dǎo)致的測量誤差,從而減小了虛警和漏警概率,。
傳感電壓誤差
對于工業(yè)級標準,,工作溫度范圍為:-20℃ ~ +85℃。而對于一個實際的系統(tǒng),,絕大多數(shù)時間工作在0℃ ~ +50℃之間,。因此,,用 做基準參考會導(dǎo)致較大的積累誤差。從表1可以看出,,由傳感電壓引入的最大誤差約為 ,。如果待測溫度為50℃,用0℃作參考,,則最大誤差為: ℃,;而用室溫(假定TRT = 25℃)作參考,則誤差為: ℃,,比用0℃作參考時減小了一半。因此采用室溫作為溫度參考,,是減小積累誤差的一個較好的方案,。不過由傳感電壓引入的誤差相對于 來說還是比較小的。
A/D轉(zhuǎn)換引入的誤差
由芯片資料可見,,對于12位A/D,,因漏電流引入的誤差1LSB,這個誤差可以忽略不記,。但是由于布線技術(shù)和電源和地線等的不良而導(dǎo)致的電源線,、地線上的紋波和噪聲脈沖對轉(zhuǎn)換結(jié)果的影響卻不能不考慮。如圖1所示,,如果數(shù)字地DVss和模擬地AVss是分開供電的,,則可以在這兩點之間接入反相并接的二極管對,以消除700mV的電壓差,。另外如果參考電壓(VR+ - VR-)較小,,那么紋波的影響會變得更明顯,從而影響轉(zhuǎn)換精度,。因此,,電源的清潔無噪聲對A/D轉(zhuǎn)換的精度有很大的影響。當然在可能的情況下還是要盡量采用較大的(VR+ - VR- ),。還有就是盡量不要采用內(nèi)部參考,,內(nèi)部參考不太穩(wěn)定,會影響轉(zhuǎn)換的精度,。仔細安排各自接地點的旁路電容對于減小噪聲的影響也是很有用的,。圖1給出了一種典型的退耦電容配置方式,在芯片的電源以及外接參考電壓(圖中沒有畫出)的引腳上并接一個10uF的鉭電容和一個0.1uF的瓷片電容能夠較好的起到抑制噪聲的作用,。
采用內(nèi)嵌溫度傳感器測量溫度,,要受到很多方面的影響。除了上面討論的方法,,還有減小誤差的一般方法,,比如多次測量取平均等,。所以要綜合考慮各方面的因素,才能取得滿意的效果,。
4. 軟件描述
MSP430另一個突出優(yōu)點就是用C語言編寫程序簡捷而且編譯效率很高,。下面就以MSP430F449為例來簡要描述這個系統(tǒng)的軟件實現(xiàn)。圖3為程序流程,。
#include "msp430x44x.h" // 包含頭文件
#include
#define Trt 25 //預(yù)先測量到的室溫
#define Th 50 //高溫告警溫度
#define Tl 0 //低溫告警溫度
int i=0, k=0,Vrt; //定義全局變量
int ADC_Result[16];
float T; //測量到的溫度
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; //定時器初始化,工作在"up"模式
CCTL0|=CCIE; //使能CCR0中斷
CCR0=0x0FF; //設(shè)定定時值
_EINT(); //打開中斷
P2DIR|=BIT0+BIT1; //P2.0和P2.1為告警輸出;
}
void ADC12(void)
{
ADC12CTL0 &=~ ENC; //在進行設(shè)置時首先復(fù)位ADC的轉(zhuǎn)換使能
ADC12CTL0 = ADC12ON+REF2_5V+SHT0_8; //采用內(nèi)部2.5V參考,打開通道10REFON自動打開
ADC12CTL1 = SHP+ADC12SSEL_2; //上升沿采樣,,主時鐘,MEM0
ADC12MCTL0 = EOS + INCH_10+SREF_1; //選擇通道10,,Vref+為參考電壓,,進行溫度測量
ADC12CTL0 |= ENC;
ADC12CTL0 |= ADC12SC; // 開始轉(zhuǎn)換
if ((ADC12IFG & BIT0)==1) //如果轉(zhuǎn)換完畢,讀走數(shù)據(jù)
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++;i<16) //連續(xù)進行16次轉(zhuǎn)換,提高精度
{
ADC12();
ADC_Sum +=ADC_Result[i]; //求和
i++;
}
ADC_Sum>>=4; //將ADC_Sum右移4位,相當于除以16.得到平均的結(jié)果;
Vst=( ADC_Sum /4095.0)*2500; //完成轉(zhuǎn)換,得到電壓值
k++;
#ifndef Trt
T=(Vst-986)/3.35; //測出用0度作基準的溫度
#else
if (k==1) Vrt=Vst; //如果定義Trt,,則將第一次的轉(zhuǎn)換結(jié)果作為室溫下的Vrt
T=(Vst-Vrt)/3.35+Trt; //測出用室溫作基準時的溫度
#endif
Alarm(T); //告警處理
}
void main (void)
{
init(); //初始化
LPM1; //進入低功耗模式1;
}
5. 結(jié)束語
本文只是對告警部分進行了描述,,若是再加上液晶就可以實時顯示溫度,加上鍵盤就可以對室溫,、告警溫度進行預(yù)設(shè),,再對上述程序進行一些改進就是一個實用的系統(tǒng)了。因這兩部分相對比較簡單和成熟,,文中沒有進行進一步討論,。