葉碩
(武漢郵電科學(xué)研究院,湖北 武漢 430000)
佘新平
(長江大學(xué)電子信息學(xué)院,湖北 荊州 434023)
智能抄表采集是指通過嵌入式技術(shù)、無線通訊以及計算機(jī),對用戶電能使用信息進(jìn)行采集處理的過程。隨著通信技術(shù)、微處理器技術(shù)、數(shù)據(jù)處理技術(shù)的共同發(fā)展[1],智能電網(wǎng)的建設(shè)克服了傳統(tǒng)抄表對人力資源造成浪費(fèi)的缺陷,有效降低了抄表的成本,并提高了電表信息采集的準(zhǔn)確性。筆者設(shè)計了一種基于STM32處理器、運(yùn)用循環(huán)冗余校驗(yàn)手段的智能抄表采集系統(tǒng),旨在方便用電管理部門對用電信息的采集,提高工作效率。
圖1 智能抄表采集系統(tǒng)結(jié)構(gòu)框圖
智能抄表采集系統(tǒng)(采集器)的結(jié)構(gòu)框圖如圖1所示。采集系統(tǒng)以STM32處理器為核心,RS485通信模塊和紅外發(fā)射模塊為主要結(jié)構(gòu),使用液晶屏和LED指示燈顯示采集信息和狀態(tài)。電能表通過RS485通信模塊與處理器相連,將表征著用戶用電狀況的信息發(fā)送給STM32處理器;電表信息經(jīng)過STM32處理后,再通過紅外通信模塊發(fā)送給上位機(jī)做進(jìn)一步分析;同時,液晶屏顯示當(dāng)前采集到的用電數(shù)據(jù),指示燈提示采集是否成功。上位機(jī)為基于MCU(微控制單元,Microcontroller Unit)組成的控制系統(tǒng),具有對紅外上傳數(shù)據(jù)進(jìn)行分析篩選的能力。
目前市面上STM32處理器主要存在F4、F1兩種型號[1]。相比STM32F1,STM32F4運(yùn)算速度更快、功能更為完善。該系統(tǒng)在算法上對速度有一定要求,且為考慮到以后升級擴(kuò)展,故選用STM32F4作為處理器。
RS232與RS485是2種常用的有線數(shù)據(jù)通信接口標(biāo)準(zhǔn)。與RS232相比,RS485接口電平降低且兼容于TTL電平,即使在無法確保斷電的情況下插拔,也能降低對接口電路芯片的損壞概率。其數(shù)據(jù)傳輸采用差分信號負(fù)邏輯,因而能有效抑制共模干擾,保證傳輸數(shù)據(jù)的穩(wěn)定。此外,RS485在近距離時速率可達(dá)到35Mbps,并支持遠(yuǎn)距離傳輸,還可以通過多種校驗(yàn)的手段進(jìn)一步提高數(shù)據(jù)傳輸?shù)目煽啃?,適合作為智能抄表采集系統(tǒng)的底層通信方式。
圖2 MAX3485芯片與DB9連接電路
MAX3485是一種差分信號到電平信號轉(zhuǎn)換的芯片,適用于半雙工通信,其通信電壓3.3V,可實(shí)現(xiàn)最高10Mbps的傳輸速率。該系統(tǒng)設(shè)計選用該芯片(見圖2),MAX3485芯片A、B引腳與DB9的2、3腳相連,將接收到的差分信號轉(zhuǎn)換為電平信號后,傳送至STM32的USART1中,通過算法完成對采集數(shù)據(jù)的處理。
紅外通信主要通過數(shù)據(jù)電脈沖與紅外光脈沖之間的相互轉(zhuǎn)換來實(shí)現(xiàn)無線的數(shù)據(jù)收發(fā),可用來取代點(diǎn)對點(diǎn)的線纜連接[2]。紅外線接收頭CHQ1838D具有較強(qiáng)的抗干擾能力,能實(shí)現(xiàn)寬角度、長距離接收,且能正常工作于2.7V的低電壓條件,因此系統(tǒng)紅外模塊的設(shè)計選用其作為接收裝置。
采集器在整個抄表系統(tǒng)中承擔(dān)中轉(zhuǎn)作用,對電能表而言,采集器將表中表征著用戶電能使用情況的數(shù)據(jù)進(jìn)行采集;對上位機(jī)而言,采集器給整個智能電網(wǎng)系統(tǒng)提供基本用電數(shù)據(jù)。因此,采集系統(tǒng)收發(fā)數(shù)據(jù)的可靠性就顯得很重要,為保證數(shù)據(jù)的可靠,必須對所有傳輸?shù)臄?shù)據(jù)進(jìn)行循環(huán)冗余校驗(yàn)(CRC)。
數(shù)據(jù)的傳輸速率和可靠性往往不可兼得,采用信道編碼的方式可以有效解決二者之間的矛盾。信道編碼又稱差錯控制編碼,其常用的方法包括前向糾錯方式(FEC)、混合糾錯(HEC)方式以及循環(huán)冗余校驗(yàn)(CRC)方式。其中,前2種方式都有各自的缺陷[3],適用場合受局限,而循環(huán)冗余校驗(yàn)(CRC)方式,不僅編碼、解碼方式簡單,在不增加過多冗余位的條件下,也能保持較低的誤判率,因此,CRC校驗(yàn)方式被廣泛應(yīng)用。
循環(huán)冗余校驗(yàn)原理如下:將待傳送的k位碼序列視為多項(xiàng)M(x)式的系數(shù),則M(x)的最高次冪為k-1次冪,選擇最高次冪為r的多項(xiàng)式G(x)作為生成多項(xiàng)式,則由:
生成多項(xiàng)式G(x)應(yīng)滿足3個要求:任何一位發(fā)生錯誤都應(yīng)使余數(shù)不為0;不同位發(fā)生錯誤時應(yīng)當(dāng)使余數(shù)不同;余數(shù)應(yīng)滿足循環(huán)規(guī)律[4]。幾種典型的生成多項(xiàng)式如表1所示。
表1 幾種典型的生成多項(xiàng)式
圖3 CRC-16編碼發(fā)送流程圖
CRC校驗(yàn)可以檢測出所有奇數(shù)個隨機(jī)錯誤和長度不超過多項(xiàng)式G(x)最高階的突發(fā)錯誤[4],但若出現(xiàn)錯誤碼元恰好能被多項(xiàng)式G(x)整除的情況,則CRC校驗(yàn)無法發(fā)揮作用,但通過增加CRC的生成多項(xiàng)式G(x)的階數(shù),使余式R(x)位數(shù)增加,可有效降低誤判概率。
CRC-16校驗(yàn)算法分為查表法和計算法2種,其中查表法節(jié)省了CPU運(yùn)算時間,因此具有更高的運(yùn)算速度;而計算法嚴(yán)格遵照CRC校驗(yàn)原理進(jìn)行運(yùn)算,因此代碼相對較少,具有靈活的移植性。設(shè)計之初筆者考慮了處理器的運(yùn)算速度,因此采用計算法。
CRC-16校驗(yàn)碼計算方法是將16位的CRC寄存器所有位全部賦值為1(1111 1111 1111 1111,化為十六進(jìn)制為0xFFFF),取發(fā)送數(shù)據(jù)的一個字節(jié),與CRC寄存器中的數(shù)據(jù)進(jìn)行異或運(yùn)算,再將CRC寄存器的內(nèi)容右移一位,用0填補(bǔ)最高位,并檢查右移后的移出位:若移除數(shù)據(jù)為1,則將當(dāng)前CRC寄存器的數(shù)據(jù)與多項(xiàng)式0xA001(1010 0000 0000 0001)進(jìn)行異或;若移除數(shù)據(jù)為0,則CRC寄存器的內(nèi)容繼續(xù)右移一位,用0填補(bǔ)最高位,并檢查右移后的移出位。
重復(fù)上述步驟直至右移8次完成,這樣整個8位數(shù)據(jù)全部進(jìn)行了處理;將發(fā)送所有字節(jié)數(shù)據(jù)都按上述步驟計算完成后,得到的16位CRC寄存器的檢驗(yàn)碼;追加在發(fā)送數(shù)據(jù)后,構(gòu)成循環(huán)冗余校驗(yàn)。CRC-16編碼發(fā)送流程圖如圖3所示,對應(yīng)的校驗(yàn)程序如下:
unsigned short CRC_CHECK(unsigned char *USART_RX_BUF, unsigned char size)
{
unsigned short CRC_Temp;
unsigned char i,j;
CRC_Temp = 0xffff;
for (i=0;i { CRC_Temp^= USART_RX_BUF[i]; //取一個字節(jié)的數(shù)據(jù)進(jìn)行異或運(yùn)算 for (j=0;j<8;j++) { if (CRC_Temp & 0x01) //移除數(shù)據(jù)為1,則與0xA001進(jìn)行異或 CRC_Temp = (CRC_Temp ?1 ) ^ 0xa001; else //移除數(shù)據(jù)為0,寄存器內(nèi)容右移0補(bǔ)最高位 CRC_Temp = CRC_Temp ?1; } } return(CRC_Temp); } 圖4 CRC-16解碼流程圖 圖5 數(shù)據(jù)發(fā)射程序框圖 數(shù)據(jù)采集模塊實(shí)現(xiàn)將電表中的信息采集到STM32中,如果數(shù)據(jù)采集無誤,則閃爍綠燈2s用于提示采集成功。如果數(shù)據(jù)采集失敗,則持續(xù)閃爍紅燈,提示數(shù)據(jù)重新采集。 由于CRC編碼采用模2除法,因此每一位除或減的結(jié)果不影響其他位,這意味著運(yùn)算中不會向高位借位,因此本質(zhì)上等同于異或運(yùn)算[5],所以在解碼過程中,將接收信息碼M(x)·xr+R(x)與事先選定的G(x)相除,若恰好整除,則視為傳輸無誤。 實(shí)際操作中,將CRC編碼發(fā)送的校驗(yàn)位數(shù)據(jù)單獨(dú)存儲,取接收的信息位進(jìn)行CRC編碼,對比校驗(yàn)位,若兩者一致,則認(rèn)為發(fā)送信息傳輸無誤,若不正確,則舍棄改組數(shù)據(jù),并通過指示燈提示數(shù)據(jù)重新采集。CRC-16解碼流程如圖4所示。 數(shù)據(jù)發(fā)射模塊將STM32中的信息整理后通過紅外通信的方式發(fā)送給上位機(jī),數(shù)據(jù)發(fā)送過程中閃爍綠色指示燈。 紅外收發(fā)模塊的數(shù)據(jù)傳輸格式,要求前2個字節(jié)為發(fā)送指令位:第1個字節(jié)為地址控制位,規(guī)定發(fā)射地址,其中A1為默認(rèn)地址;第2個字節(jié)為操作控制位,用于修改發(fā)射狀態(tài),具有F1、F2、F3三種設(shè)置,分別對應(yīng)紅外發(fā)射狀態(tài)、修改串口通信地址狀態(tài)、修改波特率狀態(tài);后3個字節(jié)為用戶自定義的發(fā)送信息,由于規(guī)定一次必須發(fā)送5個字節(jié),因此,通過如圖5所示的算法將數(shù)據(jù)完整地傳給上位機(jī)。 發(fā)送中,將前兩位字符設(shè)置為A1、F1,因此發(fā)射程序算法如下:首先將所得數(shù)據(jù)分為3個字節(jié)一組,不足3個字節(jié)則補(bǔ)充添加特定字符FF。然后開辟新數(shù)組,并定義其前2個字節(jié)為所需的發(fā)送指令A(yù)1、F1,再將分組后的電表信息數(shù)據(jù)循環(huán)寫入并發(fā)送。 試驗(yàn)?zāi)M測試完整的數(shù)據(jù)采集過程,通過RS485對電表數(shù)據(jù)進(jìn)行抄收,再經(jīng)由紅外通信對數(shù)據(jù)進(jìn)行發(fā)送。 首先完成抄收數(shù)據(jù)的檢查,將紅外模塊即將發(fā)送的數(shù)據(jù)打印到串口進(jìn)行對比,驗(yàn)證CRC編碼程序與數(shù)據(jù)發(fā)送程序是否正確。測試結(jié)果如圖6所示。然后數(shù)據(jù)通過紅外模塊發(fā)送,上位機(jī)將接收的數(shù)據(jù)打印到串口,對比發(fā)送數(shù)據(jù),驗(yàn)證系統(tǒng)的功能能否實(shí)現(xiàn)。測試結(jié)果如圖7所示。 圖6 自檢發(fā)送測試結(jié)果 圖7 紅外收發(fā)數(shù)據(jù)結(jié)果 在晴朗天氣情況下于室外測試系統(tǒng),并對不同距離條件下數(shù)據(jù)發(fā)送情況進(jìn)行匯總,試驗(yàn)結(jié)果如表2所示。從試驗(yàn)結(jié)果可以看出,系統(tǒng)的通信在短距離內(nèi)較為可靠。 上位機(jī)需要接收來自各個采集器的電表數(shù)據(jù),若使用硬件插拔方式進(jìn)行通信,上位機(jī)的使用壽命將因硬件磨損而縮短,設(shè)計紅外收發(fā)的目的在于克服這一問題,當(dāng)前的紅外收發(fā)距離,已經(jīng)可以較好勝任通信工作。 表2 數(shù)據(jù)抄收記錄 智能抄表技術(shù)在我國經(jīng)過多年發(fā)展,已經(jīng)具有了一定規(guī)模,但智能電網(wǎng)的完善仍有很長的路要走,需要在以綠色節(jié)能為目標(biāo)的驅(qū)動下,完成配電網(wǎng)的更新?lián)Q代、輸電站的進(jìn)一步自動化等,提高電網(wǎng)整體的安全性與高效性。同時,這項(xiàng)惠及民生的工程,還需要在制度上、管理上做到同步的發(fā)展。 [1]任順航,呂鵬鵬,王立鵬,等. 基于STM32的電能手抄系統(tǒng)設(shè)計與實(shí)現(xiàn)[J]. 電子技術(shù)應(yīng)用,2014,40(1):75~78. [2]魏曉艷,李軍. 紅外通訊技術(shù)與藍(lán)牙技術(shù)比較[J]. 電子元器件應(yīng)用,2007,9(4):68~69,72. [3]王忠,李延社,游智勝. CRC算法設(shè)計與程序?qū)崿F(xiàn)[J]. 電子測量技術(shù),2007,30(12):26~28,36. [4]彭偉. 嵌入式系統(tǒng)CRC循環(huán)冗余校驗(yàn)算法設(shè)計研究[J]. 南京信息工程大學(xué)學(xué)報(自然科學(xué)版),2012,4(3):258~265. [5]李宥謀,房鼎益. CRC編碼算法研究與實(shí)現(xiàn)[J]. 西北大學(xué)學(xué)報(自然科學(xué)版),2006,36(6):895~898.3.2 數(shù)據(jù)采集模塊
3.3 數(shù)據(jù)發(fā)射模塊
4 測試分析
5 結(jié)語