⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pic16f73inductionprocedures.c

📁 C用语言来做一个PIC16F73电磁炉程序很好的请大家共同学习.
💻 C
📖 第 1 页 / 共 3 页
字号:
    {   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 + -