新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > PIC16F877A單片機(jī)在智能雙電源裝置中的應(yīng)用

PIC16F877A單片機(jī)在智能雙電源裝置中的應(yīng)用

作者: 時間:2011-12-29 來源:網(wǎng)絡(luò) 收藏

1.裝置的簡介

隨著對供電可靠性的要求也越來越高,很多場合用兩路電源來保證供電的可靠性。當(dāng)常用電源異常,裝置能自動切換到備用電源,裝置就是這種在兩路電源之間進(jìn)行可靠切換、以保證供電的裝置。在醫(yī)院、賓館和礦山等有廣泛的應(yīng)用。

智能雙電源裝置由開關(guān)本體和控制器兩部分組成。開關(guān)本體由電機(jī)通過機(jī)械聯(lián)鎖機(jī)構(gòu)控制常用電源的斷路器和備用電源的斷路器的分合,進(jìn)而控制電源的切換??刂破魍ㄟ^對電壓的采樣來判斷電源是否異常,如果出現(xiàn)異常應(yīng)產(chǎn)生相應(yīng)的切換。

2.PIC16F877A的簡介

美國Microchip公司的PIC8位單片機(jī)其生產(chǎn)史11年,但現(xiàn)在其產(chǎn)量已躍居世界第二位(僅次于Motorola公司)?,F(xiàn)在的品種已超過120種。是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級深度的硬件堆棧,51系列單片機(jī)的堆棧結(jié)構(gòu)是在RAM區(qū),由程序指定SP的開始位置。

PIC的RAM區(qū)每個Byte的位都可以尋址,有4條專用的位操作指令和2條移位指令。51系列單片機(jī)的只有0x20到0x2F的Bytes的位是可以尋址,有17條專用的位操作指令和4條移位指令。

PIC的ROM和RAM是采用“頁”結(jié)構(gòu)的,每頁為512個Bytes,通過STATUS的位來選擇不同的頁,在程序調(diào)用和變量尋址的時候,要先確定目標(biāo)的頁,使有起來不是很方便。51系列單片機(jī)的ROM是可以在64K范圍內(nèi)尋址的,可程序直接尋址調(diào)用;RAM在0到0x7F可以直接尋址或間接尋址,0x80以上地址的RAM(包括擴(kuò)展的RAM)只有間接尋址。

4.智能雙電源裝置的動作處理

雙電源控制器的有三種控制方式,自投自復(fù)方式、自投不自復(fù)方式和發(fā)電機(jī)方式。
自投自復(fù)式方式:如果常用電源被檢測到出現(xiàn)偏差時,則自動將負(fù)載從常用電源轉(zhuǎn)換至備用電源;如果常用電源恢復(fù)正常時,則自動將負(fù)載返回?fù)Q接到常用電源。
自投不自復(fù)式方式:如果常用電源被檢測到出現(xiàn)偏差時,則自動將負(fù)載從常用電源轉(zhuǎn)換至備用電源;如果常用電源恢復(fù)正常時,不能自動將負(fù)載返回?fù)Q接到正常電源供電。除非備用電源出現(xiàn)異常才進(jìn)行轉(zhuǎn)換。

發(fā)電機(jī)方式:如果常用電源被檢測到出現(xiàn)偏差時,發(fā)出發(fā)電指令請求發(fā)電。當(dāng)發(fā)電電壓達(dá)到額定電壓時,先從電網(wǎng)斷開負(fù)載電路,自動轉(zhuǎn)換到發(fā)電電源供電;當(dāng)常用電源恢復(fù)正常后,則又自動返回?fù)Q接到正常電源供電,并發(fā)出停電指令,請求停止發(fā)電。

以下是三種方式在不同合閘狀態(tài)下的程序任務(wù)處理簡述:

