1、 引言
电磁炉是家用电器的主要烹饪厨具,无需明火以电磁感应加热方式直接加热锅具底部,是一种安全高效卫生的加热器具。目前有许多文章介绍电磁炉加热原理以及一些保护原理,本文详细说明如何用单片机输出正确的时序来检测电磁炉是否有锅具以及如何加热。
2、 电磁炉检锅
2.1检锅的工作原理
图1
上图给出了电磁炉原理图,主要模块:主回路、同步振荡电路、驱动电路、单片机、开关电源、浪涌保护电路、电压检测、电流检测电路、测温模块、风扇模块等。正常工作的原理:线圈盘与电容C6谐振的每个周期,通过同步电路检测在IGBT的C极电压为零时,开通IGBT对线盘充电。
电磁炉在正常工作前,需要进行检锅,判断是否有锅或者锅具的大小是否合适。图2是为无锅时序图,图3为有锅时序图。启动时,PWM输出占空比为百分之五十,比较器脚⑤电压为2.5V,首先OFF_IGBT为低电平打开驱动模块,单片机给START口一个约8us的低电平,此时比较器脚⑥为一个三角波与脚⑤比较,则脚⑦输出一个高脉冲打开IGBT,接着立即将OFF_IGBT置高关闭驱动模块,同时将START口设置成输入口,在接下来大概280us的时间内检测START口电平翻转的次数,若有锅,则次数低于10次,若无锅,则有150次以上(根据实际测试调整),这样就可以判断是否有锅。
图2 无锅时序图
图3 有锅时序图
如无锅具或锅具不合适则等待3秒后再次检测锅具;如检测有锅具,则START口重新输出一个8us的低电平脉冲,而此时OFF_IGBT口不再关闭,如图3所示,主回路则连续振荡且每个周期充电。
2.2检锅的程序代码分析
根据之前的时序,下面给出了具体的C语言单片机代码。编程时需注意以下几点:
a、检锅为计数为关键代码,如被计数时被中断,则影响检锅计数值,所以在这之前需关闭总中断。
b、START口的高低电平的数量,是通过每1us检测START口的状态,高电平的变量j加1,低电平变量k加1。如需要更精确的计数,则可通过计数器计数。
c、代码中包含了电磁炉正常工作时的移锅检测,电流突然变小,则认为锅具移除,设置无锅具标志。
void PAN_Detect(void)
{
unsigned char i = 0;
unsigned char j = 0;
unsigned char k = 0;
if(Test_NoHANDLE) return; //如果处于禁止控制状态,则不检锅
if(Test_NoPan) //无锅检测
{
if(Delay_3s == 0) //判断等待3秒是否已到
{
PWM3DCH = PWM50DUTY; //PWM0的占空比为50% ((64-32)/64)
Output_PanCheck; //START口设置为输出口
Set_IGBTOff; //关IGBT
Set_PanCheck; //锅具检测START口置高
Delay_8us(); //等待8us
Delay_3s = 3; //3秒变量重置
DisableInterrupts(); //关总中断
Clr_IGBTOff; //开IGBT
Clr_PanCheck; //START口置低
Delay_8us(); //等待8us
Set_PanCheck; //START口置高
Input_PanCheck; //START口设置为输入口
Set_IGBTOff; //OFF_IGBT口关闭
for(i = 0; i < 255; i++) // 计数START口的高低电平数量(280us)
{
Delay_1us();
if(Test_PanCheck) j++;
else k++;
}
EnableInterrupts(); //打开总中断
if(k < 31) //低电平数量小于31,判断为有锅具
{
Output_PanCheck; //START口设置为输出口
Clr_NoPan; //清除无锅标志
Clr_IGBTOff; //开OFF_IGBT口
DisableInterrupts(); //关闭总中断
Clr_PanCheck; // START口置低
Delay_8us(); //等待8us
Set_PanCheck; // START口置高
EnableInterrupts(); //开总中断
Input_PanCheck; //START口设置为输入口
}
else //低电平数量大于等于31,判断为无锅
Warn_Flag = ERC_NOPAN; //警告变量设置为无锅
}
}
else //有锅检测
{
if((Delay_3s == 0)&&(Sys_Current < 4)) //3秒等待已到,且采样电流值小于4
{
Set_NoPan; //设置无锅标志
Set_IGBTOff; // OFF_IGBT口关闭
}
}
}
3、 电磁炉功率调整
3.1功率调整的工作原理
图4 比较器引脚电压图
如图4,电磁炉正常工作时,比较器脚⑥电压为三角波,与脚⑤电压比较后,生成脚⑦驱动波形。脚⑥电压为同步电路经过电容产生的,脚⑤电压为单片机PWM口输出波形,经过RC滤波形成直流电压。所以PWM的占空比升高,则电磁炉功率增大,占空比降低,则电磁炉功率减小。
3.2功率调整的代码分析
下列为电磁炉功率调整代码,Sys_Current为系统实际电流变量,Set_WorkCurrent为设置电流变量,PwmData为目标占空比变量,PWM3DCH为单片机实际占空比。以设置电流值与实际电流值做比较,来调整目标占空比变量PwmData。再用PwmData来调整单片机实际占空比的寄存器PWM3DCH。需要注意的是,PwmData需要设置上下限,防止电磁炉功率过高或过低。
void IH_AdjustPower(void)
{
unsigned int sysvolt;
if(Test_NoPan||Test_NoHANDLE) return; //无锅或处于禁止控制状态,则不予处理
if(Sys_Current < Set_WorkCurrent-3) //工作电流小于设置电流
PwmData++; // PwmData加1
else if(Sys_Current > Set_WorkCurrent+3) //工作电流小于设置电流
PwmData--; // PwmData减1
if(PwmData > PWM90DUTY) // 防止PwmData过大
PwmData = PWM90DUTY;
else if(PwmData < PWM40DUTY) // 防止PwmData过低
PwmData = PWM40DUTY;
DisableInterrupts(); //关闭总中断
if (PWM3DCH > PwmData) PWM3DCH--; // PWM3DCH调整
else if (PWM3DCH < PwmData) PWM3DCH++;
EnableInterrupts(); //打开总中断
}
4、 电磁炉工作主流程
4.1主函数流程
电磁炉的整个软件流程图如图5, 初始化完成后,进入大循环。先10ms时基处理,再检查系统电压、IGBT温度、系统电流,最后100毫秒和1秒时基处理。
当系统电压或IGBT温度有异常,则停止加热,重新进入循环。所以重要的程序应放在10ms时基函数中,如与显示板的通讯程序。将检锅函数和功率调整函数放在100ms时基函数中,在1s时基函数中放入时间要求不高的程序,如风扇、计时等。
图5 主程序流程图
4.2主函数程序的代码分析
通过上面的流程图,写出相应的代码如下。
void main(void)
{
System_Init(); //初始化
while(1)
{
if(Test_10mSedA) //10ms时基处理
{
Clr_10mSedA;
T10mSCheck (); //10ms函数调用
}
SystemVoltageCheck(); //系统电压检测
if(Err_Flag) {IH_NormalStop();continue;} //异常则停止加热,并重新循环
IGBTTempCheck(); //IGBT温度检测
if(Err_Flag) {IH_NormalStop();continue;} //异常则停止加热,并重新循环
SystemCurrentCheck(); //系统电流测量
if(Test_100mSedA) //100ms时基处理
{
Clr_100mSedA;
if(Test_IHOnOff&&(Err_Flag== 0)) //检查电磁炉开标志和故障标志
{
if(!Test_NoHANDLE) //无禁止控制
{
PAN_Detect(); //检锅子函数
if(!Test_NoPan) //有锅具
{
IH_AdjustPower(); //功率调整函数
}
}
else //有禁止控制
{
IH_NormalStop(); //停止加热
}
else //电磁炉关或有故障
{
if(!Test_IHOnOff) Err_Flag = 0; //如电磁炉关,清除故障变量
IH_NormalStop(); //停止加热
}
}
if(Test_OneSedA) //1S时基处理
{
Clr_OneSedA;
T1sCheck();
}
}
}
5、结论
本文详细讲解了基于单片机的电磁炉控制原理,详细分析了电磁炉检锅时序,功率调整的方法以及主程序控制流程,同时给了完整的程序代码。只需基于上面的加热控制核心代码,在固定的时基内添加一些附加功能代码或显示代码,即可以作为一个完善的电磁炉程序。