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