決蒙 顏志強(qiáng)
前期設(shè)計(jì)了一款暖手寶加熱電路,主控芯片使用了具有10bit精度ADC和5K字節(jié)FLASH存儲(chǔ)空間的STC15W402AS單片機(jī),驅(qū)動(dòng)兩位LED顯示溫度,溫度檢測(cè)使用了置于暖手寶內(nèi)的10KΩ(25°C時(shí))鉑金電阻。為了既符合溫度檢測(cè)精度要求,又避免單片機(jī)溫度檢測(cè)復(fù)雜計(jì)算,采取巧妙的電路設(shè)計(jì)和采樣后直接查表代替復(fù)雜計(jì)算的方法,在極短時(shí)間內(nèi)求得實(shí)時(shí)溫度,降低了編程難度,縮短了程序代碼。
為了減少外圍元件以降低成本,系統(tǒng)時(shí)鐘選擇使用單片機(jī)內(nèi)部自帶的24兆IRC時(shí)鐘。鉑金測(cè)溫電阻Rk一端接地,另一端接單片機(jī)的P1.4腳,該腳還通過(guò)10KΩ高精度電阻R1上接5.12V電源的正極。單片機(jī)系統(tǒng)在內(nèi)部以10位的精度對(duì)P1.4腳上電壓進(jìn)行數(shù)字采樣,因此該系統(tǒng)的采樣分辨率為5mV(=5.12V/210),采樣輸出結(jié)果(設(shè)為X)乘以5mV就是P1.4腳上的測(cè)得電壓(即0.005*X)。同時(shí)電路Rk與R1串聯(lián)共接于5.12V電源正極,通過(guò)串聯(lián)分壓計(jì)算,Rk上分得的電壓為5.12V*Rk/(Rk+R1),該數(shù)取整后與P1.4腳上的測(cè)得電壓0.005*X應(yīng)相等,即0.005*X=5.12*Rk/(Rk+R1),把兩邊取倒數(shù),得到:
(1/X)=1/1024+R1/(1024*Rk)······式①
從式①中可以看到,X與Rk是一一對(duì)應(yīng)且關(guān)系唯一(但不是線性關(guān)系),而根據(jù)阻值與溫度手冊(cè)查詢得知,每一個(gè)Rk值與一個(gè)唯一的溫度值相對(duì)應(yīng),從而可以推出X與溫度值也是一一對(duì)應(yīng)且關(guān)系唯一。若把式①再化簡(jiǎn)得到:
(1/X)=(R1/1024)(1/R1+1/Rk)······式②
R1=10000代入第一個(gè)括號(hào)內(nèi)得
(1/X)≈ 9.77(1/R1+1/Rk)······式③
那么式③中X的物理意義就變成了定值電阻R1與測(cè)溫電阻Rk并聯(lián)后的阻值縮小9.77倍(倍數(shù)為R1/1024,隨R1而改變),若把R1換為1024Ω,X值就等于定值電阻R1與Rk并聯(lián)后的阻值。從式③中也可以看到,X值測(cè)量,最終與電源電壓無(wú)關(guān),但為了提高測(cè)量準(zhǔn)確度,電源電壓盡量高。
測(cè)溫時(shí),若根據(jù)式③這種關(guān)系,在程序中把采樣結(jié)果用計(jì)算方式得到實(shí)時(shí)溫度仍然是非常麻煩的。為此,在編程之前,利用式③這種關(guān)系使用excel電子表格推導(dǎo)出不同Rk與R1并聯(lián)縮小R1/1024倍的X整數(shù)值,和與之對(duì)應(yīng)溫度值。測(cè)溫電阻使用手冊(cè)中,只給出了-20°C至120°C之間140個(gè)整點(diǎn)溫度對(duì)應(yīng)的Rk阻值,通過(guò)這些阻值,根據(jù)式③關(guān)系推導(dǎo)出X值,把X值作為相對(duì)存儲(chǔ)地址,這些地址存儲(chǔ)當(dāng)前Rk值對(duì)應(yīng)的溫度值。因?yàn)榇笈可a(chǎn),雖不可能對(duì)每一只測(cè)溫電阻進(jìn)行測(cè)量,但編程之前,仍手動(dòng)測(cè)量了非整數(shù)溫度點(diǎn)對(duì)應(yīng)的Rk,與上述推導(dǎo)結(jié)果一并存入電子表格中,轉(zhuǎn)化后固化到STC15W402AS的EEPROM中。
具體方法:X取值范圍即ADC輸出值為0~1023(即20-1~210-1),既對(duì)應(yīng)了1024個(gè)Rk值,又對(duì)應(yīng)了1024個(gè)溫度值,通過(guò)excel電子表格推導(dǎo)或手動(dòng)測(cè)量得出1024個(gè)X值和對(duì)應(yīng)的1024個(gè)溫度值,并按X由0至1023的順序排列出這1024個(gè)溫度值,而后存入到一個(gè)與程序代碼文件類型一致的TEMPERATURE文件中。程序固化時(shí),程序代碼空間選擇從地址0000H開(kāi)始到07FFH地址結(jié)束,大小2048個(gè)字節(jié);文件TEMPERATURE選擇從0800H地址開(kāi)始到0BFFH地址結(jié)束,這塊區(qū)域是數(shù)據(jù)存儲(chǔ)區(qū),0C00H之后還有3K字節(jié)的數(shù)據(jù)存儲(chǔ)區(qū),可以另作他用。固化結(jié)束后,地址800H到BFFH之間,順序存入了1024個(gè)溫度值。編程時(shí),采樣得到的10位結(jié)果值X,低八位送給DPL,高兩位加十進(jìn)制數(shù)12送給DPH,A清零,使用MOVC A,@A+DPTR指令通過(guò)查表功能而得到實(shí)時(shí)溫度。從EEPROM存儲(chǔ)的整體數(shù)據(jù)來(lái)看,R1使用10KΩ電阻,大于100°C時(shí),理論測(cè)量精度約為1°C;85°C至 100°C時(shí),理論測(cè)量精度約為0.5°C;70°C至 85°C時(shí),理論測(cè)量精度約為0.35°C;40°C至 70°C時(shí),理論測(cè)量精度約為0.2°C;0°C至 40°C時(shí),理論測(cè)量精度約為0.1°C;-20°C至0°C左右時(shí),理論測(cè)量精度約為0.2°C。后來(lái),為了提升70°C左右的測(cè)量精度,R1使用了1000Ω和24Ω電阻串聯(lián)代替原10KΩ電阻,使70°C左右的溫度測(cè)量精度提升到0.15°C左右,而25°C左右的測(cè)量精度則下降到0.25°C左右。由此可以看到,使用不同阻值的R1,可以提升Rk=R1對(duì)應(yīng)溫度區(qū)間的測(cè)量精度。改變R1時(shí),不用重寫程序代碼,只需更改TEMPERATURE文件,重新固化代碼程序和EEPROM數(shù)據(jù)區(qū)即可。系統(tǒng)使用24兆時(shí)鐘,測(cè)溫一次約需80us。最高加熱溫度70°C,其測(cè)量精度雖然約為0.15°C(此時(shí)R1=1024Ω),但由于成本和體積限制,使用了兩位LED,顯示精度則是1°C。
系統(tǒng)加電后,單片機(jī)首先斷開(kāi)加熱、關(guān)閉蜂鳴器,初始化定時(shí)器、中斷入口、A/D采樣、休眠等一些必要的參數(shù),而后調(diào)用測(cè)溫子程序檢測(cè)暖手寶實(shí)時(shí)溫度,當(dāng)溫度采樣值為3FF或0時(shí),說(shuō)明暖手寶未與加熱器相連或加熱器測(cè)溫電路短路,禁止加熱,LED顯示“□□”。當(dāng)溫度在70°C以下時(shí),開(kāi)始加熱,每0.25秒檢測(cè)一次暖手寶溫度,LED實(shí)時(shí)顯示當(dāng)前溫度;當(dāng)檢測(cè)到實(shí)時(shí)溫度達(dá)到68°C時(shí),停止加熱15秒,利用加熱器的余熱繼續(xù)加熱,如果不能達(dá)到最高溫度,則采取加熱6秒停止10秒的方式繼續(xù)加熱,從而最終把暖手寶加熱到70°C,并終止加熱,蜂鳴器發(fā)出六組叫聲,提示主人取下暖手寶,完成本次暖手寶測(cè)溫加熱。如果暖手寶及時(shí)取下來(lái),下次插上可以再次加熱。但如果暖手寶加熱完畢一直沒(méi)有取下來(lái),系統(tǒng)采取每秒鐘檢測(cè)一次暖手寶溫度,當(dāng)其溫度下降到65°C以下時(shí),啟動(dòng)加熱程序,使暖手寶再次加熱到70°C。系統(tǒng)共檢測(cè)15分鐘,超過(guò)15分鐘后,徹底不再加熱,進(jìn)入休眼,防止長(zhǎng)久加熱出現(xiàn)危險(xiǎn),只有暖手寶斷電重啟后才能再次啟動(dòng)溫度檢測(cè)和加熱功能。