自投自復(fù)方式在常用電源合閘狀態(tài),
常用電源出現(xiàn)異常,進(jìn)行計時
異常計時中
異常計時完成,啟動電機(jī)
常用電源正常,停止并恢復(fù)計時器
備用電源異常,停止并恢復(fù)計時器
自投自復(fù)方式在備用電源合閘狀態(tài),
常用電源出現(xiàn)正常
正常計時
正常計時完成,啟動電機(jī)
常用電源異常,停止計時
自投不自復(fù)方式在常用電源合閘狀態(tài),
常用電源出現(xiàn)異常,進(jìn)行計時
異常計時中
異常計時完成,啟動電機(jī)
常用電源正常,停止并恢復(fù)計時器
備用電源異常,停止并恢復(fù)計時器
自投不自復(fù)方式在備用電源合閘狀態(tài),
常用電源正常,備用電源異常,進(jìn)行計時
計時中
計時完成,啟動電機(jī)
備用電源正常,停止并恢復(fù)計時器
發(fā)電機(jī)方式在常用電源合閘狀態(tài),
常用電源出現(xiàn)異常,進(jìn)行計時
異常計時中
異常計時完成,啟動發(fā)電機(jī)
發(fā)電機(jī)啟動等待時間,計時中
發(fā)電機(jī)等待時間完成,啟動電機(jī),進(jìn)行切換動作
常用電源正常,停止任何計時,并恢復(fù)計時器
發(fā)電機(jī)方式在備用電源合閘狀態(tài),
常用電源正常,計時開始
計時中,
正常計時完成,啟動電機(jī),進(jìn)行切換動作
常用電源異常,停止計時,并恢復(fù)計時器
如何把這些相近的操作歸納成相同的函數(shù)進(jìn)行處理,才可以節(jié)約程序代碼。我把這些操作歸納成如下程序:
……
typedefunion
{
unsignedcharcc;
struct
{
unsignedcharbit0:1;
unsignedcharbit1:1;
unsignedcharbit2:1;
unsignedcharbit3:1;
unsignedcharbit4:1;
unsignedcharbit5:1;
unsignedcharbit6:1;
unsignedcharbit7:1;
}Bits;
}Char_Bit;
Char_BitVolErrFlag[2];//可以用位或字節(jié)操作
staticvoidCheckVolErr(unsignedchari)
//I=0,檢查常用電源的電壓,更新缺相,欠壓和過壓標(biāo)志位
//I=1,檢查備用電源的電壓,更新缺相,欠壓和過壓標(biāo)志位
{
……
}
staticvoidStartTurn(unsignedcharbi)
//bi=0,轉(zhuǎn)到常用電源
//bi=1,轉(zhuǎn)到備用電源
{
……
}
staticvoidCheckVol1(unsignedchari)
//I=0,判斷常用電源的合閘狀態(tài)
//I=1,判斷備用電源的合閘狀態(tài)
{//電壓判斷,處理函數(shù)1
unsignedcharj,k;
if(i==0)
{
j=0;
k=1;
}
else
{
j=1;
k=0;
}
if(VolErrFlag[j].cc==0)
{
bVolErrCnting=0;//恢復(fù)異常計時器標(biāo)記
}
else
{
if(bVolErrCnting==0)
{
di();
CLRWDT();
VolErrCnt=(unsignedint)LimParams.cc[j]*TiScale;
//預(yù)設(shè)異常計時器的初值
ei();
bVolErrCnting=1;
return;
}
}
if(VolErrFlag[k].cc!=0)
bVolErrCnting=0;
if(bVolErrCntingVolErrCnt==0)
{//啟動轉(zhuǎn)換動作
bVolErrCnting=0;
bBkOpen1=k;
CLRWDT();
StartTurn(k);
}
}
staticvoidCheckVol2()
{//電壓判斷,處理函數(shù)2
if(VolErrFlag[0].cc!=0)
{
bVolErrCnting=0;//恢復(fù)異常計時器標(biāo)記
}
else
{
if(bVolErrCnting==0)
{
di();
CLRWDT();
VolErrCnt=(unsignedint)LimParams.Para.Trn*TiScale;
//預(yù)設(shè)異常計時器的初值
ei();
bVolErrCnting=1;
return;
}
}
if(bVolErrCntingVolErrCnt==0)
{//啟動轉(zhuǎn)換動作
bVolErrCnting=0;
CLRWDT();
bBkOpen1=0;
StartTurn(0);
}
}
staticvoidCheckVol3()
{//電壓判斷,處理函數(shù)3
if(VolErrFlag[0].cc==0)
{
bVolErrCnting=0;//恢復(fù)異常計時器標(biāo)記
bDJstarting=0;
}
else
{
if(bVolErrCnting==0)
{
di();
CLRWDT();
VolErrCnt=(unsignedint)LimParams.Para.Tnr*TiScale;
//預(yù)設(shè)異常計時器的初值
ei();
bVolErrCnting=1;
return;
}
}
if(bVolErrCntingbDJstarting==0VolErrCnt==0)
{
di();
CLRWDT();
DJstartCnt=(unsignedint)LimParams.Para.T1*TiScale;
//預(yù)設(shè)發(fā)電機(jī)啟動的等待計時器的初值
ei();
CLRWDT();
bDJstarting=1;
return;
}
if(bDJstartingDJstartCnt==0)
{//啟動轉(zhuǎn)換動作
CLRWDT();
bVolErrCnting=0;
bBkOpen1=1;
StartTurn(1);
}
}
……
voidmain()
{
……
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)
在實際生產(chǎn)中,由于采樣電阻的誤差,所以在相同的校準(zhǔn)電壓輸入,單片機(jī)采樣到的AD值是不一樣的。如何設(shè)定AD值和校準(zhǔn)電壓的校準(zhǔn)比例,是一個關(guān)鍵的問題,校準(zhǔn)比例不能在程序編譯中固定下來,因為這樣會有較大的誤差,即使改用精密電阻來采樣,誤差也不能減低很多。我在應(yīng)用中采用的方法是:提高采樣電路的線性度,使其在不同電壓下的校準(zhǔn)比例有很好的一致性(在解決了溫升的問題后,這點是可以做到的);在采樣電路輸入校準(zhǔn)電壓,輸入設(shè)置密碼后,單片機(jī)自動計算校準(zhǔn)比例,并把校準(zhǔn)比例進(jìn)行保存。
……
voidmain()
{
……
ReadScal();
……
while(1)
{
……

……
}
}
……
staticvoidKeyProc()
{……
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;
}
……
}
}



關(guān)鍵詞: PIC單片機(jī) 智能雙電源

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