主函数main()
while (1)
{
if(Test_10mSedA)
{
Clr_10mSedA;
T10msCheck();
}
if(Test_OneSedA)
{
Clr_OneSedA;
T1sCheck();
}
PvCheck();
if(ErrFlag)
{
Set_PvWait;
Delay_Pv = 3;
Set_IGBTOff;
continue;
}
else
{
if(Test_PvWait) continue;
}
IgbtCheck();
if(ErrFlag) {Set_IGBTOff; continue;}
HsrCheck();
if(ErrFlag) {Set_IGBTOff; continue;}
CoilCheck();
if(ErrFlag) {Set_IGBTOff; continue;}
PanCheck();
if(ErrFlag) {Set_IGBTOff; continue;}
CurCheck();
if(Test_OnOff)
{
FzCheck();
PwmCtrl();
}
else
{
InitVar();
}
}
主函数首先执行10ms和1s定时运行函数,其次进行电源电压检测PvCheck()、IGBT温度检测IgbtCheck()、 线盘温度检测HsrCheck()、线盘连接检测CoilCheck()、锅具温度检测PanCheck()、电流检测CurCheck(),待一切检测正常后再判断是否开机,如开机则进行锅具检测(判断是否有锅)FzCheck()、最后再进行PWM调整。
关于三个温度检测、电压检测、电流检测,见原理图可知通过热敏电阻、电阻分压、电流互感器进行AD转换采样。
主要锅具检测如下:
void FzCheck(void)
{
uchar i = 13;
uchar j = 0;
uchar k = 0;
if(Test_NoAd) return; //如果当前处于禁止控制状态,则不予处理
if(Test_NoFz) //无锅检测
{
if(Delay_3s == 0) //3S时间到检测
{
CCAP0H = PWM50DUTY; //PWM0的占空比为50% ((64-32)/64)
Set_IGBTOff; //关IGBT
Set_PzCheck; //锅具检测口置高
while(i--); //等待8us
i = 13;
Delay_3s = 3; //下次检测等待3s
EA = 0;
Clr_IGBTOff; //开IGBT
_nop_();
_nop_();
Clr_PzCheck; //锅具检测口拉低
while(i--); //等待8us
Set_PzCheck; //输出高电平准备读
Set_IGBTOff; //关IGBT
for(i = 0; i < 255; i++)//连续读取255次IO电平状态
{
_nop_();
_nop_();
_nop_();
_nop_();
if(Test_PzCheck) j++; //高电平个数
else k++; //低电平个数
}
EA = 1;
if(k < 100) //有锅低电平个数小于100(如无锅则高电平个数与低电平个数几乎相等)
{
i = 13;
Clr_NoFz; //设置有锅
Clr_IGBTOff; //开IGBT
_nop_();
_nop_();
Clr_PzCheck; //锅具检测口拉低
while(i--); //等待8us
Set_PzCheck; //输出高电平准备读
}
}
}
}
时序如下:
PWM信号在检锅期间始终为百分之五十,待启动后再调整PWM,进行功率调节。实测最低百分之三十以下,则不能工作。
注意:当检验到有锅后,START再次输出一个低脉冲进行启动工作。
用户424103 2014-5-28 09:12
蒙牛,没想到电磁炉用到IGBT
用户377235 2014-5-27 21:34
程序尽显天朝山寨本色。
用户403664 2014-5-7 10:28