蓄電池在電力系統中是一種必備的后備電源且數量較多, 其使用壽命和安全可靠性倍受用戶關注。但由于使用不當或者不能及時維護,經常會導致蓄電池組中個別蓄電池的過放電或者早期失效。過放電或者早期失效的個別蓄電池在后備電源投入使用時,會嚴重影響整個電池組的放電容量,甚至會導致整個供電系統的崩潰。因此,為保證在市電被切斷時用電設備能夠安全可靠運行,避免蓄電池在長期使用過程中因個別電池過放電或者失效而引發事故帶來經濟損失,對蓄電池進行實時在線監測和及時的故障診斷成為蓄電池維護工作的一個極為重要 方面。本文介紹的基于STC89C58RD+微控制器的蓄電池在線監測系統,能實現對蓄電池無論在閑置狀態還是充、放電動態過程中的狀態監測;對蓄電池內 部開路、短路、過壓、欠壓及過度放電等異常狀態及時報警并存儲數據以備查詢;能對2V、6V和12V多種多節電池電壓在線測量;提高了對蓄電池監測的準確 性、自動化和智能化程度。本文具體介紹了系統的硬件設計和軟件實現。 系統硬件設計 系統硬件結構 蓄電池在線監測系統是以STC89系列的STC89C58RD+微控制器、XILINX的XC9572-84為核心,外圍電路主要由電壓采集電路、 A/D轉換電路、顯示驅動電路及鍵盤電路等幾部分組成的,如圖1所示。A/D轉換芯片采用10位ADC TLC1549。顯示驅動芯片采用MC14489B,它可以驅動5位共陰極數碼管,微控制器的P1口的低5位作為鍵盤輸入口,擴展的RS485接口用于多 機通信 。下面詳細介紹系統中STC89C58RD+、XC9572-84器件和電壓采集電路、A/D轉換電路的設計與實現。 圖1 系統硬件結構框圖 微控制器STC89C58RD+簡介 STC89C58RD+是STC89系列的微控制器,它不但與80C51完全兼容,而且還有新的特點:片內含有Flash程序存儲器32Kb, DataFlash數據存儲器32Kb,RAM數據存儲器1208B,同時內部還有看門狗(WDT);由于ALE信號開關狀態可設置,從而降低了EMI; 具有可編程的8級中斷源4種優先級,具有系統可編程(ISP)和應用可編程(IAP)等特點,片內資源豐富、集成度高、使用方便。STC89C58RD+ 對系統的工作進行實施調度,實現外部輸入參數的設置、電池電壓的測試和顯示、電池工作狀態的指示。 邏輯編程器件XC9572-84(CPLD) 由于監測的電池節數較多,所需要I/O口較多,用傳統的設計方法,需要74HC273、74HC00、74HC138、CD4514等多種芯片來實 現,器件種類和數量多,使PCB的尺寸加大,也增加了系統的不穩定因素。本系統選用XILINX系列的CPLD器件XC9572-84,其共有72個宏單 元,69個I/O口,1600個門,72個寄存器,可以對上述多種芯片進行集成。該器件具有在系統可編程能力,含有先進的數據保密特性,它可以完全保護編 程數據不被非法讀取和擦除,每個I/O口都有一個可編程輸出擺率控制位從而可減小系統噪聲,采用具有較低功耗的快速閃存技術,每個I/O口的驅動能力強, 負載電流可達24mA。XC9572-84接收單片機傳來的數據和地址,控制各個固態繼電器(G3VM-402C)的選通以及A/D轉換的進行,達到采集 電壓的功能。采用了CPLD器件后,減少了系統所需器件的數量和種類,簡化了PCB的排版和布線,減小了系統體積和節約成本,方便了系統調試,有利于批量化生產。 圖2 電壓采集電路 電壓采集電路 電壓采集電路直接影響到電壓測試的精確程度,因而采集電路設計得是否適當對整個系統至關重要。對每節電池電壓進行測量,有兩種方法:①對每節電池電 壓直接采集。②采集(n+1)節電池的總電壓,減去n節電池的總電壓得第n+1節電池電壓。第一種電壓采集精確而且安全。第二種雖然電路比較簡單但是當電 池節數多時采集的電壓太高,不安全而且會出現較大的誤差。因此選用第一種方法。電壓采集電路要求要安全,采集的電壓要足夠的穩定。本系統的蓄電池組采用串 接方式,BAT1+接第一節電池的正極,BAT2+接第二節的正極(第一節的負極),如此依次連接,最多可達41節。經過XC9572-84模擬開關選通 G3VM-402C后,將1~n節電池電壓依次釋放到電壓總線BUS1+、BUS1-上,電路選用運算放大器LM358作為信號放大器件,它的前級為差分 式放大器,后級為電壓跟隨器,使TLC1549得到一個穩定的采樣電壓,如圖2所示。1VD0和1VD1采用FR104高速開關管來保護運算放大器的內部 電路。差分式放大倍數為A=0.2,具體推導如下: (Ua-Up)/1R12=Up/1R14; ① (Ub-Un)/1R11=(Un-Vo)/1R13;② 注意運放的“虛短”特點,有Up=Un;結合①、②兩式得到Vo=((1R11+1R13)/1R11)·(1R14/(1R12+1R14))·Ua-1R13/1R11·Ub;選取電阻滿足:1R13/1R11=1R14/1R12的關系,輸出電壓可簡化為:Vo=1R13/1R11·(Ua-Ub),故電壓放大倍數A=Vo/(Ua-Ub)=1R13/1R11=0.2。 A/D轉換電路 本系統A/D轉換采用片外串行總線10位高速高精度專用集成電路TLC1549,其功耗低、體積小、占用單片機的資源少,具有連接方便、編程簡單的 特點。電壓采集電路的輸出電壓與TLC1549的A/D轉換通道相連接,在時鐘脈沖信號作用下,TLC1549將電壓轉換成10位二進制數字信號,并把上 次A/D轉換的結果以10位二進制數的形式依次輸出,再通過光電隔離傳送到單片機進行處理,如圖3所示。 圖3 A/D轉換電路 硬件設計過程中的注意點 1 系統用多路電源,要考慮系統的功耗選擇適當的電源,電源電壓應比較穩定。 2 電壓采集部分使用固態繼電器(G3VM-402C),由于電池節數較多,電壓比較高,故應注意對內部電路的保護,可以采用適當功率的電阻。對放大電路的電 阻精度要求較高,可選用精度為1%的金屬膜電阻;電路設計應避免出現因多個固態繼電器同時開通的直通現象,這樣會使多節蓄電池短路,造成電壓采集電路的損 壞。 3 A/D轉換芯片的基準電源要十分穩定,基準電源與芯片工作電源應采用不同的共地電源,以保證A/D轉換芯片基準電源的穩定性。為了減少干擾,時鐘和片選信號與單片機、CPLD之間進行光電隔離。 4 器件的布局和PCB圖的布線采用模塊化,交流與直流分離,強電與弱電分離,數字地和模擬地分開,注意電源線和地線的布局。 系統軟件設計 在單片機的軟件編程上,以Keil C編譯器的Windows集成開發環境 μvision2作為軟件開發平臺,采用C51高級語言編寫。該語言是80C51系列單片機的專門的高性能的程序設計語言。它采用符合ANSI標準的C語 言編程,便于改進、擴充和移植,可以對硬件進行操作,能夠產生極高速和極其簡潔形式的目標代碼,在代碼的效率和執行速度上完全可以和匯編語言相媲美,并且 有十分豐富的庫函數可以供用戶直接調用,從而極大地提高了程序的編寫效率,能提供給用戶高質量的程序代碼。采用硬件描述語言Verilog HDL對CPLD進行編程。 單片機軟件編程注意點 1 鍵盤在定時中斷服務程序中讀取,用中斷間隔時間實現鍵盤的去抖,不必編寫另外的延時程序,提高了CPU的利用效率。鍵盤值存入數據緩沖區,在主程序中讀數據緩沖區的內容,執行鍵盤功能散轉子程序。 2 電池電壓的采集在中斷程序中執行,因固態繼電器的開通與關斷時間均需1ms,故通道選通時要有一定的延時,使電池采集電壓建立并穩定后再啟動A/D轉換。 3 根據A/D轉換芯片TLC1549的工作原理,當前輸出的數據是上一次A/D轉換的結果, 故對一節電池電壓采樣的首次A/D轉換結果應丟棄,其余幾次轉換結果保留并加以處理。 圖4 單片機軟件編程流程圖 4 根據STC89C58RD+的DataFlash 的特點,數據寫入時必須啟動ISP/IAP命令,CPU等待IAP動作定時后,才繼續執行程序,要先關斷中斷(EA)。要使數據寫入DataFlash存 儲器,不能跨越扇區,如果要對某個扇區進行擦除,而其中有些字節的內容需要保護,則需將其先讀到單片機內部的RAM中保存,再將該扇區擦除,然后再將保存 的數據寫回該扇區。 CPLD的Verilog HDL編程 用硬件描述語言Verilog HDL的程序設計硬件的好處在于易于理解、易于維護、調試電路速度快、有許多易于掌握的仿真、綜合和布局布線的工具,還可以用C語言配合Verilog HDL來做邏輯設計的布線前和布線后仿真,驗證功能是否正確。限于篇幅,下面給出部分模塊的Verilog HDL程序 module REG8 ( CLRB, D, CLK, Q ); //8位數據鎖存 input CLRB, CLK; input [7:0] D; output [7:0] Q; reg [7:0] Q; always @( posedge CLK or negedge CLRB ) Q <= ( !CLRB )? 0: D; endmodule module DECODE4_16( E1,A,Y ); //4-16譯碼 input E1; input [3:0] A; output [15:0] Y; reg [15:0] Y; always @( E1 or A ) if(E1==0 ) begin case(A) 0:Y=16'b1111111111111110; 1:Y=16'b1111111111111101; 2:Y=16'b1111111111111011; 3:Y=16'b1111111111110111; 4:Y=16'b1111111111101111; 5:Y=16'b1111111111011111; 6:Y=16'b1111111110111111; 7:Y=16'b1111111101111111; 8:Y=16'b1111111011111111; 9:Y=16'b1111110111111111; 10:Y=16'b1111101111111111; 11:Y=16'b1111011111111111; 12:Y=16'b1110111111111111; 13:Y=16'b1101111111111111; 14:Y=16'b1011111111111111; 15:Y=16'b0111111111111111; endcase end else Y=16'b1111111111111111; endmodule |