#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是之前,软启动结束值
*/
/////////////////////////////////////////
}
}
|