ing=1; return; } } if (VolErrFlag[k].cc !=0) bVolErrcomting=0; if (bVolErrcomting && VolErrcomt==0) { // 启动转换动作 bVolErrcomting=0; bBkOpen1=k; CLRWDT(); StartTurn(k); } } static void CheckVol2() { // 电压判断,处理函数2 if (VolErrFlag[0].cc !=0) { bVolErrcomting=0; // 恢复异常计时器标记 } else { if (bVolErrcomting==0) { di(); CLRWDT(); VolErrcomt=(unsigned int) LimParams.Para.Trn*TiScale; // 预设异常计时器的初值 ei(); bVolErrcomting=1; return; } } if (bVolErrcomting && VolErrcomt==0) { // 启动转换动作 bVolErrcomting=0; CLRWDT(); bBkOpen1=0; StartTurn(0); } } static void CheckVol3() { // 电压判断,处理函数3 if (VolErrFlag[0].cc==0) { bVolErrcomting=0; // 恢复异常计时器标记 bDJstarting=0; } else { if (bVolErrcomting==0) { di(); CLRWDT(); VolErrcomt=(unsigned int) LimParams.Para.Tnr*TiScale; // 预设异常计时器的初值 ei(); bVolErrcomting=1; return; } } if (bVolErrcomting && bDJstarting==0 && VolErrcomt==0) { di(); CLRWDT(); DJstartcomt=(unsigned int)LimParams.Para.T1*TiScale; // 预设发电机启动的等待计时器的初值 ei(); CLRWDT(); bDJstarting=1; return; } if (bDJstarting && DJstartcomt==0) { // 启动转换动作 CLRWDT(); bVolErrcomting=0; bBkOpen1=1; StartTurn(1); } } …… void main() { …… if (bBkOpen1) { // 在备用电源合闸状态 if (LimParams.Para.JobType==1) { // 自投不自复方式 CheckVol1(1); } else { //自投不自复或发电机方式 CheckVol2(); } } else { // 在常用电源合闸状态 if (LimParams.Para.JobType==2) { // 发电机工作方式 CheckVol3(); } else { // 自投自复或自投不自复方式 CheckVol1(0); } } …… } 5. 智能双电源装置的电压采样的校准 在实际生产中,由于采样电阻的误差,所以在相同的校准电压输入,单片机采样到的AD值是不一样的。如何设定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=IntUarray; // 读入比例参数, CLRWDT(); SaveScal(); // 保存比例参数 SaveScalFlag(); // 并改写标志 Delay5s(); return; } …… } }
|