,當(dāng)?shù)陀?/font>4.5V時,測出的溫度值比實(shí)際的溫度高,誤差較大。。。當(dāng)電源電壓降為4V時,溫度誤差有3℃之多,這就應(yīng)該是因?yàn)榧纳娫醇橙∧芰坎粔蛟斐傻陌桑虼耍鹃L建議大家在開發(fā)測溫系統(tǒng)時不要使用此電路。
圖4
[2]、DS18B20寄生電源強(qiáng)上拉供電方式電路圖
改進(jìn)的寄生電源供電方式如下面圖5所示,為了使DS18B20在動態(tài)轉(zhuǎn)換周期中獲得足夠的電流供應(yīng),當(dāng)進(jìn)行溫度轉(zhuǎn)換或拷貝到E2存儲器操作時,用MOSFET把I/O線直接拉到VCC就可提供足夠的電流,在發(fā)出任何涉及到拷貝到E2存儲器或啟動溫度轉(zhuǎn)換的指令后,必須在最多10μS內(nèi)把I/O線轉(zhuǎn)換到強(qiáng)上拉狀態(tài)。在強(qiáng)上拉方式下可以解決電流供應(yīng)不走的問題,因此也適合于多點(diǎn)測溫應(yīng)用,缺點(diǎn)就是要多占用一根I/O口線進(jìn)行強(qiáng)上拉切換。
圖5
注意:在圖4和圖5寄生電源供電方式中,DS18B20的VDD引腳必須接地
[3]、DS18B20的外部電源供電方式
在外部電源供電方式下,DS18B20工作電源由VDD引腳接入,此時I/O線不需要強(qiáng)上拉,不存在電源電流不足的問題,可以保證轉(zhuǎn)換精度,同時在總線上理論可以掛接任意多個DS18B20傳感器,組成多點(diǎn)測溫系統(tǒng)。注意:在外部供電的方式下,DS18B20的GND引腳不能懸空,否則不能轉(zhuǎn)換溫度,讀取的溫度總是85℃。
圖6:外部供電方式單點(diǎn)測溫電路
圖7:外部供電方式的多點(diǎn)測溫電路圖
外部電源供電方式是DS18B20最佳的工作方式,工作穩(wěn)定可靠,抗干擾能力強(qiáng),而且電路也比較簡單,可以開發(fā)出穩(wěn)定可靠的多點(diǎn)溫度監(jiān)控系統(tǒng)。站長推薦大家在開發(fā)中使用外部電源供電方式,畢竟比寄生電源方式只多接一根VCC引線。在外接電源方式下,可以充分發(fā)揮DS18B20寬電源電壓范圍的優(yōu)點(diǎn),即使電源電壓VCC降到3V時,依然能夠保證溫度量精度。
六、DS1820使用中注意事項(xiàng)
DS1820雖然具有測溫系統(tǒng)簡單、測溫精度高、連接方便、占用口線少等優(yōu)點(diǎn),但在實(shí)際應(yīng)用中也應(yīng)注意以下幾方面的問題:
1) 較小的硬件開銷需要相對復(fù)雜的軟件進(jìn)行補(bǔ)償,由于DS1820與微處理器間采用串行數(shù)據(jù)傳送,因此,在對DS1820進(jìn)行讀寫編程時,必須嚴(yán)格的保證讀寫時序,否則將無法讀取測溫結(jié)果。在使用PL/M、C等高級語言進(jìn)行系統(tǒng)程序設(shè)計(jì)時,對DS1820操作部分最好采用匯編語言實(shí)現(xiàn)。
2) 在DS1820的有關(guān)資料中均未提及單總線上所掛DS1820數(shù)量問題,容易使人誤認(rèn)為可以掛任意多個DS1820,在實(shí)際應(yīng)用中并非如此。當(dāng)單總線上所掛DS1820超過8個時,就需要解決微處理器的總線驅(qū)動問題,這一點(diǎn)在進(jìn)行多點(diǎn)測溫系統(tǒng)設(shè)計(jì)時要加以注意。
3) 連接DS1820的總線電纜是有長度限制的。試驗(yàn)中,當(dāng)采用普通信號電纜傳輸長度超過50m時,讀取的測溫?cái)?shù)據(jù)將發(fā)生錯誤。當(dāng)將總線電纜改為雙絞線帶屏蔽電纜時,正常通訊距離可達(dá)150m,當(dāng)采用每米絞合次數(shù)更多的雙絞線帶屏蔽電纜時,正常通訊距離進(jìn)一步加長。這種情況主要是由總線分布電容使信號波形產(chǎn)生畸變造成的。因此,在用DS1820進(jìn)行長距離測溫系統(tǒng)設(shè)計(jì)時要充分考慮總線分布電容和阻抗匹配問題。
4) 在DS1820測溫程序設(shè)計(jì)中,向DS1820發(fā)出溫度轉(zhuǎn)換命令后,程序總要等待DS1820的返回信號,一旦某個DS1820接觸不好或斷線,當(dāng)程序讀該DS1820時,將沒有返回信號,程序進(jìn)入死循環(huán)。這一點(diǎn)在進(jìn)行DS1820硬件連接和軟件設(shè)計(jì)時也要給予一定的重視。
測溫電纜線建議采用屏蔽4芯雙絞線,其中一對線接地線與信號線,另一組接VCC和地線,屏蔽層在源端單點(diǎn)接地。

