摘 要: 針對(duì)傳統(tǒng)的水浴恒溫加熱過程溫度過沖大,難以觀察歷史曲線的不足,設(shè)計(jì)了一種開關(guān)量控制的恒溫加熱控制器。該控制器具有溫度控制精確,過沖小,設(shè)定參數(shù)掉電保持,溫度變化趨勢一目了然的特點(diǎn)。詳細(xì)介紹了其硬件與軟件設(shè)計(jì)過程。
關(guān)鍵詞: 水浴恒溫;掉電數(shù)據(jù)保持;TFT液晶曲線顯示
電加熱水浴恒溫控制具有升溫單向性、大慣性、大滯后、時(shí)變性、依靠環(huán)境自然冷卻降溫的特點(diǎn),難以用數(shù)學(xué)方法建立精確的模型[1]。傳統(tǒng)的控制方法是溫度低于設(shè)定值時(shí),持續(xù)加熱;高于設(shè)定值時(shí),停止加熱。這種方法容易使加熱過程溫度有很大的過沖,在其恒溫過程中,溫度波動(dòng)也較大。
本設(shè)計(jì)采用的溫控方法為:溫度較低時(shí),持續(xù)加熱;溫度接近時(shí),斷續(xù)加熱;溫度高于設(shè)定值時(shí),停止加熱。本控制器設(shè)定參數(shù)具有掉電保持功能,下次開機(jī)不用重新設(shè)定,方便連續(xù)作業(yè);除了數(shù)字顯示當(dāng)前溫度外,更能顯示溫度曲線,使其變化趨勢一目了然,具有傳統(tǒng)數(shù)碼管顯示無法比擬的優(yōu)點(diǎn)。溫度傳感器采用數(shù)字溫度傳感器,硬件設(shè)計(jì)簡單,大大減小了由信號(hào)轉(zhuǎn)換引起的誤差。
本控制器可當(dāng)作“水浴鍋”、“水溫箱”、“煮沸消毒箱”的控制器使用,其溫控效果可用于蒸餾、干燥、濃縮及恒溫加熱、化學(xué)藥品、生物發(fā)酵制品、檢查血清和生化實(shí)驗(yàn)、恒溫培養(yǎng)等。
1 控制器硬件組成
如圖1所示,控制器由實(shí)時(shí)時(shí)鐘、數(shù)字溫度傳感器、單片機(jī)、TFT液晶屏、輸出繼電器、按鍵等部分組成。
本控制器采用宏晶公司STC89C52RC型單片機(jī)作為核心控制器,其Flash程序存儲(chǔ)器容量為8 KB,數(shù)據(jù)存儲(chǔ)器RAM為512 B,內(nèi)部具有2 KB容量的E2PROM,可用作參數(shù)設(shè)置時(shí)掉電保存參數(shù)用,這樣就不需要設(shè)計(jì)外部存儲(chǔ)器,精減了硬件電路設(shè)計(jì)。該芯片加密性強(qiáng),抗干擾能力強(qiáng),功耗低,滿足本控制器設(shè)計(jì)要求。內(nèi)部E2PROM讀寫的3個(gè)基本命令為字節(jié)讀、字節(jié)編程、扇區(qū)擦除。同一個(gè)地址的數(shù)據(jù)可以反復(fù)讀出,但要寫入數(shù)據(jù),必須先將其擦除,而數(shù)據(jù)擦除是按扇區(qū)(每個(gè)扇區(qū)512 B)進(jìn)行的[2]。
數(shù)據(jù)顯示部分采用的是1.8英寸TFT液晶屏,型號(hào)為GYTF018LB35B0M,由于沒有自帶漢字字庫,所以需要自行取漢字字模,存入程序存儲(chǔ)空間,通過函數(shù)調(diào)用實(shí)現(xiàn)字符顯示。使用時(shí)需自行設(shè)定字符顯示的大小,針對(duì)不同的顯示要求,本系統(tǒng)使用了32×32、16×16、8×8三種大小字符顯示效果。
實(shí)時(shí)時(shí)鐘芯片用于顯示當(dāng)前系統(tǒng)運(yùn)行時(shí)間和控制溫度均勻采樣。本控制器采用DS1302作為時(shí)鐘控制芯片。DS1302是美國DALLAS公司推出的一種高性能、低功耗的實(shí)時(shí)時(shí)鐘芯片,采用SPI三線接口與CPU進(jìn)行同步通信,可采用突發(fā)方式一次傳送多個(gè)字節(jié)的數(shù)據(jù)。實(shí)時(shí)時(shí)鐘提供秒、分、時(shí)、日、星期、月和年記錄,且具有閏年補(bǔ)償功能,工作電壓寬達(dá)2.5 V~5.5 V,采用雙電源供電(主電源與備用電源)。DS1302能實(shí)現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時(shí)間同時(shí)記錄,因此廣泛用于測量系統(tǒng)中。控制器的時(shí)鐘電路如圖2所示。
2.1 初始化模塊
初始化模塊由以下函數(shù)組成:(1)讀取上一次存儲(chǔ)在E2PROM中的兩個(gè)設(shè)定值,即設(shè)定溫度值,時(shí)間間隔值;(2)配置數(shù)字溫度傳感器18B20;(3)配置LCD,清屏LCD為黑色,并顯示一些在整個(gè)控制過程中不變的字符和曲線,如“g”、“℃”等。本模塊在程序開始運(yùn)行后,只執(zhí)行一次。
2.4 獲取當(dāng)前時(shí)鐘模塊
通過函數(shù)Read_RTC(unsigned char *pdate_r),將DS1302當(dāng)前時(shí)鐘數(shù)據(jù)讀入到date_r[7]數(shù)組中,調(diào)用方式為:Read_RTC(date_r)。其中date_r[7]數(shù)組中每位依次表示為秒、分、時(shí)、日、月、年、周,且均為BCD碼。所以date_r[0]代表了當(dāng)前的秒數(shù),date_r[3]位表示了當(dāng)前代表的天數(shù)。獲取了當(dāng)前的時(shí)鐘信息后,通過函數(shù)date2string(unsigned char *pdate_dispstr)轉(zhuǎn)換為相應(yīng)的字符串,然后調(diào)用字符串顯示函數(shù)在液晶屏上顯示。本系統(tǒng)為了方便記錄當(dāng)前系統(tǒng)已運(yùn)行的時(shí)間,需設(shè)置相應(yīng)按鍵,用于時(shí)鐘清零[4]。
2.5 溫度曲線顯示模塊
溫度曲線顯示模塊是本控制器編程的難點(diǎn)之一。本文選擇的液晶屏點(diǎn)數(shù)為128×160,真正顯示曲線部分如圖6所示。由圖6可知,可顯示的橫坐標(biāo)點(diǎn)共121個(gè)點(diǎn)。若在while循環(huán)中,每次循環(huán)都在液晶屏上顯示一個(gè)點(diǎn),則121個(gè)橫坐標(biāo)表示的點(diǎn)只能覆蓋很短的時(shí)間。若能實(shí)現(xiàn)每隔1 s讀取一次溫度值,則整個(gè)屏幕可以覆蓋2 min內(nèi)的數(shù)據(jù),也就是說足可以顯示2 min內(nèi)的溫度變化的趨勢。本文實(shí)現(xiàn)的方法如下:
cur_sec=date_r[0]; //讀出當(dāng)前的秒數(shù),為BCD碼
if (cur_sec!=last_sec)
//當(dāng)前的秒數(shù)與上一次不相等,則過了1 s了
{
……//此部分代碼1 s執(zhí)行一次
last_sec=cur_sec;
count++;//用于控制斷續(xù)加熱
}
畫點(diǎn)函數(shù)與畫直線函數(shù)原型為:
void LCD_draw_point(uchar x,uchar y,uint color);
//畫點(diǎn)函數(shù)
void LCD_draw_line(uchar xStart,uchar yStart,uchar xEnd,uchar yEnd, uint color)//畫直線函數(shù)
在曲線顯示時(shí),希望溫度曲線始終在屏幕的中間部分顯示,以全面反映溫度的上下波動(dòng)。而且畫直線時(shí),需要知道上一個(gè)溫度點(diǎn)的縱坐標(biāo)和當(dāng)前溫度點(diǎn)的縱坐標(biāo)。本系統(tǒng)中,曲線顯示部分中間那條標(biāo)尺縱坐標(biāo)為115,于是計(jì)算當(dāng)前溫度點(diǎn)的縱坐標(biāo)和上一次溫度點(diǎn)的縱坐標(biāo)方法為:
a=115+(TargetTemSet-Temperature);
//溫度變化后的Y坐標(biāo)
b=115+(TargetTemSet-Temperature_last);
//溫度變化前的Y坐標(biāo)
其中,TargetTemSet為當(dāng)前設(shè)定的溫度值,Temperature為當(dāng)前檢測到的溫度值,Temperature_last為上一秒檢測到的溫度值。假設(shè)設(shè)定溫度TargetTemSet=200(即20.0℃),上一次溫度Temperature_last=200,當(dāng)前溫度為Temperature=210,則變化后的溫度點(diǎn)縱坐標(biāo)a=105,溫度變化前的溫度點(diǎn)縱坐標(biāo)b=115。由此可以畫一條豎線,就可以達(dá)到設(shè)計(jì)要求。在使用畫直線函數(shù)前,還需要將a、b限幅,即{a,b}?奐[75,155]。
在本設(shè)計(jì)中,共畫出了9條標(biāo)尺,每個(gè)標(biāo)尺間距為10個(gè)像素點(diǎn),代表溫度相差1℃。
2.6 溫度調(diào)節(jié)模塊
本控制器要求實(shí)現(xiàn)溫度值與設(shè)定值相差大于3℃時(shí),連續(xù)加熱;小于3℃時(shí),斷續(xù)加熱;大于設(shè)定值時(shí),斷開繼電器;斷續(xù)加熱時(shí),繼電器交替通斷。關(guān)鍵代碼如下:
if(Temperature<(TargetTemSet-30))
//溫度較低,直接加熱
{
if (Temperature!=0) RELAY=RelayOn;
}
else if(Temperature<TargetTemSet)
//溫度接近設(shè)定溫度,斷續(xù)加熱
{
if (count>= TargetTimeInterval)
//讀出秒數(shù),需加熱時(shí),加熱幾秒,停幾秒
{ count=0; RELAY=!RELAY;}
}
else RELAY=RelayOff;//大于設(shè)定值, 斷電
3 恒溫實(shí)驗(yàn)效果
針對(duì)本設(shè)計(jì)進(jìn)行相關(guān)的實(shí)驗(yàn),實(shí)驗(yàn)原理圖如圖10所示。實(shí)驗(yàn)中,設(shè)定了3個(gè)溫度檔次,即30 ℃、35 ℃、40 ℃分時(shí)進(jìn)行。
當(dāng)設(shè)定為30℃時(shí),通過實(shí)驗(yàn)發(fā)現(xiàn)加熱過程溫度過沖為0.3℃,恒溫過程波動(dòng)為±0.1℃,控制過程運(yùn)行良好。
當(dāng)溫度設(shè)定為35℃時(shí),發(fā)現(xiàn)過沖比較大,說明傳感器與加熱體相隔距離太遠(yuǎn),不合理,需要重新調(diào)整。但恒溫過程比較滿意。
于是調(diào)整傳感器與加熱體的距離(減?。?,使之更加合理。設(shè)定為40℃時(shí),水槽水溫上升曲線可知基本上無過沖,恒溫效果比較滿意。在恒溫過程中將時(shí)間清零了一次,所以運(yùn)行時(shí)間比加溫時(shí)間小。
實(shí)驗(yàn)中發(fā)現(xiàn):溫度是否恒定、過沖是否小與許多因素有關(guān),如:加熱體和傳感器之間的距離、水槽是否密封、水槽材質(zhì)散熱性等。當(dāng)溫度設(shè)定較高時(shí),水槽周邊散熱較大,同一水槽中,不同位置水的溫度不同,水槽中的水溫呈一定的梯度分布。要提高恒溫效果,除了從控制器本身入手外,還可以進(jìn)行如下方面的考慮:
?。?)保持加熱體與傳感器之間處于合適的距離。
(2)有條件的話,在加熱體附近增加一個(gè)小的螺旋槳,使水在水槽內(nèi)溫度更加均勻。
?。?)保持水槽密封,根據(jù)水槽裝水的多少,選擇合適功率的加熱體。
?。?)增大加熱體加熱面積,使水槽整體升溫,減小局部溫度過高的可能。
本文設(shè)計(jì)了一種水浴恒溫控制器,介紹了其硬件與軟件設(shè)計(jì)過程,并進(jìn)行了相關(guān)實(shí)驗(yàn),結(jié)果表明其升溫與恒溫效果均比較滿意。本設(shè)計(jì)的一大亮點(diǎn)在于通過TFT液晶屏實(shí)時(shí)顯示了當(dāng)前溫度值、設(shè)定值、當(dāng)前運(yùn)時(shí)間等,還能通過彩色曲線顯示2 min內(nèi)溫度變化趨勢。文中提出的實(shí)時(shí)時(shí)鐘編程思想,可在高速微處理器上實(shí)現(xiàn)長時(shí)間定時(shí),對(duì)其他大慣性控制系統(tǒng)的設(shè)計(jì)具有一定的借鑒意義。
參考文獻(xiàn)
[1] 賀艷秋,黃大貴.電阻爐FuZZy_PID溫度控制系統(tǒng)[J]. 橡膠工業(yè),2006(53):109-109.
[2] 宏晶公司.單片機(jī)器件手則:STC89C51RC-RD+GUIDE-CHINESE.2006:42-43.
[3] 杜克銘,姚燕,李景涌.基于STC89C52的多路溫度傳感器標(biāo)定系統(tǒng)[J].電子技術(shù)應(yīng)用,2009(4):152-155.
[4] 王節(jié)旺.一種基于STC89C52RC單片機(jī)的計(jì)時(shí)系統(tǒng)的設(shè)計(jì)方案[J].微型機(jī)與應(yīng)用,2011(6):28-30.