引言
無論是在日常生活還是在工業(yè)生產(chǎn)中,溫度都是一個(gè)非常重要的指標(biāo)。所以,對(duì)溫度數(shù)據(jù)的采集、測(cè)量和傳輸,一直都是研究的重點(diǎn)。傳統(tǒng)的溫度采集系統(tǒng)的實(shí)現(xiàn)方法包括專門鋪設(shè)有線通信線路傳輸溫度數(shù)據(jù)(如采用RS485總線結(jié)構(gòu))和采用無線通信傳輸溫度數(shù)據(jù)(如藍(lán)牙,GPRS等)。傳統(tǒng)的鋪設(shè)專有的通信線路的方法設(shè)計(jì)成本較高、施工麻煩、出現(xiàn)問題時(shí)很難排除,已經(jīng)很難適應(yīng)高速發(fā)展的現(xiàn)代社會(huì)的需求。采用無線的方式則具有不用布線、實(shí)時(shí)性高等優(yōu)點(diǎn),但是其設(shè)計(jì)成本也相應(yīng)的非常高。而在現(xiàn)代社會(huì)中,電力線幾乎無處不在,因此,本文提出了一種基于電力線通信的溫度采集系統(tǒng),無需專門鋪設(shè)通信線路,能夠大大降低設(shè)計(jì)成本。
1 系統(tǒng)總體設(shè)計(jì)方案
1.1 溫度檢測(cè)模塊總體構(gòu)架
溫度檢測(cè)模塊中,STC12LE5A60S2是主控芯片,由電源模塊、LCD顯示、電力線通信芯片RISE3501、DS18B20溫度傳感器、RS232等電路構(gòu)成??傮w構(gòu)架如圖1所示。
圖1 溫度檢測(cè)模塊總體構(gòu)架
1.2 系統(tǒng)的拓?fù)浣Y(jié)構(gòu)
該系統(tǒng)采用主從式的工作模式,在滿足電力線通信距離的檢測(cè)區(qū)域內(nèi),放置一個(gè)嵌入式上位機(jī)、一個(gè)主機(jī)模塊和多個(gè)溫度檢測(cè)模塊,如圖2所示。嵌入式上位機(jī)可以發(fā)起抄溫度的指令給主機(jī)模塊,主機(jī)模塊則通過電力線抄寫相應(yīng)模塊的。
圖2 系統(tǒng)的拓?fù)浣Y(jié)構(gòu)
溫度,并將溫度數(shù)據(jù)返回給上位機(jī)。例如:在某居民小區(qū),每戶人家放置一個(gè)檢測(cè)模塊,整個(gè)小區(qū)設(shè)置一個(gè)主機(jī)模塊和上位機(jī),則可以實(shí)現(xiàn)對(duì)小區(qū)內(nèi)每戶人家的溫度采集。
本文主要實(shí)現(xiàn)溫度檢測(cè)模塊和主機(jī)模塊的軟硬件設(shè)計(jì)。在本設(shè)計(jì)中,可以更改溫度檢測(cè)模塊的主控芯片內(nèi)的程序,從而將其當(dāng)做主機(jī)模塊使用。
2 系統(tǒng)硬件設(shè)計(jì)
2.1 電源模塊
2.1.1 220V交流電轉(zhuǎn)16V直流電
變壓器將220V交流電轉(zhuǎn)換為16V交流電,橋式整流電路將16V交流電轉(zhuǎn)化為直流電,通過電容電感濾波后得到大約16V直流電。這個(gè)16V直流將直接給電力線通信芯片的發(fā)送電路的功率放大器供電。如圖3所示。
圖3 220V交流轉(zhuǎn)16V直流
2.1.2 16V電壓轉(zhuǎn)化為5V電壓
使用78M05電源芯片將16V直流電轉(zhuǎn)化為5V直流電。這個(gè)5V直流電將給DS18B20溫度傳感器供電。如圖4所示。
圖4 16V電壓轉(zhuǎn)5V電壓
2.1.2 5V電壓轉(zhuǎn)3.3V電壓
使用AP1117將5V直流電轉(zhuǎn)化為VCC3.3V電壓。再通過磁珠F-BEAD分出來VCCA3.3V,VCCA3.3V將給電力線通信芯片的接收電路供電。
圖5 5V電壓轉(zhuǎn)3.3V電壓
2.2 主控芯片STC12LE5A60S2
本系統(tǒng)采用具有兩個(gè)串口的STC12LE5A60S2作為系統(tǒng)的主控單片機(jī)。其特點(diǎn)如下:
是單時(shí)鐘周期、高速、低功耗、超強(qiáng)抗干擾的新一代8051單片機(jī),指令代碼完全兼容傳統(tǒng)的8051單片機(jī),但速度快8~12倍。片上集成60K Flash存儲(chǔ)器,可用于存儲(chǔ)程序和溫度數(shù)據(jù),非常有利于系統(tǒng)的軟件的升級(jí)換代。
該單片機(jī)具有雙串口,這是選擇這款單片機(jī)最主要的原因之一。在系統(tǒng)設(shè)計(jì)中,使用其中的一個(gè)串口和電力線通信芯片進(jìn)行通信,從而控制電力線通信芯片收發(fā)數(shù)據(jù)。另一個(gè)串口則用于下載程序、打印系統(tǒng)調(diào)試信息以及和上位機(jī)通信(溫度檢測(cè)模塊用作主機(jī)模塊時(shí))等。
無需專用下載器,無需專用仿真器,可通過串口直接下載用戶程序。從而降低了設(shè)計(jì)開發(fā)的難度,降低了設(shè)計(jì)成本。
2.3 電力線通信電路
本系統(tǒng)使用RISE3501實(shí)現(xiàn)電力線通信。RISE3501是一款智能型電力載波控制芯片,內(nèi)部集成電力收發(fā)模塊,F(xiàn)lash、SRAM以及 8位處理器內(nèi)核。設(shè)計(jì)符合EIA-709.1和EIA-709.2標(biāo)準(zhǔn)規(guī)范。
RISE3501可以通過串口和主控單片機(jī)通信。單片機(jī)將滿足645規(guī)約的指令和數(shù)據(jù)通過串口發(fā)送給RISE3501,RISE3501則通過電力線將數(shù)據(jù)發(fā)送出去。當(dāng)RISE3501從電力線上接收到發(fā)給自己的數(shù)據(jù)時(shí),其將數(shù)據(jù)收下,并將數(shù)據(jù)通過串口發(fā)送給主控單片機(jī)。
2.4 LCD顯示模塊
本系統(tǒng)使用6位筆段式LCD EDS826來顯示當(dāng)前溫度,采用HT1621B 驅(qū)動(dòng)芯片來驅(qū)動(dòng)EDS826的顯示。這里不使用STC12LE5A60S2單片機(jī)直接驅(qū)動(dòng)EDS826,這樣可以簡(jiǎn)化系統(tǒng)軟硬件設(shè)計(jì)的復(fù)雜度,減輕主控單片機(jī)的任務(wù),從而有利用系統(tǒng)的升級(jí)與擴(kuò)展。其電路結(jié)構(gòu)如圖6所示。
圖6 LCD顯示電路
2.5 溫度檢測(cè)電路
本系統(tǒng)的溫度傳感器使用DS18B20。DS18B20 數(shù)字溫度計(jì)以9 位數(shù)字量的形式反映器件的溫度值。通過一個(gè)單線接口發(fā)送或接收信息,因此在主控單片機(jī)和DS18B20 之間僅需一條連接線(加上地線)。測(cè)溫范圍-55~+125℃,以0.5℃遞增。溫度數(shù)字量轉(zhuǎn)換時(shí)間200ms(典型值)。電路結(jié)構(gòu)如圖7所示。
圖7 溫度檢測(cè)電路
3 系統(tǒng)軟件設(shè)計(jì)
在本系統(tǒng)中,主機(jī)模塊的硬件和溫度檢測(cè)模塊的硬件是完全相同的,但是運(yùn)行在主機(jī)模塊內(nèi)的程序和運(yùn)行在溫度檢測(cè)模塊內(nèi)的程序不同。
3.1 主程序設(shè)計(jì)
3.1.1 主機(jī)模塊的主程序流程圖如圖8所示。主要分為以下幾步:
?。?) 系統(tǒng)上電復(fù)位后,主程序初始化LCD顯示的驅(qū)動(dòng)芯片HT1621B、初始化溫度傳感器DS18B20、初始化串口1和串口2、復(fù)位電力線通信芯片RISE3501。
?。?) 初始化完成后,單片機(jī)檢測(cè)和RISE3501的連接狀態(tài),如果沒有連接好,RISE3501將會(huì)通過串口2不斷的給單片機(jī)發(fā)送握手序列,此時(shí)單片機(jī)給RISE3501回復(fù)滿足645規(guī)約的指令,將RISE3501置于發(fā)送模式。
?。?) 接下來是溫度的顯示。在應(yīng)用中,主程序沒有必要隨時(shí)去讀取溫度來顯示,所以,這里設(shè)置一個(gè)變量來劃分時(shí)間,時(shí)間間隔大約1000ms,變量減為0時(shí),單片機(jī)讀取溫度數(shù)據(jù),并將溫度數(shù)據(jù)發(fā)送給HT1621B,HT1621B驅(qū)動(dòng)LCD顯示出來。
?。?) 然后,單片機(jī)判斷上位機(jī)是否給自己發(fā)來數(shù)據(jù)。前面提到,上位機(jī)通過串口1和單片機(jī)通信。如:當(dāng)上位機(jī)需要抄寫溫度時(shí),通過串口1給單片機(jī)發(fā)送抄寫溫度的指令。當(dāng)單片機(jī)檢測(cè)到串口1有數(shù)據(jù)時(shí),將數(shù)據(jù)接收下來,并解析數(shù)據(jù)包含的指令信息。
?。?)接下來,主機(jī)模塊的單片機(jī)判斷是否需要抄寫從機(jī)的溫度。需要抄寫時(shí),單片機(jī)執(zhí)行抄寫溫度的代碼,并將抄寫的溫度數(shù)據(jù)返回給上位機(jī)。
至此,一個(gè)主程序流程走完,程序返回到(2)的位置,檢測(cè)單片機(jī)和RISE3501的狀態(tài)。需要再次檢測(cè)單片機(jī)和RSIE3501的連接狀態(tài)的原因是:當(dāng)RISE3501與單片機(jī)握手成功后,其90秒后會(huì)再次發(fā)送握手指令,以確保與單片機(jī)的連接。所以,主程序需要循環(huán)檢測(cè)單片機(jī)與RISE3501的連接狀態(tài)。
圖8 主機(jī)模塊的主程序流程圖
3.1.2 溫度檢測(cè)模塊的主程序
溫度檢測(cè)模塊的主程序流程圖如圖9所示。主要分為以下幾步:
?。?) 系統(tǒng)初始化(和主機(jī)模塊相同)。
?。?) 單片機(jī)和RISE3501握手,且將RISE3501置于接收模式,隨時(shí)準(zhǔn)備接收主機(jī)模塊發(fā)來的數(shù)據(jù)。
?。?) 讀取溫度并顯示(和主機(jī)模塊相同)
?。?) 如果收到主機(jī)模塊的抄溫度請(qǐng)求,則將溫度數(shù)據(jù)發(fā)送給主機(jī)模塊。
?。?) 返回步驟(2)
圖9 溫度檢測(cè)模塊的主程序流程圖
3.2 與電力線通信相關(guān)的程序設(shè)計(jì)
本系統(tǒng)使用RISE3501實(shí)現(xiàn)電力線通信。通信的數(shù)據(jù)格式滿足645規(guī)約??梢酝ㄟ^軟件給RISE3501設(shè)定唯一的地址,這個(gè)地址也就是本模塊的地址。
3.2.1 645規(guī)約規(guī)定的數(shù)據(jù)格式
每字節(jié)含8 位二進(jìn)制碼,傳輸時(shí)加上一個(gè)起始位(0)、一個(gè)偶校驗(yàn)位和一個(gè)停止位(1),共11 位。其傳輸序列如圖7。D0 是字節(jié)的最低有效位,D7 是字節(jié)的最高有效位。先傳低位,后傳高位。
?。?) 幀格式
幀是傳送信息的基本單元。幀格式如上表所示。
幀起始符 68H:標(biāo)識(shí)一幀信息的開始,其值為68H=01101000B。
地址域A0~A5:地址域由6 個(gè)字節(jié)構(gòu)成,每字節(jié)2 位BCD 碼。地址長(zhǎng)度可達(dá)12 位十進(jìn)制數(shù),可以為表號(hào)、資產(chǎn)號(hào)、用戶號(hào)、設(shè)備號(hào)等。具體使用可由用戶自行決定。當(dāng)使用的地址碼長(zhǎng)度不足6 字節(jié)時(shí),用十六進(jìn)制AAH 補(bǔ)足6 字節(jié)。低地址位在先,高地址位在后。當(dāng)?shù)刂窞?99999999999H 時(shí),為廣播地址。
控制碼 C:控制碼的格式如下所示:
D7=0:由主站發(fā)出的命令幀
D7=1:由從站發(fā)出的應(yīng)答幀
D6=0:從站正確應(yīng)答
D6=1:從站對(duì)異常信息的應(yīng)答
D5=0:無后續(xù)數(shù)據(jù)幀
D5=1:有后續(xù)數(shù)據(jù)幀
D4~D0:請(qǐng)求及應(yīng)答功能碼
00000:保留
00001:讀數(shù)據(jù)
00010:讀后續(xù)數(shù)據(jù)
00011:重讀數(shù)據(jù)
00100:寫數(shù)據(jù)
01000:廣播校時(shí)
01010:寫設(shè)備地址
01100:更改通信速率
01111:修改密碼
10000:最大需量清零
數(shù)據(jù)長(zhǎng)度L:L 為數(shù)據(jù)域的字節(jié)數(shù)。讀數(shù)據(jù)時(shí)L≤200,寫數(shù)據(jù)時(shí)L≤50,L=0 表示無數(shù)據(jù)域。
數(shù)據(jù)域DATA:數(shù)據(jù)域包括數(shù)據(jù)標(biāo)識(shí)和數(shù)據(jù)、密碼等,其結(jié)構(gòu)隨控制碼的功能而改變。傳輸時(shí)發(fā)送方按字節(jié)進(jìn)行加33H 處理,接收方按字節(jié)進(jìn)行減33H 處理。
校驗(yàn)碼CS:從幀起始符開始到校驗(yàn)碼之前的所有各字節(jié)的模256 的和,即各字節(jié)二進(jìn)制算術(shù)和,不計(jì)超過256 的溢出值。
結(jié)束符 16H:標(biāo)識(shí)一幀信息的結(jié)束,其值為16H=00010110B。
在發(fā)送幀信息之前,先發(fā)送 1~4 個(gè)字節(jié)FEH,以喚醒接收方。
所以,單片機(jī)向RISE3501發(fā)送數(shù)據(jù)前,需要先將要發(fā)送的數(shù)據(jù)打包成滿足以上幀格式的幀,然后再發(fā)送。單片機(jī)接收收到RISE3501的幀后,也要按上述幀格式解析,得到實(shí)際數(shù)據(jù)。如:
主機(jī)向從機(jī)發(fā)送的抄寫溫度的指令的幀,其實(shí)現(xiàn)代碼如下:
void Get_slave_cmd_3501(unsigned char *arr)
{
unsigned char i;
unsigned char tmp=0;
arr[0] = 0xFE;
arr[1] = 0xFE;
arr[2] = 0xFE;
arr[3] = 0xFE;
arr[4] = 0x68;
for(i=0;i<6;i++)
arr[i+5] = SLAVE_ADDR_BUF[i]; //將從機(jī)的地址拷貝進(jìn)來
arr[11] = 0x68;
arr[12] = 0x04; //C控制碼
arr[13] = 0x06; //L 指令的長(zhǎng)度
for(i=0;i<6;i++)
arr[i+14] = 0xCC; // 向slave 發(fā)送的抄溫度指令
for(i=4;i<20;i++)
tmp = tmp + arr[i]; //計(jì)算校驗(yàn)位CS
arr[20] = tmp;
arr[21] = 0x16;
}
其中,SLAVE_ADDR_BUF[]內(nèi)是需要抄溫度的從機(jī)的地址,0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC 是表示抄寫溫度的指令。
溫度檢測(cè)模塊返回的溫度數(shù)據(jù)的幀,其代碼實(shí)現(xiàn)如下:
void Get_TMP_3501(unsigned char *arr)
{
unsigned char i;
unsigned char tmp = 0;
arr[0] = 0xFE;
arr[1] = 0xFE;
arr[2] = 0xFE;
arr[3] = 0xFE;
arr[4] = 0x68;
for(i=0;i<6;i++)
arr[i+5] = HOST_ADDR_BUF[i]; //將主機(jī)的地址拷貝進(jìn)來
arr[11] = 0x68;
arr[12] = 0x04; //C控制碼
arr[13] = 0x06; //L 溫度數(shù)據(jù)的長(zhǎng)度
for(i=0;i<6;i++)
arr[i+14] = TMP[i]; //將溫度數(shù)據(jù)拷貝過來
for(i=4;i<20;i++)
tmp += arr[i]; //計(jì)算校驗(yàn)位CS
arr[20] = tmp;
arr[21] = 0x16;
}
其中,HOST_ADDR_BUF[]內(nèi)是主機(jī)的地址,TMP[]內(nèi)是當(dāng)前的溫度。
3.2.2 單片機(jī)與RISE3501握手程序
RISE3501具有發(fā)送工作模式和接收工作模式。當(dāng)處于發(fā)送工作模式時(shí),可以將單片機(jī)發(fā)給自己的數(shù)據(jù)轉(zhuǎn)發(fā)到電力線上;當(dāng)處于接收工作模式時(shí),可以接收電力線上的屬于與自己地址相符合的數(shù)據(jù),并將數(shù)據(jù)轉(zhuǎn)發(fā)給單片機(jī)。從而實(shí)現(xiàn)了在電力線上的數(shù)據(jù)的收發(fā)。
RISE3501復(fù)位后,將給單片機(jī)發(fā)送握手請(qǐng)求:68 AA AA AA AA AA AA 68 13 00 DF 16。
單片機(jī)給RISE3501回復(fù):68 A0 A1 A2 A3 A4 A5 68 81 08 65 F3 (A0 +33) (A1+33)(A2 +33)(A3 +33)(A4 +33)(A5+33)CS 16,則將RISE3501置于接收模式,其中A0~A5是本模塊的地址。
單片機(jī)給RISE3501回復(fù):68 CC CC CC CC CC CC 68 81 08 65 F3 (A0 +33) (A1+33)(A2 +33)(A3 +33)(A4 +33)(A5+33)CS 16 ,則將RISE3501置于發(fā)送模式,其中A0~A5是本模塊的地址。
在應(yīng)用中,即使握手成功后,RISE3501也需要隨時(shí)和單片機(jī)保持連接狀態(tài),為此RISE3501隔90秒后將再次給單片機(jī)發(fā)送握手信號(hào)。所以,單片機(jī)的主程序需要循環(huán)檢測(cè)RISE3501發(fā)送的握手信號(hào)。
3.2.3 溫度數(shù)據(jù)的抄寫和傳輸程序
主機(jī)模塊抄寫溫度檢測(cè)模塊的溫度的程序流程圖如圖10所示。
圖10 主機(jī)模塊抄寫溫度檢測(cè)模塊的溫度的程序流程圖
溫度檢測(cè)模塊給主機(jī)模塊發(fā)送溫度數(shù)據(jù)流程圖如圖11所示。
圖11 溫度檢測(cè)模塊返回溫度數(shù)據(jù)給主機(jī)模塊流程圖
3.3 溫度檢測(cè)程序
通過DS18B20檢測(cè)溫度的單片機(jī)程序如下
void GetTemperature(void)
{
DS18B20_Reset(); //設(shè)備復(fù)位
DS18B20_WriteByte(0xCC); //跳過ROM命令
DS18B20_WriteByte(0x44); //開始轉(zhuǎn)換命令
while (!DQ); //等待轉(zhuǎn)換完成
DS18B20_Reset(); //設(shè)備復(fù)位
DS18B20_WriteByte(0xCC); //跳過ROM命令
DS18B20_WriteByte(0xBE); //讀暫存存儲(chǔ)器命令
TPL = DS18B20_ReadByte(); //讀溫度低字節(jié)
TPH = DS18B20_ReadByte(); //讀溫度高字節(jié)
}
讀取到的溫度數(shù)據(jù)的高字節(jié)保存在TPH里、低字節(jié)保存在TPL里。此時(shí)的溫度數(shù)據(jù)時(shí)十六進(jìn)制的,為了方便溫度顯示和人們的日常習(xí)慣,需要將溫度數(shù)據(jù)轉(zhuǎn)化為十進(jìn)制。
3.4 LCD顯示溫度的程序
EDS826是6位筆段式LCD,溫度顯示為2位小數(shù)位、3位整數(shù)位、1位符號(hào)位和小數(shù)點(diǎn)。如:0090.50,表示零上90.5度。-005.50,表示零下5.5度。
符號(hào)位 百位 十位 個(gè)位 小數(shù)點(diǎn)后1位 小數(shù)點(diǎn)后2位
單片機(jī)通過向HT1621B發(fā)送命令來控制LCD的顯示。HT1621B顯示驅(qū)動(dòng)芯片具有兩種命令模式:數(shù)據(jù)模式和命令模式。數(shù)據(jù)模式命令包括READ、WRITE和READ-MODIFY-WRITE,它們的識(shí)別碼分別為110、101、101。命令模式的命令較多,其識(shí)別碼是100。
EDS826顯示一位數(shù)據(jù)的流程圖如圖12所示。
圖12 EDS826顯示一位數(shù)據(jù)的流程圖
完整的溫度顯示只需要將每一位的溫度數(shù)據(jù)顯示出來即可。
4 PCB板設(shè)計(jì)以及系統(tǒng)實(shí)現(xiàn)
本系統(tǒng)使用Cadence公司的原理圖設(shè)計(jì)工具concept-HDL進(jìn)行電路原理圖設(shè)計(jì),使用Allegro進(jìn)行PCB板設(shè)計(jì)。最終模塊的實(shí)現(xiàn)如下:
結(jié)語
本文設(shè)計(jì)了一種溫度采集系統(tǒng),利用電力線通信技術(shù),實(shí)現(xiàn)了主機(jī)模塊和溫度檢測(cè)模塊之間的溫度數(shù)據(jù)在電力線上傳輸。系統(tǒng)使用STC12LE5A60S2、RISE3501電力線通信芯片、DS18B20溫度傳感器、EDS826筆段式LCD進(jìn)行設(shè)計(jì)。具有本地顯示溫度以及遠(yuǎn)程抄溫度的功能??梢詰?yīng)用在鋪設(shè)有220V交流電的地方,具有很寬的應(yīng)用范圍和較好的實(shí)用價(jià)值。
(審核編輯: 智匯張瑜)
分享