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

📄 stc5404ad无刷控制器.c

📁 采用stc12c5404ad的51系列内核无刷控制器程序
💻 C
📖 第 1 页 / 共 3 页
字号:
  do{ledcs=3;led_k();get_ad_dy();} //闪灯提示重新测量电压
    while(adc_data<=175);          //检测是否恢复到正常电压44V
    ledcs=3;led_k();               //电压恢复44V以上再闪灯做为延时用     
    hehc_bl=0;                     //清霍尔旧数据为了起动
   }
}
//*******************霍尔故障检测函数**********************************************
void he_gzjc(void)
{  
hehc=P1&0x07;               //读入霍尔数据,并分离有效数据
//--查霍尔是否全1--------
while(hehc==0x07)           //判断是否为3个全1,成立循环执行语句体
  {pca_pwm0=0x03;           //霍尔出现故障关闭所有输出
   pca_pwm1=0x03;           //
   pca_pwm2=0x03;           //
   pwmal=0;pwmbl=0;pwmcl=0; //
   TR0=0;zs_ds_js=0;zs_js=0;    //关测速定时器,定时计数器清0,转速度计数器清0
	ledcs=6;led_k();   //循环执行语句体6次闪烁,直到不成立退出
   hehc=P1&0x07;            //重新检测霍尔
  }
//--查霍尔是否全0--------
while(hehc==0x00)           //不为3个1再判断是否为3个0,成立执行循环语句体
  {pca_pwm0=0x03;           //霍尔出现故障关闭所有输出
   pca_pwm1=0x03;           //
   pca_pwm2=0x03;           //
   pwmal=0;pwmbl=0;pwmcl=0; //
   TR0=0;zs_ds_js=0;zs_js=0;    //关测速定时器,定时计数器清0,转速度计数器清0
	ledcs=6;led_k();   //循环执行语句体6次闪烁,直到不成立退出
   hehc=P1&0x07;            //重新检测霍尔
  }
//--查霍尔是否更新--------   
  if(hehc_bl!=hehc)           //判断霍尔是否变化,成立执行语句1后退出
  {hehc_bl=hehc; }           //语句2,霍尔变化存入新的数据到变量中
}
//**********电流自动调整函数******************************************************
void dl_tz(void)
 {set_p17_adc();
     get_ad_dy();
     while(adc_data>=20)
     {pwm_bls++;if(pwm_bls>=241){pwm_bls=241;}
      he_gzjc();pwm_out();dgdz();
     }
    // if(adc_data>=45)
    // {pwm_bls=240;//adc_data*10+pwm_bl;
    // }
   // else
    //{pwm_bls=pwm_bl;}   
  }
//********************转把工作状态分析函数****************************************
//函数出口--pwm_bl里有查表后数据,PWM输出程序直接读出放入PWM占空比寄存器
//ccap0h,ccap1h,ccap2h中即可
//********************************************************************************
void zb_fx(void)
{  //---连续3次测量转把电压-------- 
   set_p13_adc();                  //调转把电压转换通道 
   get_ad_dy();                    //第一次测量转把电压                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
   pwm_bl=pwmout[adc_data];        //在数组中查出对应的AD转换PWM值
   if(pwm_bl==1)                   //为1成立执行大的语句1后退出,不成立执行语句2后退出
   //语句1,转把电压等于1说明转把在1.3v以下或4.5v以上停止输出闪LED
     {
      hehc_bl=0;                   //霍尔存储旧数据的变量及时清0否则很难起动
      pca_pwm0=0x03;               //停止所有输出             
      pca_pwm1=0x03;
      pca_pwm2=0x03;
      TR0=0;zs_ds_js=0;zs_js=0;    //关测速定时器,定时计数器清0,转速度计数器清0
      pwmal=0;pwmbl=0;pwmcl=0;     //关3个下桥
      timebj=15;                   //定时器1中断12次闪烁一次LED
      TR1=1;zbyx_bz=0;             //开定时器1-LED闪烁,转把归0标志位为0,pwm输出就无效
     }
   else
   //语句2,转把电压不等于1说明在1.3v-4.5v之间正常行驶数据
     {led=1;zbyx_bz=1;TR0=1;}      //关定时器1指示灯,转把有效标志位为1,pwm输出有效 
}
//**********************软启动************************************
//dg_rqd()
//{dgdz();
 //if(pwm_bl!=pwm_blj)                             
  // {for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)
	// {he_gzjc();pwm_out();}pwm_blj=pwm_bl;
//	}
 //else
 //  {if(shache_bz==1)
  //   {for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)
