1. 智能双电源装置的简介
g[j].cc==0)
{
bvolerrcnting=0; // 恢复异常计时器标记
}
else
{
if (bvolerrcnting==0)
{
di();
clrwdt();
volerrcnt=(unsigned int) limparams.cc[j]*tiscale;
// 预设异常计时器的初值
ei();
bvolerrcnting=1;
return;
}
}
if (volerrflag[k].cc !=0)
bvolerrcnting=0;
if (bvolerrcnting && volerrcnt==0)
{ // 启动转换动作
bvolerrcnting=0;
bbkopen1=k;
clrwdt();
startturn(k);
}
}
static void checkvol2()
{ // 电压判断,处理函数2
if (volerrflag[0].cc !=0)
{
bvolerrcnting=0; // 恢复异常计时器标记
}
else
{
if (bvolerrcnting==0)
{
di();
clrwdt();
volerrcnt=(unsigned int) limparams.para.trn*tiscale;
// 预设异常计时器的初值
ei();
bvolerrcnting=1;
return;
}
}
if (bvolerrcnting && volerrcnt==0)
{ // 启动转换动作
bvolerrcnting=0;
clrwdt();
bbkopen1=0;
startturn(0);
}
}
static void checkvol3()
{ // 电压判断,处理函数3
if (volerrflag[0].cc==0)
{
bvolerrcnting=0; // 恢复异常计时器标记
bdjstarting=0;
}
else
{
if (bvolerrcnting==0)
{
di();
clrwdt();
volerrcnt=(unsigned int) limparams.para.tnr*tiscale;
// 预设异常计时器的初值
ei();
bvolerrcnting=1;
return;
}
}
if (bvolerrcnting && bdjstarting==0 && volerrcnt==0)
{
di();
clrwdt();
djstartcnt=(unsigned int)limparams.para.t1*tiscale;
// 预设发电机启动的等待计时器的初值
ei();
clrwdt();
bdjstarting=1;
return;
}
if (bdjstarting && djstartcnt==0)
{ // 启动转换动作
clrwdt();
bvolerrcnting=0;
bbkopen1=1;
startturn(1);
}
}
……
void main()
{
……
if (bbkopen1)
{ // 在备用电源合闸状态
if (limparams.para.jobtype==1)
{ // 自投不自复方式
checkvol1(1);
}
else
{ //自投不自复或发电机方式
checkvol2();
}
}
else
{ // 在常用电源合闸状态
i
f (limparams.para.jobtype==2)
{ // 发电机工作方式
checkvol3();
}
else
{ // 自投自复或自投不自复方式
checkvol1(0);
}
}
……
}
5. 智能双电源装置的电压采样的校准
在实际生产中,由于采样电阻的误差,所以在相同的校准电压输入,单片机采样到的ad值是不一样的。www.133229.coM如何设定ad值和校准电压的校准比例,是一个关键的问题,校准比例不能在程序编译中固定下来,因为这样会有较大的误差,即使改用精密电阻来采样,误差也不能减低很多。我在应用中采用的方法是:提高采样电路的线性度,使其在不同电压下的校准比例有很好的一致性(在解决了温升的问题后,这点是可以做到的);在采样电路输入校准电压,输入设置密码后,单片机自动计算校准比例,并把校准比例进行保存。
……
void main()
{
……
readscal();
……
while(1)
{
……
……
}
}
……
static void keyproc()
{……
if ( setkey==0)
{
……
if ( bsecpass==1)
{
// 设电压
if (readscalflag() !=0)
return;
// 如果已设定了比例,就不能再更改
clrwdt();
showstring(0, 0);
showstring(1, 1); // "pass"
showstring(0, 2);
// 在lcd屏上显示pass
clrwdt();
for (i=0; i!=6; i++)
scaluarray[i]=intuarray[i]; // 读入比例参数,
clrwdt();
savescal(); // 保存比例参数
savescalflag(); // 并改写标志
delay5s();
return;
}
……
}
}