初始化操作方法:單片機(jī)先給總線一個高電平,略微延時,然后拉低總線,至少延時480us(我們?nèi)?00us),然后拉高總線,等待15~60us的時間(我們?nèi)?0us),此后DS18B20如果響應(yīng),則會發(fā)出0,拉低總線,否則為1,單片機(jī)檢測是否響應(yīng)的時間在60~240us之內(nèi),之后釋放總線,程序如下:
bit DS18B20_init()//初始化
{
uchar i;
bit flag_response=0;
DQ=1;
_nop_();_nop_();
DQ=0;
delay_us(90); //延時600us
DQ=1;
delay_us(10); //延時80us
for(i=0;i<15;i++)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
if(!DQ)
{
flag_response=1;
break;
}
}
delay_us(63);//延時420us
DQ=1;//釋放總線
return(flag_response);
}
寫操作方法:由于是單總線,讀寫操作都分為寫0和寫1,從一個字節(jié)的最低位逐次往DS18B20里寫,先使總線產(chǎn)生一個由1到0的跳變,等待15us(我們?nèi)?3us),然后判斷要寫的那位是1還是0,如果是1,則拉高總線,0則不去操作總線(因?yàn)榭偩開始產(chǎn)生跳變時已被拉低),等待45us(我們?nèi)?4us)以后釋放總線(這段時間DS18B20會采樣,如上圖所示),程序如下:
void DS18B20_write(uchar dat)//寫1個字節(jié)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();_nop_();
DQ=0;
delay_us(1);//延時13us
if(dat&0x01)
DQ=1;
delay_us(8);//延時64us
DQ=1;//釋放總線
dat>>=1;
}
}
讀操作方法:使總線產(chǎn)生一個由1到0的跳變,等待1us,馬上拉高總線,等待大約12個us(datasheet推薦的采樣時間是快接近15us的時候,我們略微提前),單片機(jī)采樣,如果總線被拉低,則讀出的是0,否則就讀出1,然后延時45us以上(我們?nèi)?5us)釋放總線;注意,讀也是從最低位開始的,這里讀出的0,1加到字節(jié)最高位,讀完后,最高位被移到最低位,實(shí)際上是右移了7次
uchar DS18B20_read()//讀1個字節(jié)
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
dat>>=1;
DQ=1;
_nop_();_nop_();
DQ=0;
_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//按datasheet上的推薦時序,略微提前
if(DQ)
dat|=0x80;
delay_us(7); //延時55us
DQ=1;
}
return dat;
}
作者: guobd 時間: 2016-2-14 08:35
新人謝謝分享
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |