📄 pic16f73inductionprocedures.c
字号:
{ iPower = 2 ; //定义开关状态单元
uWorkTime = T3WORKTIME; //给工作,休息时间赋初值
uRestTime = T3RESTTIME;
}
else if((gNowSwitch & switchWEAKWARM) == switchWEAKWARM) //是弱加热状态
{ iPower = 4 ; //定义开关状态单元
uWorkTime = T6WORKTIME; //给工作,休息时间赋初值
uRestTime = T6RESTTIME;
}
else if ((gNowSwitch & switchKEEPWARM) == switchKEEPWARM) //是加热状态
{ iPower = 8;
bDCLon = 0; //定义开关状态单元,置开始加热标志
}
else
{ asm("nop"); } //出错
PWM_hi=0x0c0;
if(iPower ==1) //若是关机,置关机标志
bDCLoff = 1;
else
bDCLoff = 0;
}
//主要用于判断工作条件是否满足
//X用于恒功率查表,判断电流用
void work_condition_check(void)
{ uchar u,pan_temp,igbt_temp;
uchar U_max,U_min,Cpan_max,Cigbt_max;
if(bErro==1) //此处为保护的一些参数设定
{ U_min=0x93; U_max=0x0ba; //出错后的参数
Cpan_max=0x40; Cigbt_max=0x6a;
}
else
{ U_min=0x8d; U_max=0x0c1; //出错前的参数
Cpan_max=0x60; Cigbt_max=0x82;
}
if(bCirCndit==0)
{ bCirCndit = 1;
u = ad_out(gate_Voltage);
if(u<U_min) //电压过高或过低,虚保护,设标志位
bLVoltage=1;
else //电压过低保护
bLVoltage=0;
if(u>U_max)
bHVoltage0=1; //电压过高保护
else
bHVoltage0=0;
}
else if(bCirCndit==1)
{ bCirCndit = 2;
pan_temp = ad_out(gate_Pan_Warm);
if((pan_temp > Cpan_max)||(pan_temp==0))
bHpan_tem=1; //锅低温度过高保护
else
bHpan_tem=0;
if(pan_temp<0x09)
a=0;
else if(pan_temp<0x2b)
a=1;
else if(pan_temp<0x3a)
a=2;
else if(pan_temp<0x50)
a=3;
else
a=4;
}
else if(bCirCndit==2)
{ bCirCndit=3 ;
igbt_temp = ad_out(gate_IGBT_Warm);
if(igbt_temp>Cigbt_max)
bHigbt_tem=1; //IGBT温度过高保护
else
bHigbt_tem=0;
}
else if(bCirCndit==3)
{ bCirCndit=0;
if(RC3==0)
bHVoltage1=1;
else
bHVoltage1=0;
}
else
{ bCirCndit = 0; }
if((bLVoltage==1)||(bHVoltage0==1)||(bHpan_tem==1)||(bHigbt_tem==1)||(bHVoltage1==1))
bProtect0=1; //只要发生一个错误,就置错误标志
else
bProtect0=0;
}
void Voltage_check(void)
{ uchar u;
u = ad_out(gate_Voltage);
if (u<0x98) x=1; //主要为功率控制查表用
else if (u< 0x9c) x=2;
else if (u<0x0a0) x=3;
else if (u<0x0a4) x=4;
else if (u<0x0a8) x=5;
else if (u<0x0ac) x=6;
else if (u<0x0b0) x=7;
else if (u<0x0b4) x=8;
else if (u<0x0b8) x=9;
else x=10;
}
//功率调整
//主要通过电流AD转换和已设定的值进行比较的
void Power_adjust(void)
{ uchar i,y,z,Current_AD0,Current_AD1;
uint uHi1,ss1;
i = ad_out(gate_Current);
if(i<0x08) //电流过低,属于无锅,需保护
bL_Current=1 ;
else
bL_Current=0;
if(i>0x8f) //电流过高,需保护
bH_Current=1 ;
else
bH_Current=0;
if ((bL_Current==1)||(bH_Current==1))
bProtect1=1; //电流过大或过小,都需保护,置标志
else
bProtect1=0;
if(iPower==8) //给查电流表赋偏移量
y=0;
else
y=11;
z=x-a; //计算下标
if(z<1 ) z=1;
if(z>10) z=10;
z=y+z;
Current_AD0 = current_table[z-1]; //电流AD转化的下限值
Current_AD1 = current_table[z]; //电流AD转化的上限值
if(i<Current_AD0) //电流太小
{ PWM_hi++; //增大占空比
uHi1 = PWM_hi; //修改PWM的占空比
ss1=uHi1 & 0x03fc;
CCPR2L = (ss1 >> 2);
ss1=uHi1 & 0x0003;
CCP2CON |= ((ss1 <<4) & 0x0030); //CCP2CON<5:4>=0;
}
else if(i > Current_AD1) //电流太大
{ PWM_hi--; //减小占空比
uHi1 = PWM_hi; //修改PWM的占空比
ss1=uHi1 & 0x03fc;
CCPR2L = (ss1 >> 2);
ss1=uHi1 & 0x0003;
CCP2CON |= ((ss1 <<4) & 0x0030); //CCP2CON<5:4>=0;
}
else
{ asm("nop"); }
}
//读开关状态,确保工作状态
void Read_Switch_State(void)
{ uchar uSwOne,uSwTwo;
uSwTwo = iPower<<4 ;
if(bSwitch == 0)
{ uSwOne = PORTB & switchSHIELD; //读开关的值
if( uSwOne != uSwTwo) //判断是否与原来的值相等
{ t10ms = 0 ;
bSwitch = 1 ;
}
}
else
{ if( t10ms>1 )
{ uSwOne = PORTB & switchSHIELD; //读开关的值
if(uSwOne != uSwTwo) //前后两次的值是否相等
{ INTF = 1; } //触发中断
}
}
}
//功率控制
//主要是连续工作,间隙工作,错误状态要关机
void Power_control(uchar iPower)
{ uint Pwm_h;
if(iPower ==1)
{
if (bDCLoff==0)
{
Turnoff_PWM_Output(); //关闭PWM的输出
Low_PWM_Output(); //PWM输出低电平
bDCLoff = 1;
}
else
{ asm("nop"); }
}
else if(iPower ==8)
{
if (bDCLon==0)
{
Check_Machine_Wave();
if(gRevPlus >= MAXPLUSNUM) //如果测试到的脉冲数大于预先设定的脉冲数
bNopan=1; //则认为无锅
else
{ Pwm_h = PWM_hi;
Send_IGBT_Plus(Pwm_h);
t120ms=0; //延时一段时间100ms
while(t120ms<11);
High_Test_Output();
bDCLon = 1;
bNopan = 0;
t01s=0; //用于电流检测
}
}
else
{ asm("nop"); }
}
else if((iPower ==2)||(iPower ==4))
{
if(gWorkNow == 1)
{ //目前正在工作
if( t1s > uWorkTime )
{ //工作的定时时间到了
gWorkNow = 0; //开始休息啦
t1s = 0 ;
Turnoff_PWM_Output(); //关闭PWM的输出
Low_PWM_Output(); //PWM输出低电平
}
else
{ asm("nop"); }
}
else //目前正在休息
{
if( t1s > uRestTime )
{ //休息的定时时间到了
gWorkNow = 1; //开始工作了
t1s = 0;
Check_Machine_Wave();
if(gRevPlus >= MAXPLUSNUM) //如果测试到的脉冲数大于预先设定的脉冲数
bNopan=1; //则认为无锅
else
{ Pwm_h = PWM_hi;
Send_IGBT_Plus(Pwm_h);
t120ms=0; //延时一段时间10ms
while(t120ms<11);
High_Test_Output();
bNopan = 0;
t01s=0; //用于电流检测
}
}
else
{
asm("nop"); //继续休息
}
}
}
else
{
Turnoff_PWM_Output(); //关闭PWM的输出
Low_PWM_Output(); //PWM输出低电平
}
}
void Display(void)
{ uchar uADy0,uAD1;
if( bErro == 0)
{ if(iPower==1) //显示功率档位用
uAD1=0;
else if(iPower==8) //加热档
uAD1=1;
else if(iPower==4) //弱加热档
uAD1=2;
else if(iPower==2) //保温档
uAD1=3;
else
uAD1=4; //档位错误,或没接开关
}
else
{ if(bHVoltage0==1) //电压太高
uAD1=0x0c;
else if(bLVoltage==1) //电压太低
uAD1=0x0b;
else if((bL_Current==1)||(bNopan==1)) //无锅
uAD1=0x0a;
else if(bHigbt_tem==1) //IGBT温度太高
uAD1=9;
else if(bHpan_tem==1) //锅底温度太高
uAD1=8;
else if(bHVoltage1==1) //电压太高
uAD1=7;
else if(bH_Current==1) //电流太大,电路有问题
uAD1=6;
else
uAD1=5; //控制出现异常情况
}
DISPLAY1(uADy0,uAD1);
}
//当MCU发出试探脉冲后,检查返回的脉冲个数及频率
//TMR1是Capture和定时复合用的
//在使用Capture之前,现保存TMR1的设置值
void Check_Machine_Wave(void)
{
uchar uTMRL;
uchar uTMRH;
uchar uCON;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -