, , ,
(北京物資學院 信息學院, 北京 101149)
我國是農(nóng)業(yè)大國且每年的糧食產(chǎn)量巨大,加上部分舊糧積壓,大量糧食存儲在糧庫中,糧庫是保證糧食儲存安全的重要基礎設施[1-2],是糧食流通領(lǐng)域中一個重要環(huán)節(jié)。但是由于糧溫、倉溫、倉內(nèi)相對濕度、通風條件、蟲害發(fā)生情況以及氣溫、和空氣的相對濕度等原因的影響,會導致的糧食的陳化、劣變、霉變,給糧食質(zhì)量造成了嚴重的損失[3-4],據(jù)世界糧農(nóng)組織調(diào)查,每年因為蟲食、儲存不當、變質(zhì)的糧食占世界總量的8.5%,幾乎等于非洲饑荒的糧食需求量[5]。糧食的霉變和蟲害等的發(fā)生有時會直接反映到糧溫的變化上,反之,糧倉的溫度變化也會加速糧食的霉變和蟲害的發(fā)生,因此倉溫是判斷糧倉儲糧現(xiàn)狀的一個重要判斷標志,是全面衡量和判斷糧倉糧情的重要依據(jù),為了保證庫存糧食的質(zhì)量,最大限度減少糧食在儲存過程中的損失,糧庫管理人員必須實時檢測儲存糧食的溫度情況,將糧倉內(nèi)溫度控制在一定范圍內(nèi)[6]。大型糧庫的糧倉分布在一定距離內(nèi),在幾十甚至上百個倉庫中有上萬個測溫點,對于如此規(guī)模的糧庫糧食檢測采用分區(qū)取樣的人工方法,顯然已經(jīng)不適應糧庫管理的需要[7]。近年來,隨著電子技術(shù)的發(fā)展和測量技術(shù)的提高,傳統(tǒng)的人工查看糧溫的方法,已逐步被電子測溫設備所取代[8],各種利用電子測溫設備對糧倉的溫濕度進行監(jiān)控的系統(tǒng)被設計出來。劉雪梅[9]等就以MSP430F149單片機為核心,利用傳感器DHT11對糧倉內(nèi)的溫濕度進行了檢測,并分別采用藍牙模塊和GSM網(wǎng)絡將測量結(jié)果實時近距離或遠程傳送至用戶手機;吳海濱[10]以STM32F103單片機為主控芯片,利用DS18B20、RF433無線模塊,單總線通信方式,最大允許接入5120個測量點,設計了一糧倉測溫及通風系統(tǒng),可實現(xiàn)上位機顯示所有點溫度,并通過設置溫度報警閾值進行自動報警,開啟超溫部分的風機,實現(xiàn)對溫度的調(diào)整。趙懿琨[11]等利用DS18B20數(shù)字溫度傳感器和HIH3605濕度傳感器來檢測糧倉環(huán)境,并將實時嵌入式操作系統(tǒng)μC/OS-II移植到LPC2103的處理器平臺,實現(xiàn)了對糧倉的多點溫濕度數(shù)據(jù)的采集,實驗結(jié)果表明該系統(tǒng)可以實現(xiàn)對溫度達到60-70度的夏季堆積濕糧的溫度進行35度高溫的報警。金曉龍[12]利用Zigbee技術(shù),結(jié)合ATmegal128L單片機和CC2420芯片,對糧倉的測溫系統(tǒng)進行了軟硬件設計,可實現(xiàn)對糧倉的溫度檢測,并將檢測結(jié)果動態(tài)顯示并報警的功能。也有學者對糧倉的測量另辟蹊徑,利用光柵和聲波等對糧倉溫度進行測量,如王高[13]等為滿足糧倉的大范圍溫度測量的要求,就利用了光纖布拉格光柵所測溫度與中心波長之間的線性關(guān)系,利用光譜線性頻移函數(shù)獲得糧倉各點的溫度,結(jié)果表明此系統(tǒng)所測溫度基本與標準溫度接近,但其抗干擾性能更強;陳冠男[4]利用聲波在糧食中通過糧食顆粒之間的孔隙的氣體進行傳播的原理,定義了相同溫度、相同傳感器間距下自由空間聲速與糧食中實測聲速比值為聲速轉(zhuǎn)換因子,針對糧食中溫度檢測的要求,提出基于Markov徑向基函數(shù)和Tikhonov正則化的溫度場重建算法,可以對糧倉中任意位置出現(xiàn)一個或多個熱點進行準確定位,探索了利用聲學法檢測糧倉溫度的可能。
各學者對糧倉測溫問題都進行了深入的研究,并建立了相應的監(jiān)測系統(tǒng),對于不同的應用場景具有一定的適用性,但也存在一定的局限性,如是否能應用于大型糧倉、是否適用于任何糧食等,本文針對糧庫測溫系統(tǒng)的需求特點,采用基于CAN總線和DS18B20傳感器的方案,設計了一套溫度采集系統(tǒng),該系統(tǒng)可以有效減少現(xiàn)場布線,具有成本低、可擴展性好、可靠性高等特點。
總線可以選擇CAN總線和RS485總線,但相比RS485總線,CAN總線具有自身的一些特點和優(yōu)勢,在傳輸距離與速度方面,在高速率傳輸時,兩者的傳輸距離相差不大,但在低速率傳輸時,RS485的最大傳輸距離為1219米左右,CAN總線的傳輸距離卻可達到10 km,因此CAN總線在長距離傳輸方面具有絕對優(yōu)勢;在總線利用率方面,RS485是單主從結(jié)構(gòu),一個總線上只能有一臺主機,通訊均由該主機發(fā)起,發(fā)出命令后,要求即時回答,收到答復后再發(fā)下一個命令,它若沒有發(fā)命令,則下面的節(jié)點不能發(fā)送數(shù)據(jù),以免造成數(shù)據(jù)錯亂,而CAN總線是多從結(jié)果,可以多節(jié)點發(fā)送,一個節(jié)點發(fā)送完后,另一節(jié)點探測到總線空閑,即可以發(fā)送,提高了總線的利用效率;錯誤識別方面RS485無法識別錯誤,而CAN總線可以對任何錯誤進行檢測,因此在安全性方面CAN總線也具有一定的優(yōu)勢;另外CAN總線也不會發(fā)生RS485網(wǎng)絡中,系統(tǒng)發(fā)生錯誤后,多節(jié)點同時向總線發(fā)送數(shù)據(jù)導致總線短路,使總線處于死鎖的現(xiàn)象,CAN總線還具有完善的通信協(xié)議,開發(fā)的周期也大大的被縮短了。正是由于CAN總線的這些高性能、高可靠性和突出的數(shù)據(jù)傳輸?shù)刃阅躘13-14],本文的糧倉溫度測量系統(tǒng)選用CAN總線作為數(shù)據(jù)傳輸總線。
DS18B20是一款常用的數(shù)字溫度傳感器,它輸出的數(shù)字信號,適應于3.0~5.5 V的電壓范圍;它具有獨特的單線接口方式,在與微處理器連接時,僅用一IO口條線就可以實現(xiàn)兩者的雙向通訊;它還可實現(xiàn)組網(wǎng)多點測溫,在使用中不需要任何外圍元件,可測溫度范圍達到為-55 ℃~+125 ℃,可編程的分辨率為9~12位,可完成對溫度的高精度測量,另外該傳感器還具有體積小、硬件開銷低、抗干擾能力強等特點,因此本文設計的糧倉測溫系統(tǒng)選擇DS18B20作為溫度傳感器,來測量糧倉中糧垛內(nèi)的溫度場,且傳感器的數(shù)量根據(jù)糧垛的大小來進行確定。
本糧倉測溫系統(tǒng)由測量層和控制層兩部分組成,測量層由一系列的測量單元并聯(lián)組成,每個測量單元包括微控制器、溫度傳感器組、CAN收發(fā)器等;控制層由帶CAN接口卡的計算機組成。兩部分由CAN總線相聯(lián)接,系統(tǒng)的結(jié)構(gòu)如圖1所示。多個DS18B20并聯(lián)在唯一的單線上,實現(xiàn)多點測溫。考慮溫度傳感器單總線的驅(qū)動能力和現(xiàn)場應用需求,每個微控制器的IO引腳并聯(lián)8個溫度傳感器。具體電路如圖2所示。
圖1 糧倉測溫系統(tǒng)結(jié)構(gòu)圖
圖2 溫度傳感器電路
微控制器STM32F407ZET6是本系統(tǒng)的核心,通過CAN總線與計算機進行通信,接收計算機的命令、上傳數(shù)據(jù);通過IO接口與多組并聯(lián)的溫度傳感器相聯(lián)。與單總線相連的接口須為漏極開路或3態(tài)輸出,因此STM32F407ZET6的IO設置為漏極開路(open-drain)輸出模式,其電路如圖3所示。
CAN通信模塊實現(xiàn)與上位機的數(shù)據(jù)通信,本文選用STM32F407ZET6自帶的CAN控制器,采用SN65HVD230作為CAN收發(fā)器。為了增強抗干擾能力,在收發(fā)器和對外接口之間加入了共模電感、瞬態(tài)電壓抑制二極管和100皮法電容。
圖3 單片機和CAN網(wǎng)絡收發(fā)器電路圖
DS18B20需要嚴格的單總線協(xié)議以確保數(shù)據(jù)的完整性。協(xié)議包括如下信號類型:復位脈沖、存在脈沖、寫0、寫1、讀0和讀1。這些信號都有嚴格的時間要求,除存在脈沖外,都是由總線控制器發(fā)起的【datasheet】。其時序如圖4~5所示。
圖4 DS18B20的復位和存在脈沖時序
圖5 DS18B20的讀寫時序(線型含義同圖4)
分析圖4和圖5可知,下降沿或上升沿后加一定的保持時間間隔是單總線信號的基本組成單位。協(xié)議包括的所有信號都是這些基本單位的一種組合。對DS18B20的任何一種功能操作又都是這些信號的一種組合。其偽代碼如下:
復位和讀存在脈沖函數(shù)序列:
ResetFallingEdge(void) {
Gpio output zero;
Set the timer counter so that the timing cycle is 640us;
}
ResetRisingEdge(void){
Gpio output one;
Set the timer counter so that the timing cycle is 70us;
}
ReadPresencePulse(void){
Read gpio input;
Set the timer counter so that the timing cycle is 570us;
}
寫“1”的函數(shù)序列:
WriteOneFallingEdge(void){
Gpio output zero;
Set the timer counter so that the timing cycle is 10us;
}
WriteOneRisingEdge(void){
Gpio output one;
Set the timer counter so that the timing cycle is 70us;
}
寫“0”的函數(shù)序列:
WriteZeroFallingEdge(void){
Gpio output zero;
Set the timer counter so that the timing cycle is 70us;
}
WriteZeroRisingEdge(void){
Gpio output one;
Set the timer counter so that the timing cycle is 10us;
}
讀操作的函數(shù)序列:
ReadFallingEdge(void){
Gpio output zero;
Set the timer counter so that the timing cycle is 5us;
}
ReadRisingEdge(void){
Gpio ouput one;
Set the timer counter so that the timing cycle is 10us;
}
ReadValue(void){
Read gpio input;
Set the timer counter so that the timing cycle is 65us;
}
為了實現(xiàn)控制器在單總線上以精確的時間輸出這些信號組合,本文采用定時器驅(qū)動的方法。利用2個定時器,第一個定時器確定溫度的轉(zhuǎn)換周期,第2個定時器實現(xiàn)操作時序。在第2個定時器的中斷處理函數(shù)中依次調(diào)用上述的一種函數(shù)序列即可實現(xiàn)對DS18B20的復位操作、寫“1”操作、寫“0”操作或讀操作。下面以溫度轉(zhuǎn)換操作為例敘述其實現(xiàn)方法。DS18B20的溫度轉(zhuǎn)換的命令序列如表1所示。
表1 DS18B20的溫度轉(zhuǎn)換的命令序列表
將上表中命令序列所組成的位序列所需要的函數(shù)的指針放到函數(shù)指針數(shù)組中,構(gòu)成一個實現(xiàn)溫度轉(zhuǎn)換的指針數(shù)組。代碼如下:
typedef void (*pf)(void);
pf pcSequenceTx[163] ={
ResetFallingEdge, ResetRisingEdge, ReadPresencePulse,//復位及讀存在操作
WriteOneFallingEdge, WriteOneRisingEdge, //寫1
WriteOneFallingEdge, WriteOneRisingEdge, //寫0
WriteZeroFallingEdge,WriteZeroRisingEdge,
WriteZeroFallingEdge,WriteZeroRisingEdge,
……
};
定義指向函數(shù)指針數(shù)組的指針:pf(*ppf)[],將pcSequenceTx數(shù)組的首地址賦給ppf,在第2個定時器的中斷服務程序中調(diào)用ppf(n)即可實現(xiàn)對DS18B20的操作,中斷服務程序的代碼如下:
Timer2_irqhandler(){
Disable interrupt;
n = n + 1;
ppf(n);
Enable interrupt;
}
同理,其他操作都可以構(gòu)成一個函數(shù)指針數(shù)組,再將其數(shù)組的首地址賦給ppf,啟動定時器2即可實現(xiàn)所需要的操作。如溫度讀取操作,其命令序列如下表2所示。
表2中命令序列所組成的位序列所需要的函數(shù)的指針放到函數(shù)指針數(shù)組中,構(gòu)成一個讀取溫度值的指針數(shù)組。代碼如下:
表2 DS18B20的溫度讀取命令序列表
typedef void (*pf)(void);
pf pcSequenceRx[211] ={
ResetFallingEdge,
ResetRisingEdge,
……
}
系統(tǒng)需要溫度轉(zhuǎn)換時,啟動第一個定時器,第一個定時器的定時周期即是溫度采集的間隔周期,第一個定時器的中斷函數(shù)中設置標志位,主程序中根據(jù)此標志位啟動第2個定時器,先把上次轉(zhuǎn)換的溫度結(jié)果讀出,再啟動本次的轉(zhuǎn)換。以上述操作順序先對同一IO口的溫度傳感器進行操作,再操作另一IO口的溫度傳感器。所有IO的讀取溫度值和轉(zhuǎn)換命令結(jié)束后,把標志位清除。第一個定時器的中斷服務程序代碼如下:
Timer1_irqhandler(){
Disable interrupt;
ttflag = 1;
Enable interrupt;
}
建立在CAN總線之上的數(shù)據(jù)傳輸可以根據(jù)具體的實際情況構(gòu)建自己的數(shù)據(jù)交換規(guī)則,即應用層協(xié)議。糧倉測溫系統(tǒng)的工作包括了控制層計算機向測量單元發(fā)送控制命令、參數(shù)設置及測量單元根據(jù)命令進行溫度轉(zhuǎn)換和上傳溫度數(shù)據(jù)。因此,本系統(tǒng)的控制層計算機和測量單元的微控制器間的通信采用主從結(jié)構(gòu),控制層計算機為主站,測量單元為從站。從站不主動發(fā)送數(shù)據(jù),只有接到主站的命令后才根據(jù)命令進行溫度轉(zhuǎn)換或上傳溫度數(shù)據(jù)。
CAN規(guī)范的幀格式分為標準格式與擴展格式,且均有4種不同的幀類型,本應用層協(xié)議只用到CAN標準幀中的數(shù)據(jù)幀。數(shù)據(jù)幀標識符的定義如表3所示。
表3 數(shù)據(jù)幀標識符的定義
幀類型定義如表4所示。
主站發(fā)出的廣播幀優(yōu)先級最高,其從站地址可忽略,用于向所有的測量單元發(fā)送相同的操作命令,如相同的溫度采樣間隔時間設置命令等。
表4 幀類型定義
從站地址標識了不同的測量單元,每個測量單元分配一個從站地址。主站可依次給每個測量單元發(fā)送上傳數(shù)據(jù)命令,從而得到測量單位的數(shù)據(jù)。
圖6 通信流程
測量單元作為被動通信方,只接收處理并回復控制層計算機發(fā)送的命令包,而不主動向控制層計算機發(fā)送命令。通信流程如圖6所示??刂茖佑嬎銠C向測量層控制器發(fā)送命令包,測量層控制器判斷ID是否匹配,若不匹配擇不做任何響應,若匹配,則進行命令包的解析和處理,并構(gòu)建回復包后發(fā)送回控制層,控制層也要進行ID匹配的判斷,若不匹配,則不做任何響應,若匹配,則再繼續(xù)發(fā)送下一個命令包。
系統(tǒng)啟動后,程序進行初始化,包括了CPU的初始化和系統(tǒng)工作參數(shù)的初始化,如溫度測量間隔、溫度測量精度等初始化為系統(tǒng)默認值,以及識別每個IO口上的DS18B20,完成后程序一直處于接收狀態(tài)。上位機下發(fā)給下位機的命令主要包括:溫度測量間隔設置命令、溫度測量精度設置命令、溫度單次測量命令、傳感器識別命令、溫度連續(xù)測量命令、讀取溫度命令等,下位機接受到上位機的命令后,要對命令進行相應的識別,并在識別后執(zhí)行該命令,上傳回復包。主程序的軟件流程如圖7所示。
圖7 主程序流程圖
為了驗證該系統(tǒng)溫度采集的可靠性和準確性,設計了采集單元數(shù)據(jù)采集試驗、CAN通訊試驗和對該系統(tǒng)在室溫下進行了溫度采集的準確性實驗。
首先利用仿真器使得采集單元的MCU在仿真下運行,可指定對每個IO上的一個DS18B20進行溫度讀取和溫度轉(zhuǎn)換。同時利用邏輯分析儀采集該IO線上的數(shù)據(jù),把獲得的數(shù)據(jù)與MCU軟件中發(fā)出的數(shù)據(jù)進行比較,如果一致則證明該IO線上的溫度轉(zhuǎn)換操作正確,否則說明軟硬件存在問題。通過這種方法,驗證了采集單元采集溫度是正確的、可行的。
為了驗證CAN通信的可行性和可靠性,利用CANScope-Pro型CAN分析儀對CAN通信的物理層、數(shù)據(jù)鏈路層和應用層進行了驗證。物理層主要驗證節(jié)點及系統(tǒng)在電路設計、物理電平特性等方面的性能,這是保證節(jié)點能夠正確連接入總線的基礎。數(shù)據(jù)鏈路層測試包括了位定時測試、采樣點測試、SJW測試等,各個節(jié)點中這些參數(shù)保持一致才能使網(wǎng)絡正常有效的工作。應用層測試用于驗證應用層協(xié)議運行正確與否。通過試驗測試驗證了系統(tǒng)網(wǎng)絡工作穩(wěn)定可靠。
實驗時先將測溫系統(tǒng)放到實驗臺上,開機十分鐘后開始測量,每5s測量讀出一次溫度值,測量精度設置為12位。實驗中用標準水銀溫度計檢測室溫并用配套的讀數(shù)裝置讀出水銀溫度計的指示溫度,每10s讀出記錄一次。實驗結(jié)果如表5所示。
表5 實驗測量值 ℃
由表可知,系統(tǒng)能夠可靠的測量到各溫度點的溫度值,且最大偏差小于0.3,系統(tǒng)測溫方案的可靠性較強。
通過電子測溫設備對糧倉儲存糧食的溫度情況進行檢測,可有效提高糧庫的工作效率和管理質(zhì)量,文章充分利用CAN總線高性能、高可靠性傳輸數(shù)據(jù)的性能,利用DS18B20作為溫度傳感器,設計了一款糧倉測溫系統(tǒng),系統(tǒng)分為測量層和控制層兩部分,并通過CAN總線連接,實現(xiàn)了現(xiàn)場布線的簡化和數(shù)據(jù)的遠距離傳輸。實驗結(jié)果表明,該測量系統(tǒng)測量結(jié)果可保持在0.3的偏差范圍內(nèi),驗證了系統(tǒng)測溫方案的可靠性,可較好的應用于糧倉的測溫中。