|
1. 智能雙電源裝置的簡(jiǎn)介
隨著對(duì)供電可靠性的要求也越來越高,很多場(chǎng)合用兩路電源來保證供電的可靠性。當(dāng)常用電源異常,智能雙電源裝置能自動(dòng)切換到備用電源,智能雙電源裝置就是這種在兩路電源之間進(jìn)行可靠切換、以保證供電的裝置。在醫(yī)院、賓館和礦山等有廣泛的應(yīng)用。
智能雙電源裝置由開關(guān)本體和控制器兩部分組成。開關(guān)本體由電機(jī)通過機(jī)械聯(lián)鎖機(jī)構(gòu)控制常用電源的斷路器和備用電源的斷路器的分合,進(jìn)而控制電源的切換?刂破魍ㄟ^對(duì)電壓的采樣來判斷電源是否異常,如果出現(xiàn)異常應(yīng)產(chǎn)生相應(yīng)的切換。
2. PIC16F877A的簡(jiǎn)介
美國Microchip公司的PIC 8位單片機(jī)其生產(chǎn)史11年,但現(xiàn)在其產(chǎn)量已躍居世界第二位(僅次于Motorola公司)。現(xiàn)在PIC單片機(jī)的品種已超過120種。PIC單片機(jī)是RISC結(jié)構(gòu)的單片機(jī),具有高速處理數(shù)據(jù)的特性(執(zhí)行速度可達(dá)120ns)。PIC16F877A內(nèi)部自帶看門狗、256Bytes的EEPROM、8路AD功能、ISP功能和寬電壓工作,工作可靠,能很好的適應(yīng)智能雙電源裝置應(yīng)用開發(fā)。
3. 在8位單片機(jī)中 在PIC與51系列單片機(jī)的比較
PIC的堆棧結(jié)構(gòu)是硬件固定的,PIC16F877A有8級(jí)深度的硬件堆棧,51系列單片機(jī)的堆棧結(jié)構(gòu)是在RAM區(qū),由程序指定SP的開始位置。
PIC的RAM區(qū)每個(gè)Byte的位都可以尋址,有4條專用的位操作指令和2條移位指令。51系列單片機(jī)的只有0x20到0x2F的Bytes的位是可以尋址,有17條專用的位操作指令和4條移位指令。
PIC的ROM和RAM是采用“頁”結(jié)構(gòu)的,每頁為512個(gè)Bytes,通過STATUS的位來選擇不同的頁,在程序調(diào)用和變量尋址的時(shí)候,要先確定目標(biāo)的頁,使有起來不是很方便。51系列單片機(jī)的ROM是可以在64K范圍內(nèi)尋址的,可程序直接尋址調(diào)用;RAM在0到0x7F可以直接尋址或間接尋址,0x80以上地址的RAM(包括擴(kuò)展的RAM)只有間接尋址。
4. 智能雙電源裝置的動(dòng)作處理
雙電源控制器的有三種控制方式,自投自復(fù)方式、自投不自復(fù)方式和發(fā)電機(jī)方式。 自投自復(fù)式方式:如果常用電源被檢測(cè)到出現(xiàn)偏差時(shí),則自動(dòng)將負(fù)載從常用電源轉(zhuǎn)換至備用電源;如果常用電源恢復(fù)正常時(shí),則自動(dòng)將負(fù)載返回?fù)Q接到常用電源。 自投不自復(fù)式方式:如果常用電源被檢測(cè)到出現(xiàn)偏差時(shí),則自動(dòng)將負(fù)載從常用電源轉(zhuǎn)換至備用電源;如果常用電源恢復(fù)正常時(shí),不能自動(dòng)將負(fù)載返回?fù)Q接到正常電源供電。除非備用電源出現(xiàn)異常才進(jìn)行轉(zhuǎn)換。
發(fā)電機(jī)方式:如果常用電源被檢測(cè)到出現(xiàn)偏差時(shí),發(fā)出發(fā)電指令請(qǐng)求發(fā)電。當(dāng)發(fā)電電壓達(dá)到額定電壓時(shí),先從電網(wǎng)斷開負(fù)載電路,自動(dòng)轉(zhuǎn)換到發(fā)電電源供電;當(dāng)常用電源恢復(fù)正常后,則又自動(dòng)返回?fù)Q接到正常電源供電,并發(fā)出停電指令,請(qǐng)求停止發(fā)電。
以下是三種方式在不同合閘狀態(tài)下的程序任務(wù)處理簡(jiǎn)述:
自投自復(fù)方式在常用電源合閘狀態(tài), 常用電源出現(xiàn)異常,進(jìn)行計(jì)時(shí) 異常計(jì)時(shí)中 異常計(jì)時(shí)完成,啟動(dòng)電機(jī) 常用電源正常,停止并恢復(fù)計(jì)時(shí)器 備用電源異常,停止并恢復(fù)計(jì)時(shí)器 自投自復(fù)方式在備用電源合閘狀態(tài), 常用電源出現(xiàn)正常 正常計(jì)時(shí) 正常計(jì)時(shí)完成,啟動(dòng)電機(jī) 常用電源異常,停止計(jì)時(shí) 自投不自復(fù)方式在常用電源合閘狀態(tài), 常用電源出現(xiàn)異常,進(jìn)行計(jì)時(shí) 異常計(jì)時(shí)中 異常計(jì)時(shí)完成,啟動(dòng)電機(jī) 常用電源正常,停止并恢復(fù)計(jì)時(shí)器 備用電源異常,停止并恢復(fù)計(jì)時(shí)器 自投不自復(fù)方式在備用電源合閘狀態(tài), 常用電源正常,備用電源異常,進(jìn)行計(jì)時(shí) 計(jì)時(shí)中 計(jì)時(shí)完成,啟動(dòng)電機(jī) 備用電源正常,停止并恢復(fù)計(jì)時(shí)器 發(fā)電機(jī)方式在常用電源合閘狀態(tài), 常用電源出現(xiàn)異常,進(jìn)行計(jì)時(shí) 異常計(jì)時(shí)中 異常計(jì)時(shí)完成,啟動(dòng)發(fā)電機(jī) 發(fā)電機(jī)啟動(dòng)等待時(shí)間,計(jì)時(shí)中 發(fā)電機(jī)等待時(shí)間完成,啟動(dòng)電機(jī),進(jìn)行切換動(dòng)作 常用電源正常,停止任何計(jì)時(shí),并恢復(fù)計(jì)時(shí)器 發(fā)電機(jī)方式在備用電源合閘狀態(tài), 常用電源正常,計(jì)時(shí)開始 計(jì)時(shí)中, 正常計(jì)時(shí)完成,啟動(dòng)電機(jī),進(jìn)行切換動(dòng)作 常用電源異常,停止計(jì)時(shí),并恢復(fù)計(jì)時(shí)器 如何把這些相近的操作歸納成相同的函數(shù)進(jìn)行處理,才可以節(jié)約程序代碼。我把這些操作歸納成如下程序: …… typedef union { unsigned char cc; struct { unsigned char bit0:1; unsigned char bit1:1; unsigned char bit2:1; unsigned char bit3:1; unsigned char bit4:1; unsigned char bit5:1; unsigned char bit6:1; unsigned char bit7:1; }Bits; } Char_Bit; Char_Bit VolErrFlag[2]; // 可以用位或字節(jié)操作 static void CheckVolErr(unsigned char i) // I=0, 檢查常用電源的電壓,更新缺相,欠壓和過壓標(biāo)志位 // I=1, 檢查備用電源的電壓,更新缺相,欠壓和過壓標(biāo)志位 { …… } static void StartTurn(unsigned char bi) // bi=0,轉(zhuǎn)到常用電源 // bi=1,轉(zhuǎn)到備用電源 { …… } static void CheckVol1(unsigned char i) // I=0,判斷常用電源的合閘狀態(tài) // I=1,判斷備用電源的合閘狀態(tài) { // 電壓判斷,處理函數(shù)1 unsigned char j,k; if (i==0) { j=0; k=1; } else { j=1; k=0; } if (VolErrFlag[j].cc==0) { bVolErrCnting=0; // 恢復(fù)異常計(jì)時(shí)器標(biāo)記 } else { if (bVolErrCnting==0) { di(); CLRWDT(); VolErrCnt=(unsigned int) LimParams.cc[j]*TiScale; // 預(yù)設(shè)異常計(jì)時(shí)器的初值 ei(); bVolErrCnting=1; return; } } if (VolErrFlag[k].cc !=0) bVolErrCnting=0; if (bVolErrCnting && VolErrCnt==0) { // 啟動(dòng)轉(zhuǎn)換動(dòng)作 bVolErrCnting=0; bBkOpen1=k; CLRWDT(); StartTurn(k); } } static void CheckVol2() { // 電壓判斷,處理函數(shù)2 if (VolErrFlag[0].cc !=0) { bVolErrCnting=0; // 恢復(fù)異常計(jì)時(shí)器標(biāo)記 } else { if (bVolErrCnting==0) { di(); CLRWDT(); VolErrCnt=(unsigned int) LimParams.Para.Trn*TiScale; // 預(yù)設(shè)異常計(jì)時(shí)器的初值 ei(); bVolErrCnting=1; return; } } if (bVolErrCnting && VolErrCnt==0) { // 啟動(dòng)轉(zhuǎn)換動(dòng)作 bVolErrCnting=0; CLRWDT(); bBkOpen1=0; StartTurn(0); } } static void CheckVol3() { // 電壓判斷,處理函數(shù)3 if (VolErrFlag[0].cc==0) { bVolErrCnting=0; // 恢復(fù)異常計(jì)時(shí)器標(biāo)記 bDJstarting=0; } else { if (bVolErrCnting==0) { di(); CLRWDT(); VolErrCnt=(unsigned int) LimParams.Para.Tnr*TiScale; // 預(yù)設(shè)異常計(jì)時(shí)器的初值 ei(); bVolErrCnting=1; return; } } if (bVolErrCnting && bDJstarting==0 && VolErrCnt==0) { di(); CLRWDT(); DJstartCnt=(unsigned int)LimParams.Para.T1*TiScale; // 預(yù)設(shè)發(fā)電機(jī)啟動(dòng)的等待計(jì)時(shí)器的初值 ei(); CLRWDT(); bDJstarting=1; return; } if (bDJstarting && DJstartCnt==0) { // 啟動(dòng)轉(zhuǎn)換動(dòng)作 CLRWDT(); bVolErrCnting=0; bBkOpen1=1; StartTurn(1); } } …… void main() { …… if (bBkOpen1) { // 在備用電源合閘狀態(tài) if (LimParams.Para.JobType==1) { // 自投不自復(fù)方式 CheckVol1(1); } else { //自投不自復(fù)或發(fā)電機(jī)方式 CheckVol2(); } } else { // 在常用電源合閘狀態(tài) if (LimParams.Para.JobType==2) { // 發(fā)電機(jī)工作方式 CheckVol3(); } else { // 自投自復(fù)或自投不自復(fù)方式 CheckVol1(0); } } …… } 5. 智能雙電源裝置的電壓采樣的校準(zhǔn) 在實(shí)際生產(chǎn)中,由于采樣電阻的誤差,所以在相同的校準(zhǔn)電壓輸入,單片機(jī)采樣到的AD值是不一樣的。如何設(shè)定AD值和校準(zhǔn)電壓的校準(zhǔn)比例,是一個(gè)關(guān)鍵的問題,校準(zhǔn)比例不能在程序編譯中固定下來,因?yàn)檫@樣會(huì)有較大的誤差,即使改用精密電阻來采樣,誤差也不能減低很多。我在應(yīng)用中采用的方法是:提高采樣電路的線性度,使其在不同電壓下的校準(zhǔn)比例有很好的一致性(在解決了溫升的問題后,這點(diǎn)是可以做到的);在采樣電路輸入校準(zhǔn)電壓,輸入設(shè)置密碼后,單片機(jī)自動(dòng)計(jì)算校準(zhǔn)比例,并把校準(zhǔn)比例進(jìn)行保存。 …… void main() { …… ReadScal(); …… while(1) { ……
…… } } …… static void KeyProc() {…… if ( SetKey==0) { …… if ( bSecPass==1) { // 設(shè)電壓 if (ReadScalFlag() !=0) return; // 如果已設(shè)定了比例,就不能再更改 CLRWDT(); ShowString(0, 0); ShowString(1, 1); // "pass" ShowString(0, 2); // 在LCD屏上顯示PASS CLRWDT(); for (i=0; i!=6; i++) ScalUarray[i]=IntUarray[i]; // 讀入比例參數(shù), CLRWDT(); SaveScal(); // 保存比例參數(shù) SaveScalFlag(); // 并改寫標(biāo)志 Delay5s(); return; } …… } }
|