#include "STC8.H" // 用于普通方波 逆變器的改造, 就只要把 原來輸出的TL494的,8,11的腳調起來,分別接入 P33 P55
typedef unsigned int u16; //45HZ @30.000MHz
u16 tt; //1111點計算,為1個周期 22.22ms, ;即是每點20us
typedef unsigned char u8;
u16 dg,df;
u16 a;b;c;d;e;f;g;h;
u8 overA;
void Timer0_Isr(void) interrupt 1
{
if(df<=19) //軟啟信號對,df==19退出軟啟動。
{
dg=190-df*10;
if(tt==1111)
df++;
if(dg<=10)
dg=0;
e=45+dg ;
f=510-dg;
g=600+dg ;
h=1067-dg ;
a=e;
b=f;
c=g;
d=h;
}
/////////////////////////////
if(P30==1&&df>18) //電壓過高,比如。>245v
{ if(tt==1111)
df--; //電壓下降3---6V
}
/////////////////////
if(tt==0||(tt>=(a-41)&&tt<=(a-38))||(tt>=(a-33)&&tt<=(a-31))||(tt>=(a-25)&&tt<=(a-24))||(tt>=(a-18)&&tt<=(a-17))||tt==a-10||tt==a-3 )
{ P33=0;
// // |0,4-7,12-14,20-21,27-28,35,42
P55=0;
}
if(tt==b+4||tt==b+11||(tt>=(b+18)&&tt<=(b+19))||(tt>=(b+2)&&tt<=(b+26))||(tt>=(b+32)&&tt<=(b+34))||(tt>=(b+39)&&tt<=(b+42))) //
{ P33=0;
//514,521,528-529,535-536,542-544,549-552
P55=0;
}
if( tt==556||(tt>=(c-40)&&tt<=(c-37))||(tt>=(c-32)&&tt<=(c-30)) ||(tt>=(c-24)&&tt<=(c-23))||(tt>=(c-17)&&tt<=(c-16))||tt==c-9||tt==c-2 )
{ P33=0;
//
P55=0; //556 ,560-563,568-570,576-577,583-584,591,598
}
if(tt==d+3||tt==d+10||(tt>=(d+17)&&tt<=(d+18))||(tt>=(d+24)&&tt<=(d+25))||(tt>=(d+31)&&tt<=(d+33))||(tt>=(d+38)&&tt<=(d+41)) ) //
{ P33=0;
//1070,1077,1084-1085,1091-1092,1098-1100,1105-1108
P55=0;
}
////////////////////////////////////////////////////
if( (tt>=(a-44)&&tt<=(a-42))||(tt>=(a-37)&&tt<=(a-34))||(tt>=(a-30)&&tt<=(a-26))||(tt>=(a-23)&&tt<=(a-19))||(tt>=(a-16)&&tt<=(a-11))||(tt>=(a-9)&&tt<=(a-4)||(tt>=(a-2)&&tt<=(a-1))) ////////////////////////////////////////////////////
) //正半波前斜坡幾個脈沖(1-3,8-11,15-19,22-26,29-34,36-41,43-44)
{
P33=0;
//
P55=1;
}
if(tt>=a&&tt<=b) //中間為220V 45--600
{ P33=0;
//
P55=1;
}
if((tt>=(b+1)&&tt<=(b+3))||(tt>=(b+5)&&tt<=(b+10))||(tt>=(b+12)&&tt<=(b+17))||(tt>=(b+20)&&tt<=(b+24))||(tt>=(b+27)&&tt<=(b+31))||(tt>=(b+35)&&tt<=(b+38))||(tt>=(b+43)&&tt<=(b+45))) //正半后斜坡
{ P33=0;
//511-513,515-520,522-527,530-534,537-541,545-548,553-555
P55=1;
}
//////////////////////////////////////////
if( (tt>=(c-43)&&tt<=(c-41)) ||(tt>=(c-36)&&tt<=(c-33))||(tt>=(c-29)&&tt<=(c-25))||(tt>=(c-22)&&tt<=(c-18))||(tt>=(c-15)&&tt<=(c-10))||(tt>=(c-8)&&tt<=(c-3))||(tt>=(c-1)&&tt<=(c-0)) ) //負半波前斜坡
{ P33=1;
//557-559,564-567,571-575,578-582,,585-590,592-597,599-600
P55= 0;
}
if(tt>=c&&tt<=d) //中間為220V 600-1067
{ P33=1;
//
P55=0;
}
if( (tt>=(d+1)&&tt<=(d+2))||(tt>=(d+4)&&tt<=(d+9))||(tt>=(d+11)&&tt<=(d+16))||(tt>=(d+19)&&tt<=(d+23))||(tt>=(d+26)&&tt<=(d+30))||(tt>=(d+34)&&tt<=(d+37))||(tt>=(d+42)&&tt<=(d+44)) )//負半后斜坡
{ P33=1;
//1068-1069,1071-1076,1078-1083,1086-1090,1093-1097,1101-1104,1109-1111
P55= 0;
}
/////////////////////////////////
tt++;
if(tt==1111) //一個周期完成
tt=0;
/////////////////////////////
}
void Timer0_Init(void) //20微秒@30.000MHz
{
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x02; //設置定時器模式
TL0 = 0xCE; //設置定時初始值
TH0 = 0xCE; //設置定時重載值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0 = 1; //使能定時器0中斷
}
void Delay200ms() //@30.000MHz
{
unsigned char data i, j, k;
i = 23;
j = 205;
k = 120;
i = 23;
j = 205;
k = 120;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main(void)
{ overA=0;
P3M0 = (P3M0 & ~0x01) | 0x08; P3M1 = (P3M1 & ~0x08) | 0x01; //p3.3 推挽輸出
// p3.0 高阻輸入 如果,電壓過高240 則,P30=1;
// P3M0 = 0x00; P3M1 = 0x00; // 準雙向口
// P5M0 &= ~0x30; P5M1 &= ~0x30; //P54, P55, 準雙向口
// p3.1 準雙向口, p3.3 p3.0
// P5M0 |= 0x30; P5M1 &= ~0x30; //P54, P55, 推挽輸出
// P5M0 = (P5M0 & ~0x10) | 0x20; P5M1 &= ~0x30; // P55推挽輸出,P54準雙向口 用于過流
P5M0 = (P5M0 & ~0x10) | 0x20; P5M1 = (P5M1 & ~0x20) | 0x10; // P55推挽輸出,P54高阻輸入
for(a=0;a<10;a++)
{ Delay200ms() ; } //2秒后開始逆變輸出
dg=0;
df=0;
P31=0;
P30=0;
P33=0;
P55=0;
tt=0;
Timer0_Init();
EA = 1; //允許全局中斷
while (1)
{
////////////////////////////////////////////////////////////////
if( P54==1) //過流關閉中斷。
{ EA = 0; // 關定時。
ET0 = 0;
P33=0;
P55=0;
tt=0;
dg=0;
df=0;
Delay200ms() ;
Delay200ms() ;
P54=0;
if( ( overA+1)%2==0) //第二次過流 ,或者 奇數次 過流,為負半波的 tt計數。
tt=555 ; //tt 負半波開始
Timer0_Init(); //
EA = 1;
if( overA>= 254) //過流超過254次 ,22ms*250=5.5秒,就不再重新啟動,人工重啟
{ // 關定時。
// 關定時。 ET0 = 0;
// 關定時。 EA = 0;
PCON |=0x02 ;//停機模式
}
overA++;
}
///////////////////////////////////////
// //軟啟動后, 判斷是否電池電壓小于設定值,比如9.5v
/* if(P30==1) //P30 兩個用途,235v 過壓, 和12V電池電壓過低。
{ /////////////// //
if(tt==1100)
{ if(df>=19)
df++; } //22ms計數增加
//////////////////////////
if(df==700) //22ms*700=15.4s,連續15.4秒是低電壓,就關閉逆變輸出
{
EA = 0; // 關定時。
ET0 = 0;
P33=0;
P55=0;
tt=0;
dg=0;
df=0;
PCON |=0x02 ;//停機模式
}
}// .0
else
df=20; //如果是瞬間 電壓下降,就重新從20計數
//df=20是之前,軟啟動結束值
*/
/////////////////////////////////////////
}
}
|