基于嵌入式處理器STM32的抽油機(jī)井實(shí)時(shí)監(jiān)控系統(tǒng)設(shè)計(jì)
3.1 傳感器信號(hào)采集板程序設(shè)計(jì)
傳感器信號(hào)采集板上STM32內(nèi)部的程序分為初始化、信號(hào)的采集、ZigBee模塊的數(shù)據(jù)接收、Modbus數(shù)據(jù)幀的接收與發(fā)送等步驟。程序流程圖如圖8所示。
在系統(tǒng)上電后,首先執(zhí)行系統(tǒng)的初始化,包括系統(tǒng)時(shí)鐘的配置;中斷向量配置;ADC、USART、TlMER、GPIO等外設(shè)的工作模式選擇,工作參數(shù)配置;外設(shè)的使能。
主程序是一個(gè)循環(huán)體,在循環(huán)體中,首先通過(guò)判斷串口4接收標(biāo)志位是否置位,如果置位了說(shuō)明接收到ZigBee模塊發(fā)送來(lái)的數(shù)據(jù);然后將這些數(shù)據(jù)存儲(chǔ)在特定的寄存器中;之后判斷定時(shí)器中斷標(biāo)志位是否到達(dá),一旦到達(dá),則啟動(dòng)ADC,進(jìn)行數(shù)據(jù)采集,數(shù)據(jù)處理,數(shù)據(jù)存儲(chǔ)等操作;最后判斷串口5的接收標(biāo)志位是否置位,如果置位說(shuō)明接收到了Modbus的協(xié)議幀,需要解包數(shù)據(jù)幀,響應(yīng)操作,進(jìn)行數(shù)據(jù)讀取,參數(shù)更改,啟??刂频炔僮?。
3.2 電量參數(shù)采集板程序設(shè)計(jì)
類(lèi)似的,電量參數(shù)采集板程序的系統(tǒng)初始化包括系統(tǒng)時(shí)鐘的配置;中斷向量配置;TIMER、SPI、USART、GPIO等外設(shè)的工作模式選擇;以及外設(shè)的使能。
首先通過(guò)SPI接口分別向3個(gè)CS5463發(fā)送初始化以及配置的命令字;其次啟動(dòng)定時(shí)器、SPI、USART等外設(shè);之后不斷查詢(xún)定時(shí)器標(biāo)志位是否置位,如果定時(shí)到達(dá),則通過(guò)SPI接口從CS5463中讀取電壓、電流、功率、功率因數(shù)等數(shù)據(jù);最后判斷串口接收標(biāo)志位是否置位,如果置位說(shuō)明接收到了Modbus的協(xié)議幀,需要將數(shù)據(jù)打包成Modbus數(shù)據(jù)幀,將數(shù)據(jù)幀發(fā)送給上位機(jī)。
3.3 ZigBee通信模塊程序設(shè)計(jì)
ZigBee通信模塊的程序在TI的Z—Stack協(xié)議棧的程序框架下開(kāi)發(fā)。Z—Stack協(xié)議棧是在OSAL操作系統(tǒng)下的一組函數(shù)包,通過(guò)Z—Stack可以很方便的進(jìn)行ZigBee通信有關(guān)的程序編寫(xiě)。
1)發(fā)送數(shù)據(jù)
在ZigBee協(xié)議棧中進(jìn)行數(shù)據(jù)發(fā)送可以調(diào)用AF_DataRequest函數(shù)實(shí)現(xiàn),該函數(shù)會(huì)調(diào)用協(xié)議棧里面的底層函數(shù)來(lái)打開(kāi)發(fā)射機(jī),調(diào)整發(fā)射機(jī)的發(fā)送功率等函數(shù)。最終將數(shù)據(jù)通過(guò)天線(xiàn)發(fā)送出去。
2)接收數(shù)據(jù)
當(dāng)ZigBee模塊接收到ZigBee的數(shù)據(jù)幀后,OSAL將該數(shù)據(jù)幀中的數(shù)據(jù)封裝,然后放入操作系統(tǒng)的消息隊(duì)列中,每個(gè)消息都有自己的編號(hào),即消息ID號(hào),有新數(shù)據(jù)被接收到的消息ID號(hào)為AF_INCOMING_MSG_CMD(0x1A)。
首先使用osal_msg_receivre()函數(shù)從消息隊(duì)列中接收一個(gè)消息,然后通過(guò)switch—case語(yǔ)句進(jìn)行選擇(判斷消息ID),如果消息ID是AF_INCOMING_MSG_CMD,則進(jìn)行相應(yīng)的數(shù)據(jù)處理。
3)串口發(fā)送函數(shù)
CC2430的串口收發(fā)需要用到以下3個(gè)函數(shù),這3個(gè)函數(shù)也是Z—Stack所提供的。
uint8 HalUARTOpen(uint8 port,halUARTCfg_t*config);//串口打開(kāi)初始化
uint16 HalUARTRead(uint8 port,uint8*buf, uint16 len); //讀串口
uint16 HalUARTWrite(uint8 port,uint8*buf,uint16 len);//寫(xiě)串口
使用HalUARTOpen()函數(shù)對(duì)串口進(jìn)行初始化,該函數(shù)使用halUARTCfg_t結(jié)構(gòu)體指針作為參數(shù),在使用CC2430的串口時(shí),需要定義一個(gè)halUARTCfg_t結(jié)構(gòu)體來(lái)初始化CC2430的串口。
uartConfig.Configured = TRUE;
uartConfig.baudRate = HAL_UART_BR_115200;
uartConfig.callBackFunc = Mgr_ProcessZAppData;
在CC2430接收到數(shù)據(jù)之后,調(diào)用HalUARTWrite()函數(shù)發(fā)送數(shù)據(jù),通過(guò)串口發(fā)送給STM32。
3.4 上位機(jī)軟件程序設(shè)計(jì)
在VC++2010環(huán)境下,使用微軟的功能庫(kù)MFC編寫(xiě)上位機(jī)軟件。由于PC機(jī)沒(méi)有RS485的接口,需要通過(guò)一個(gè)RS485到RS232的轉(zhuǎn)接模塊將RS4 85的信號(hào)轉(zhuǎn)換成RS232的信號(hào)。利用MFC中的MSComm控件進(jìn)行RS232串口的通信。
在主窗口類(lèi)CWorkDlg定義CString成員對(duì)象,用于顯示實(shí)時(shí)的壓力、溫度、三相電流電壓;定義繼承于CWnd類(lèi)的子類(lèi),display類(lèi),用于顯示示功圖。在其OnPaint函數(shù)中添加坐標(biāo)以及曲線(xiàn)的繪制代碼。
圖9為上位機(jī)界面。點(diǎn)擊菜單欄上的參數(shù)設(shè)置菜單,會(huì)彈出參數(shù)設(shè)置對(duì)話(huà)框。用戶(hù)可以在參數(shù)設(shè)置對(duì)話(huà)框上更改監(jiān)控參數(shù)。監(jiān)控的參數(shù)包括報(bào)警上限、報(bào)警下限以及采集間隔。當(dāng)抽油機(jī)井的任意一項(xiàng)參數(shù)超出正常范圍后,都可以彈出報(bào)警提示,提示操作員對(duì)此進(jìn)行處理。同時(shí)操作員可以點(diǎn)擊停止按鈕,讓抽油機(jī)井急停。
4 結(jié)論
本文設(shè)計(jì)的監(jiān)控系統(tǒng)采用低功耗、高性能、低成本的嵌入式處理器STM32作為主控芯片??梢詫?shí)時(shí)準(zhǔn)確地反映抽油機(jī)井的生產(chǎn)狀況,在出現(xiàn)故障時(shí)能夠及時(shí)進(jìn)行抽油機(jī)井的啟??刂啤Ec傳統(tǒng)的人工巡視監(jiān)控相比,采用基于微控制器的油井實(shí)時(shí)監(jiān)控系統(tǒng),可降低工人勞動(dòng)強(qiáng)度,減少用工總量,提高總體勞動(dòng)效率;且可靠性高,可保證油氣生產(chǎn)安全、提高油田科學(xué)化管理水平和整體開(kāi)發(fā)效益。
評(píng)論