文章目錄
其他物聯網感知方面內容見:目錄
設計方案
使用鉑熱電阻PT100,其阻值會隨着溫度的變化而改變。PT後的100即表示它在0℃時阻值爲100歐姆,在100℃時它的阻值約爲138.5歐姆。廠家提供有PT100在各溫度下電阻值值的分度表,在此可以近似取電阻變化率爲 0.385Ω/℃。向PT100輸入穩恆電流,再通過A/D轉換後測PT100兩端電壓,即得到PT100的電阻值,進而算出當前的溫度值。
採用2.55mA的電流源對PT100進行供電,然後用運算放大器LM324搭建的同相放大電路將其電壓信號放大25倍後輸入到AD0804中。利用電阻變化率0.385Ω/℃的特性,計算出當前溫度值
熱敏電阻傳感器項目設計總體設計流程圖如圖所示
PT100介紹
鉑電阻是用很細的鉑絲(Ф0.03~0.07mm)繞在雲母支架上製成,是國際公認的高精度測溫標準傳感器。因爲鉑電阻在氧化性介質中,甚至高溫下其物理、化學性質都非常穩定,因此它具有精度高、穩定性好、性能可靠的特點。鉑電阻在中溫(-200~650℃)範圍內得到廣泛應用。目前市場上已有用金屬鉑製作成的標準測溫熱電阻,如PT100、PT500、PT1000等。它的電阻—溫度關係的線性度非常好,在-200~650℃溫度範圍內線性度已經非常接近直線。
鉑電阻的測量精度、測量範圍、線性度等特性都非常好,pt100是鉑熱電阻,它的阻值會隨着溫度的變化而改變。PT後的100即表示它在0℃時阻值爲100歐姆,在100℃時它的阻值約爲138.5歐姆。
電阻與溫度的關係:R=αT+100。
PT100測溫原理
常用的Pt電阻接法有三線制和兩線制,其中三線制接法的優點是將PT100的兩側相等的的導線長度分別加在兩側的橋臂上,使得導線電阻得以消除。常用的採樣電路有兩種:一爲橋式測溫電路,一爲恆流源式測溫電路。
本設計採用恆流源式測溫電路。電路接線圖如圖
輸出信號U=IR(I=2.55mA,R是pt100的電阻)。
輸出電壓U的範圍是0.2048v~0.3628v。電壓變化0.1580v。
A/D轉換概念:
A/D轉換即模數轉換(Analog to Digital Conversion),輸入模擬量(比如電壓信號),輸出一個與模擬量相對應的數字量(常爲二進制形式)。
例如參考電壓VREF爲5V,採用8位的模數轉換器時,當輸入電壓爲0V時,輸出的數字量爲0000 0000,當輸入的電壓爲5V時,輸出的數字量爲1111 1111。當輸入的電壓從從0V到5V變化時,輸出的數字量從0000 0000到1111 1111變化。這樣每個輸入電壓值對應一個輸出數字量,即實現了模數轉換。
分辨率概念:
分辨率是指使輸出數字量變化1時的輸入模擬量,也就是使輸出數字量變化一個相鄰數碼所需輸入模擬量的變化值。
分辨率與A/D轉換器的位數有確定的關係,可以表示成FS / 2 n 。FS表示滿量程輸入值,n爲A/D轉換器的位數。
例如,對於5V的滿量程,採用4位的ADC時,分辨率爲5V/16=0.3125V (也就是說當輸入的電壓值每增加0.3125V,輸出的數字量增加1);採用8位的ADC時,分辨率爲5V/256=19.5mV(也就是說當輸入的電壓值每增加19.5mV,則輸出的數字量增加1);當採用12位的ADC時,分辨率則爲5V/4096=1.22mV(也就是說當輸入的電壓值每增加1.22mV ,則輸出的數字量增加1)。顯然,位數越多,分辨率就越高。
ADC0804引腳功能
CS:芯片片選信號,低電平有效。即=0時,該芯片才能正常工作,高電平時芯片不工作。在外接多個ADC0804芯片時,該信號可以作爲選擇地址使用,通過不同的地址信號使能不同的ADC0804芯片,從而可以實現多個ADC通道的分時複用。
RD:啓動ADC0804進行ADC採樣,該信號低電平有效,即信號由低電平變成高電平時,觸發一次ADC轉換。
WR:低電平有效,即=0時,DAC0804把轉換完成的數據加載到DB口,可以通過數據端口DB0~DB7讀出本次的採樣結果。
VIN(+)和VIN(-):模擬電壓輸入端,單邊輸入時模擬電壓輸入接VIN(+)端,VIN(-)端接地。雙邊輸入時VIN(+)、VIN(-)分別接模擬電壓信號的正端和負端。當輸入的模擬電壓信號存在“零點漂移電壓”時,可在VIN(-)接一等值的零點補償電壓,變換時將自動從VIN(+)中減去這一電壓。
VREF/2:參考電壓接入引腳,該引腳可外接電壓也可懸空,若外接電壓,則ADC的參考電壓爲該外界電壓的兩倍,如不外接,則VREF與Vcc共用電源電壓,此時ADC的參考電壓即爲電源電壓Vcc的值。
CLK IN和CLK R:外接RC振盪電路產生模數轉換器所需的時鐘信號,時鐘頻率CLK = 1/1.1RC,一般要求頻率範圍100KHz~1460KHz。
AGND和DGND:分別接模擬地和數字地。
INTR:轉換結束輸出信號,低電平有效,當一次A/D轉換完成後,將引起=0,實際應用時,該引腳應與微處理器的外部中斷輸入引腳相連(如51單片機的,腳),當產生信號有效時,還需等待=0才能正確讀出A/D轉換結果,若ADC0804單獨使用,則可以將引腳懸空。
DB0~DB7:輸出A/D轉換後的8位二進制結果。
補充說明:ADC0804片內有時鐘電路,只要在外部“CLK IN(引腳4)”和“CLKR(引腳19)”兩端外接一對電阻電容即可產生A/D轉換所要求的時鐘,其振盪頻率爲fCLK≈1/1.1RC。其典型應用參數爲:R=10KΩ,C=150PF,fCLK≈640KHz,轉換速度爲100μs。若採用外部時鐘,則外部fCLK可從CLK IN 端送入,此時不接R、C。允許的時鐘頻率範圍爲100KHz~1460KHz。
ADC0804工作過程
如圖所示,ADC0804的工作時序圖(Timing Diagrams):
圖中給出的其實就是使ADC0804正確工作的軟件編程模型。由圖可見,實現一次ADC轉換主要包含下面三個過程:
1.啓動轉換:由圖2-5中的上部“FIGURE 10A”可知,在信號爲低電平的情況下,將引腳先由高電平變成低電平,經過至少tW(WR)I 延時後,再將引腳拉成高電平,即啓動了一次AD轉換。
注:ADC0804使用手冊中給出了要正常啓動AD轉換的低電平保持時間tW(WR)I的最小值爲100ns,即拉低後延時大於100ns即可以,具體做法可通過插入NOP指令或者調用delay()延時函數實現,不用太精確,只要估計插入的延時大於100ns即可。
2.延時等待轉換結束:依然由圖2-5中的上部“FIGURE 10A”可知,由拉低信號啓動AD採樣後,經過1到8個Tclk+INTERNAL Tc延時後,AD轉換結束,因此,啓動轉換後必須加入一個延時以等待AD採樣結束。
注:手冊中給出了內部轉換時間“INTERNAL Tc”的時間範圍爲62~73個始終週期,因此延時等待時間應該至少爲8+73=81個時鐘週期。比如,若R爲150K, C爲150pF,則時鐘頻率爲Fclk=1/1.1RC=606KHz,因此時鐘週期約爲Tclk=1/Fclk=1.65us。所以該步驟至少應延時81*Tclk=133.65us. 具體做法可通過插入NOP指令或者調用delay()延時函數實現,不用太精確,只要估計插入的延時大於133.65us即可。
3.讀取轉換結果:由圖2-5的下部“FIGURE 10B”可知,採樣轉換完畢後,在信號爲低的前提下,將腳由高電平拉成低電平後,經過tACC的延時即可從DB腳讀出有效的採樣結果。
注:手冊中給出了tACC的典型值和最大值分別爲135ns和200ns,因此將引腳拉低後,等待大於200ns後即可從DB讀出有效的轉換結果。具體做法可通過插入NOP指令或者調用delay()延時函數實現,不用太精確,只要估計插入的延時大於200ns即可。
對採樣值進行運算變換,換算出實際的滑動變阻器輸入電壓值。
對於任何一個A/D採樣器而言,其轉換公式如下:
其中:
Vout:輸入ADC的模擬電壓值。
Dsample:ADC轉換後的二進制值。本試驗的ADC0804爲八位。
Dmax:ADC能夠表示的刻度總數。ADC0804爲八位ADC,因此
Vref:ADC參考電壓值,本試驗ADC0804的Vref被設置爲5V
因此,對於本試驗,轉換公式爲
A/D轉換電路設計
放大模塊
LM324系列器件帶有差動輸入的四運算放大器。與單電源應用場合的標準運算放大器相比,它們有一些顯著優點。該四放大器可以工作在低到3.0伏或者高到32伏的電源下,靜態電流爲MC1741的靜態電流的五分之一。共模輸入範圍包括負電源,因而消除了在許多應用場合中採用外部偏置元件的必要性。每一組運算放大器可用圖2-7所示的符號來表示,它有5個引出腳,其中“+”、“-”爲兩個信號輸入端,“V+”、“V-”爲正、負電源端,“Vo”爲輸出端。兩個信號輸入端中,Vi-(-)爲反相輸入端,表示運放輸出端Vo的信號與該輸入端的相位相反;Vi+(+)爲同相輸入端,表示運放輸出端Vo的信號與該輸入端的相位相同。這個是最常用的運算放大器1,2,3腳是一組5,6,7腳是一組,8,9,10腳是一組,12,13,14腳是一組,剩下的兩個腳是電源,1,7,8,14是各組放大器的輸出腳,其它的就是輸入腳。
LM324系列由四個獨立的,高增益,內部頻率補償運算放大器,其中專爲從單電源供電的電壓範圍經營。從分裂電源的操作也有可能和低電源電流消耗是獨立的電源電壓的幅度。
應用領域包括傳感器放大器,直流增益模塊和所有傳統的運算放大器現在可以更容易地在單電源系統中實現的電路。例如,可直接操作的LM324系列,這是用來在數字系統中,輕鬆地將提供所需的接口電路,而無需額外的±15V電源標準的5V電源電壓。
Lm324放大電路設計
ADC0804的分辨率度是5/255=0.0196。要使精度達到0.5℃,溫度增加1℃時ADC至少要增加1。pt100溫度在-50℃~110℃輸出電壓變化範圍要大於5*160/255=3.138。
所以模擬信號應在3.138v~5v之間。所以放大倍數應該大於3.138/0.1580=19.9小於5/0.1580=31.6。所以設計放大25倍。
用LM324設計放大25倍電路。
在圖2-8中R6、R7是比例電阻。3是輸入端1是輸出端U=U0(1+R7/R6),放大倍數A=U/U0=25。
LED顯示原理
常見的LED數碼管爲“8”字型的,共計8段。每一段對應一個發光二極管。有共陽極和共陰極兩種,如圖2-9所示。共陰極發光二極管的陰極連在一起,通常公共陰極接地。當陽極爲高電平時,發光二極管發光。
同樣,共陽極發光二極管的陽極連接在一起,公共陽極接正電壓,當某個發光二極管的陰極接低電平時,發光二極管發光,顯示相應的段。
LED數碼管中還有一個圓點型發光二極管(在圖中以dp表示),用於顯示小數點。通過七個發光二極管亮暗的不同組合,可以顯示各種數字。
爲了使數碼管顯示不同的符號或數字,實際上是確定哪些段發光、哪些段不發光,就要爲LED數碼管提供段碼(字型碼)。
LED數碼管共計8段。正好是一個字節。習慣上是以“a”段對應段碼字節的最低位。各段與字節中各位對應關係如表
代碼位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
顯示位 | dp | g | f | E | d | c | b | a |
按照上述格式,顯示各種字符的8段LED數碼管的段碼如表所示
LED顯示器的顯示方式
-
LED靜態顯示方式
無論多少位LED數碼管,同時處於顯示狀態。
靜態顯示方式,各位的共陰極(或共陽極)連接在一起並接地(或接+5V);每位的段碼線(a~dp)分別與一個8位的I/O口鎖存器輸出相連。如果送往各個LED數碼管所顯示字符的段碼一經確定,則相應I/O口鎖存器鎖存的段碼輸出將維持不變,直到送入另一個字符的段碼爲止。因此,靜態顯示方式的顯示無閃爍,亮度都較高,軟件控制比較容易。
靜態顯示器電路,各位可獨立顯示,靜態顯示方式接口編程容易,但是佔用口線較多。如果要顯示4位,則要佔用4個8位I/O口。因此在顯示位數較多的情況下,由於這種方式佔用的I/O口太多。所以在實際應用中,一般不採用靜態顯示方式,而是採用動態顯示方式。 -
LED動態顯示方式
無論在任何時刻只有一個LED數碼管處於顯示狀態,即單片機採用“掃描”方式控制各個數碼管輪流顯示。
在多位LED顯示時,爲簡化硬件電路,通常將所有顯示位的段碼線的相應段並聯在一起(可以減少段碼線),由一個8位I/O口控制,而各位的共陽極或共陰極分別由相應的I/O線控制,形成各位的分時選通。
段碼線佔用一個8位I/O口,而位選線佔用一個I/O口的4根引腳。
採用動態“掃描”顯示方式。即在某一時刻,只讓某一位的位選線處於選通狀態,而其它各位的位選線處於關閉狀態,同時,段碼線上輸出相應位要顯示字符的段碼。
例如,在共陰極方式時,段碼爲“0X00”,則當W0=0,最左一位亮,W1=1時,第二位亮,…….
雖然這些字符是在不同時刻出現,但在某一時刻,只有一位顯示,其他各位熄滅,由於餘輝和人眼的“視覺暫留”作用,只要每位顯示間隔足夠短,則可以感覺到“多位同時亮”,達到同時顯示的效果。
LED不同位顯示的時間間隔(掃描間隔)應根據實際情況而定。如果要顯示位數較多,則將佔大量的單片機時間,因此動態顯示的實質是以犧牲單片機時間來換取I/O端口的減少。
動態掃描方式的各位數碼管逐個輪流顯示,當掃描頻率較高的時,其顯示效果較好。這種方式功耗小,硬件資源要求少,所以應用較多。
動態顯示的優點是硬件電路簡單,LED越多,優勢越明顯。缺點是顯示亮度不如靜態顯示的亮度高。如果“掃描”速率較低,會出現閃爍現象。
設計實現
代碼如下:
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ad0_7 P1 //AD數據口
sbit cs=P2^4; //片選信號,低電平有效,控制芯片的啓動和結果讀取
sbit rd=P2^7; //讀數據控制,低電平有效
sbit wr=P2^6; //AD啓動控制,上升沿有效
sbit intr=P2^5; //AD轉換完成輸出低電平
uchar i;
uchar led[11]={ 0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x40, //"-"
};
uchar dat_AD[4]={0};
//啓動AD轉換子程序//////////////////
void start_ad(void)
{ cs=0; //允許AD
wr=0;
_nop_();
wr=1; //WR由低變高時啓動AD轉換
while(intr); //等待轉換完成,低電平有效
cs=1; //停止AD轉換
}////////////////////
read_ad()
{ uint ad_data;
ad0_7=0xff;
cs=0; //允許讀
rd=0; //讀取轉換數據結果
_nop_();
ad_data=ad0_7; //把數據存到AD——data中
rd=1;cs=1; //停止讀取AD
return(ad_data);
}
// 數據處理函數
//實際測量當0度時,AD數據爲133,所以數據處理時判斷AD數據和133的大小來識別正負溫度。
//由於ADC芯片精度不夠,所以測量時有誤差,8位AD的分辨率爲19.5mV,約爲20mV,
//放大電路輸出的電壓,溫度每變化一度,電壓變化只有10mV左右,所以測量有誤差,
//以下溫度和AD數據的計算公式爲實測數據後線性擬合得到的,實際線性擬合得到公式爲:y=0.503x+133.63.
//因爲AD數據爲0-255的整數,所以公式簡化爲以下計算方式
void data_shout(uint ad_data)
{
float temp;
uint T;
if(ad_data<79)
{
temp=614.422-7.811*ad_data;
T=(uint)temp;
dat_AD[0]=10;
} //負溫度 dat_AD[0]中爲溫度符號數據
else if(ad_data<=204)
{
temp=7.990*ad_data-628.491;
T=(uint)temp;
dat_AD[0]=T/1000;
} //正溫度
else if(ad_data>204)
{
temp=8.124*ad_data-655.742;
T=(uint)temp;
dat_AD[0]=T/1000;
} //ad_data=T;
dat_AD[1]=T%1000/100; //溫度值的十位
dat_AD[2]=T%100/10; //2溫度值的個位
dat_AD[3]=T%10; //溫度值的小數位
}
//顯示函數
void disp(){
switch(i){
case 0: P0=0xfe;P3=led[dat_AD[0]];i++;break; //顯示符號位
case 1: P0=0xfd;P3=led[dat_AD[1]];i++;break;
case 2: P0=0xfb;P3=led[dat_AD[2]]|0x80;i++;break;
case 3: P0=0xf7;P3=led[dat_AD[3]];i=0;break;
}
}
//定時器初始化
//用作數碼管顯示的刷新
void t0init(){
TMOD=0x01;
TH0=(65535-2000)/256; //定時20ms時間
TL0=(65535-2000)%256;
EA=1;
ET0=1;
TR0=1;
}
//定時器中斷函數,在中斷中刷新數碼管顯示
void Time0( ) interrupt 1{
TH0=(65535-2000)/256;
TL0=(65535-2000)%256;
disp();
}
//主函數
void main(void){
t0init(); //初始化
while(1){
start_ad(); //開始AD
data_shout(read_ad()); //數據處理
}
}
- 按照前文所述,我們可以連接出熱敏電阻傳感器項目的原理圖,如圖所示。
- 將程序加載到芯片中,運行。如圖,溫度成功顯示在LED屏上。