//	   {he_gzjc();pwm_out();}pwm_blj=pwm_bl;shache_bz=0;
//	  }
//	 else
//	  {he_gzjc();pwm_out();}
//	}
//}
//********************防盗锁电机函数**********************************************
fd_dg()
{while(fd==0)
{
{int fd_he;
 fd_he=P1&0X07;
 if(fd_he!=fd_hej)
{fd_hej=fd_he;
    //switch(fd_he)                               //多分支语句根据霍尔位置输出对应节拍
      // {case  0x01:{
      pca_pwm0=0x03;pca_pwm2=0x03;pwmbl=0;pwmcl=0;
      ccap1h=10;pwmal=1;pca_pwm1=0x00;delay(20);
      pwmal=0;pca_pwm1=0x03;
      pwmal=1;pwmbl=1;pwmcl=1;delay(300);
                             //-------
                             //pwmcl=1;pca_pwm0=0x00;delay(1);
                            // pwmcl=0;pca_pwm0=0x03;delay(2);
                // break;}  //第1拍ccap0h刷新参数开C下桥A上桥
       //-------------------------------------------------------------
       // case  0x03:{pca_pwm0=0x03;pca_pwm1=0x03;pwmbl=0;pwmcl=0;
        //           ccap2h=10;pwmal=1;pca_pwm2=0x00;delay(20);
         //                    pwmal=0;pca_pwm2=0x03;
         //                    pwmal=1;pwmbl=1;pwmcl=1;delay(200);
                            //--------
                            // pwmcl=1;pca_pwm1=0x00;delay(1);
                            // pwmcl=0;pca_pwm1=0x03;delay(2);
         //          break;}  //第2拍ccap1h刷新参数开C下桥b上桥
       //-------------------------------------------------------------    
       // case  0x02:{pca_pwm0=0x03;pca_pwm1=0x03;pwmal=0;pwmcl=0;
            //       ccap2h=10;pwmbl=1;pca_pwm2=0x00;delay(20);
             //                pwmbl=0;pca_pwm2=0x03;
              //               pwmal=1;pwmbl=1;pwmcl=1;delay(200);
             //               //--------
                             //pwmal=1;pca_pwm1=0x00;delay(1);
              //               //pwmal=0;pca_pwm1=0x03;delay(2);
              //     break;}  //第3拍ccap1h刷新参数开a下桥b上桥
       //-------------------------------------------------------------  
      //  case  0x06:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmcl=0;
        //           ccap0h=10;pwmbl=1;pca_pwm0=0x00;delay(20);
        //                     pwmbl=0;pca_pwm0=0x03;
        //                     pwmal=1;pwmbl=1;pwmcl=1;delay(200);
                            //---------
                             //pwmal=1;pca_pwm2=0x00;delay(1);
                             //pwmal=0;pca_pwm2=0x03;delay(2);
         //          break;}  //第4拍ccap2h刷新参数开a下桥c上桥
       //-------------------------------------------------------------  
       // case  0x04:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
       //            ccap0h=10;pwmcl=1;pca_pwm0=0x00;delay(20);
       //                      pwmcl=0;pca_pwm0=0x03;
        //                     pwmal=1;pwmbl=1;pwmcl=1;delay(200);
        //                    //---------
                             //pwmbl=1;pca_pwm2=0x00;delay(1);
                             //pwmbl=0;pca_pwm2=0x03;delay(2);
        //           break;}  //第5拍ccap2h刷新参数开b下桥c上桥
       //-------------------------------------------------------------  
       // case  0x05:{pca_pwm0=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
         //          ccap1h=10;pwmcl=1;pca_pwm1=0x00;delay(20);
        //                     pwmcl=0;pca_pwm1=0x03;
        //                     pwmal=1;pwmbl=1;pwmcl=1;delay(200);
                            //----------
                            // pwmbl=1;pca_pwm0=0x00;delay(1);
        //                    // pwmbl=0;pca_pwm0=0x03;delay(2);
        //           break;}  //第6拍ccap0h刷新参数开b下桥a上桥     
      // }
  }
}
}
}
//********************主函数******************************************************
main()
{ 
  sd_csh();                     //调上电初始化函数
  qy_jc();                      //调欠压检测函数
  sd_ffc();                     //调上电防飞车函数,等待归0后才往下执行
  he_gzjc();                    //调霍尔故障检测函数,无故障才往下执行
 while(1)               
  {
    qy_jc();
   if(fd==0){fd_hej=P1&0x07;fd_dg();}//如果防盗口为低电平执行防盗程序
   //--------------
  else                               //否则执行正常程序
  {
   if(dz_bz1!=1){zb_fx();}           //1>调转把分析函数
   if(zbyx_bz==1)                    //如果转把标志位为1转把有效,就执行语句体否则不执行
     {dl_tz();dgdz();
      he_gzjc();pwm_out();
      cs_fx=cs1&cs2&cs3;
      if(cs_fx!=0x00)
        {zs_js++;}
     }     //语句体,调霍尔分析函数,调PWM输出函数
   sc_stop();                   //调刹车断电检测函数
  }
  //-----------------------
 }
}
//********************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -