桂林市房產(chǎn)檔案館 歐肇成
基于PIC單片機(jī)的檔案保存?zhèn)}儲運輸領(lǐng)域的溫度記錄儀設(shè)計
桂林市房產(chǎn)檔案館 歐肇成
隨著大數(shù)據(jù)概念的提出,近年來,各類數(shù)據(jù)如何精確采集與處理,成為了熱點課題,在檔案保存、食品藥品的倉儲運輸?shù)阮I(lǐng)域也不例外。在檔案保存、食品藥品領(lǐng)域,溫度數(shù)據(jù)是一個十分重要的數(shù)據(jù),它直接影響著檔案防蟲、紙張變質(zhì)、食品藥品的安全。因此開發(fā)出一種低成本,高精度,自由的設(shè)置記錄溫度時間間隔,且能快速方便的用計算機(jī)讀出數(shù)據(jù)的環(huán)境溫度記錄產(chǎn)品是很有必要的。而PIC單片機(jī)作為一種功能強,穩(wěn)定,低功耗的單片機(jī)已經(jīng)廣泛應(yīng)用到了電子產(chǎn)品的設(shè)計當(dāng)中,所以本設(shè)計以PIC單片機(jī),LCD驅(qū)動,AD轉(zhuǎn)換,SPI協(xié)議,串口通信等技術(shù)為基礎(chǔ)的溫度記錄儀設(shè)計。
溫度記錄;PIC單片機(jī);AD轉(zhuǎn)換;SPI協(xié)議
根據(jù)紙質(zhì)檔案保存原則與查閱的便利性以及經(jīng)過成本計算后,經(jīng)常查閱的紙質(zhì)檔案應(yīng)當(dāng)保存在溫度14℃-24℃之間,濕度在45%-60%。這一類溫度測試記錄,對精度要求不是特別高,而對測試長時間的穩(wěn)定性,因為測試時間長,幾個月到幾年都有可能,如1小時差10秒,一年之后可能差1天,所以時間的精確度要求較高。為了真實準(zhǔn)確的記錄面積較大檔案室中各個位置的數(shù)據(jù),且能快速查看當(dāng)前溫度要求測試儀體積小,帶LCD顯示。根據(jù)以上實際情況,制定以下技術(shù)規(guī)格:溫度測試范圍:-30℃~ 70℃。其中-20℃ ~ 40℃范圍內(nèi)±0.5℃,其他±1.0℃。記錄數(shù)據(jù)最大量為:32000個。記錄間隔:10秒至24小時可設(shè)置,分辨率1秒。時間精度:每1000秒,±3秒。根據(jù)以上描初期設(shè)計的參數(shù)指標(biāo),經(jīng)過一系列的方案驗證,為了實現(xiàn)集LCD驅(qū)動,AD轉(zhuǎn)換,SPI,串口通信各種功能于一體的的溫度記錄儀且體積小大小接近U盤。這里選用了PICLF1939單片機(jī),這款單片機(jī)低功耗,自帶LCD驅(qū)動,片內(nèi)64K EEPROM,10位AD轉(zhuǎn)換,有SPI接口和串口接口。完全滿足設(shè)計要求。此外,為了實現(xiàn)USB接口與電腦通訊,需要CH340USB串口翻譯芯片,512K的片外EEPROM M95512存儲溫度數(shù)據(jù)以及電源管理芯片等。
在溫度精度要求不高的情況下,這里采用負(fù)溫度系數(shù)的熱敏電阻,圖1是各個溫度的誤差百分比。從圖上不難看出,該熱敏電阻在-30℃-40℃誤差小,其中20℃左右誤差最小,是符合被測試環(huán)境要求的。

圖1
電路采用與10K高精度電阻串聯(lián)分壓后連接PICLF1939模擬輸入端,在熱敏電阻于GND之間并聯(lián)104電容,過濾干擾信號,PICLF1939的 模數(shù)轉(zhuǎn)換器可以將模擬輸入信號轉(zhuǎn)換為該信號的 10 位二進(jìn)制表示。該器件使用模擬輸入,這些輸入通過多路開關(guān)連接到一個采樣保持電路。采樣保持電路的輸出與轉(zhuǎn)換器的輸入相連。該轉(zhuǎn)換器通過逐次逼近法生成 10 位二進(jìn)制數(shù)并將轉(zhuǎn)換結(jié)果存儲到ADC 結(jié)果寄存器(ADRESH:ADRESL寄存器對)。與AD轉(zhuǎn)換相關(guān)的寄存器:TRISA:端口PORTA的方向寄存器,把被轉(zhuǎn)換的電壓連接的模擬輸入口設(shè)置為輸入。
ADCON0,

CHS<4:0>:模擬通道選擇,選擇通道0,00000 = AN0。
GO/DONW:1 = A/D轉(zhuǎn)換正在進(jìn)行。將該位置 1 可啟動A/ D轉(zhuǎn)換周期。 當(dāng) A/D 轉(zhuǎn)換完成以后,該位由硬件自動清零。 0 = A/D轉(zhuǎn)換完成 /未進(jìn)行。
ADON:ADC使能位,1=ADC被使能,0=ADC 被禁止且不消耗工作電流。為了節(jié)能,只用在AD轉(zhuǎn)換時才開啟。結(jié)束后關(guān)閉。
ADCON1,

ADFM:1 =右對齊。
ADCS<2:0>:AD轉(zhuǎn)換時鐘選擇位。本次選擇111=FRC由專用RC振蕩器提供時鐘。FRC在睡眠模式依然可以工作。
ADNREF:0 = VREF- 與VSS 連接。
ADPREF:00 = VREF+與VDD 連接。
ANSELA:PORTA 模擬選擇寄存器,設(shè)置為0x03把RA0,RA1設(shè)置為模擬輸入位。
這里在溫度采樣時,標(biāo)準(zhǔn)電壓與系統(tǒng)的電源和GND相連。因為計時與通訊模塊都需要用到中斷,而AD轉(zhuǎn)換是定時進(jìn)行不存在不確定突發(fā)事件,所以本次INTCON PIE1 PIR1等寄存器關(guān)于AD轉(zhuǎn)換的中斷,全部關(guān)閉,采用查詢修改GO/DONW位來控制和判斷AD的狀態(tài)。
如下圖2所示阻值與溫度的關(guān)系,是非線性的,為了綜合考慮精確度和程序空間利用微分原理,把該曲線每5攝氏度分段,每段用一個直線方程表示。

圖2
程序中,把AD轉(zhuǎn)換的值轉(zhuǎn)換成電阻值代入直線方程救可得出溫度值。
例如:
11℃的中心阻值是19500Ω,15℃的中心阻值15600Ω。假設(shè)直線方程為Y=KX+B X=11,15;Y=19500,15600;計算結(jié)果不需要小數(shù),所以放大10倍以后,得出的直線方程為:X=(30225-Y)/98
ADCON1=0b11110000;//右對齊,F(xiàn)RC為AD時鐘。
ADCON0=0b00000000;//模擬通道0;標(biāo)準(zhǔn)電壓連接電壓與GND。
FVRCON=0b00000000;//內(nèi)部標(biāo)準(zhǔn)電壓關(guān)閉。
ANSELA = 0x03; //RA0,RA1,設(shè)為模擬通道
ADCON0bits.ADON=1; //使能AD轉(zhuǎn)換
DelayUs(100);
ADCON0bits.GO_nDONE=1;//GO_nDONE置1,AD開始
DelayUs(50);
if(!ADCON0bits.GO_nDONE)//查詢GO_nDONE,為0時AD轉(zhuǎn)換結(jié)束
{short Advaule;
unsigned long Adteko,Adfx;
gTestH=ADRES; //取出AD轉(zhuǎn)換的結(jié)果
Adteko=gTestH*10000;
Adteko=Adteko/(1023-gTestH);//還原阻值。
if((Adteko<19500)&&(Adteko>=15600))//例:還原阻值后,阻值代入直線方程
{ Adfx=30225-Adteko;
Advaule=Adfx/98;
Advaule+=gSet.Ver; //得出溫度值,加減校準(zhǔn)值進(jìn)一步調(diào)整
…… 以下省略
return Advaule; }
(1)根據(jù)《JJF 1366-2012溫度數(shù)據(jù)采集儀校準(zhǔn)規(guī)范》標(biāo)準(zhǔn)的要求,選用標(biāo)準(zhǔn)恒溫箱與標(biāo)準(zhǔn)溫度計進(jìn)行驗證,對實驗環(huán)境的要求如下:a) 環(huán)境溫度 (20 土 5)t;b) 相對濕度=不超過 85 Yo;c) 當(dāng)電測儀器對環(huán)境條件另有要求時,應(yīng)滿足其規(guī)定要求。
主要檢測設(shè)備
測溫設(shè)備:標(biāo)準(zhǔn)鉑電阻溫度計,技術(shù)要求二等;
恒溫設(shè)備:恒溫槽,溫度均勻性不超過 0.01 ℃,溫度波動性不超過 0.02 ℃/10 min;
專用恒溫箱:溫度范圍為( -50~+150)℃溫度均勻度不超過0.05 ℃,溫度波動度不超過士 0.02 ℃/10 min 。
把代校準(zhǔn)待測試的溫度記錄儀和標(biāo)準(zhǔn)的鉑電阻溫度計的測溫部分一同放在專用恒溫箱中,用標(biāo)準(zhǔn)溫度計的讀書與溫度記錄儀的讀數(shù)作比較,經(jīng)過多個產(chǎn)品多次測試校準(zhǔn),利用直方圖,散布圖以及工程能力計算等手段,把程序中各條溫度計算曲線調(diào)到最接近測試結(jié)果中心值的狀態(tài)。
(2)與保證時間精度一樣,因為每一個熱敏電阻都有個體誤差,為保證每個溫度記錄儀的溫度準(zhǔn)確,需要在恒溫箱中,測出被測產(chǎn)品與標(biāo)準(zhǔn)溫度計某一點的溫差,再利用上位PC機(jī)把溫差換算成補償溫度值,由USB發(fā)給產(chǎn)品的單片機(jī),單片機(jī)把補償值記錄在片內(nèi)的EEPROM中,程序上每次測試溫度都要跳出補償值加在結(jié)果上。
因為溫度數(shù)據(jù)是一個-300至+700的有符號數(shù)據(jù),所以每一個溫度數(shù)據(jù)都要2個字節(jié)保存,想要存到32000個數(shù)據(jù)片內(nèi)EEPROM是不夠的,這里利用512Kbit的片外EEPROM M95512,不需要串口通信控制,利用SPI總線就可以進(jìn)行數(shù)據(jù)讀寫。512Kbit 64K字節(jié),符合32000個數(shù)據(jù),保存空間需要64000個字節(jié)的要求的。SPI總線,SPI 總線可以允許有一個主器件和一個或多個從器件同時工作。這里單片機(jī)作為主器件,只需要一個從器件M95512就足夠保存數(shù)據(jù)了。M95512的工作方式,由主器件發(fā)出命令,從器件做出相應(yīng)的回答,所以只用控制主器件的發(fā)射接收。控制方式主要有兩種第一種設(shè)置SSPCON1、SSPSTAT等寄存器,對SSPBUF進(jìn)行讀寫來與從器件通訊。第二種不設(shè)置寄存器,可以用任何I/O口來實現(xiàn)S位選,SCK時鐘,SDO輸出數(shù)據(jù),SDI輸入數(shù)據(jù)。發(fā)送方法如下:
for(tmp=0;tmp<8;tmp++)//根據(jù)發(fā)送長度,改變循環(huán)次數(shù)或調(diào)用次數(shù)
{if(cmd &0x80)// 把發(fā)送內(nèi)容存入cmd
SDO_H; //判斷最高位,最高位為1輸出置1
Else
SDO_L; //最高位為0輸出置0
SCK_H; //時鐘高
DelayUS(1); //延時
SCK_L; //時鐘低把當(dāng)前位數(shù)據(jù)發(fā)向從器件
cmd <<= 1; } //左移,判斷下一位
接收方法如下:
for(tmp=0;tmp<8;tmp++)
{ SCK_H; //時鐘高再低讀回一位數(shù)據(jù)
DelayUS(1);
SCK_L;
if(!SDI)
readout &= 0xFE;//輸入數(shù)據(jù)存入中間變量
else
readout |= 0x01;
if(tmp != 7) readout <<=1;}
return readout; //返回數(shù)據(jù)
例如要在0x0001地址中寫入 0x55數(shù)據(jù),流程是片選S置0選中該存儲器,時鐘和輸出都置0,向存儲器發(fā)送0x06寫使能命令,再發(fā)送0x02寫操作命令,接下來先發(fā)地址0x0001,再發(fā)數(shù)據(jù)0x55,就把0x55寫入到了0x0001地址中。同樣為了節(jié)能SPI的片選使能都是平時關(guān)閉,要用時開啟。
PIC16LF1939器件中,該模塊最多能驅(qū)動 4 個公共端和 24段的面板。可以直接驅(qū)動液晶模塊不需要液晶自帶驅(qū)動和操作程序,這樣就大大降低的顯示的成本,原來幾十上百的液晶驅(qū)動模塊現(xiàn)在加上接觸用的斑馬條只需要2塊錢左右。通過設(shè)置LCDCON LCDCST LCDPS LCDREF LCDRL LCDSE等寄存器就可以驅(qū)動LCD,通過給LCDDATA賦值,就可改變LCD顯示。平時關(guān)閉LCDEN=0,以降低能耗。
把溫度記錄儀插上PC USB接口,可以立即讀取記錄儀的記錄數(shù)據(jù),并生成時間溫度的曲線圖。還可以將數(shù)據(jù)用Execl文件形式導(dǎo)出。用戶界面中可以設(shè)置溫度測量的時間間隔,報警上下限延時啟動時間,同步時間等等。都是通過PC與單片機(jī)之間的自制串口協(xié)議進(jìn)行通訊的。
在各種信息數(shù)據(jù)大爆炸的物聯(lián)網(wǎng)時代,人們更關(guān)心數(shù)據(jù)的多樣性與準(zhǔn)確性,以及通過數(shù)據(jù)分析出的對生活生產(chǎn)有價值的結(jié)果。而單片機(jī)也在飛速發(fā)展,集成度越來越高,體積越來越小,專用通用的各種功能越來越強。因此單片機(jī)勢必會在數(shù)據(jù)采集的末端大放異彩。
[1]《PIC16F1939 data sheet》.
[2]《JJF 1366-2012溫度數(shù)據(jù)采集儀校準(zhǔn)規(guī)范》.
[3]《M95512 data sheet》.
[4]《CH340 data sheet》.