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

📄 无刷0621.c

📁 采用stc12c5404ad的51系列内核无刷控制器程序
💻 C
📖 第 1 页 / 共 2 页
字号:
 pwmal=0;                        //上电复位后首先关闭3组下桥
 pwmbl=0;                        //
 pwmcl=0;                        //
 adc_power();                    //调AD转换用初始化函数
 pwm_sz();                       //调PWM输出用初始化函数
 time_csh();                     //调两个定时器初始化函数
}
//********************上电防飞车函数归0后LED正常闪烁******************************
void sd_ffc(void)
{
 set_p13_adc();                  //调转把电压转换通道 
 get_ad_dy();                    //上电后测量转把电压是否归零
 while(adc_data>=61)              //61为1.2V转换值转把如果大于1.2V执行循环体语句等待归0 
    {ledcs=2;led_k();            //循环体语句,2次间隔性快闪灯
     get_ad_dy();                //循环体语句,重新检测电压等待归0
    }
 TR0=0;                          //关PWM频率否则干扰闪灯
 timebj=12;                      //归0后定时器中断10次闪烁一次LED
 TR1=1;                          //归0后开定时器1-LED闪烁
}
//*************刹车函数自动选择是断电还是ABS刹车功***************************
void sc_stop(void)    //ABS刹车有外接口对地选择,对地时为ABS功能
{ 
  if(shache==0)                     //判断语句刹车口等于0执行大语句1
  {  abs=1;                           
    //大语句体1
    if(abs==1)                      //判断ABS选择不为0就执行普通刹车断电,否则执行ABS刹车
//==========普通刹车断电==================================================
    {
     TR0=0;led=0;                   //关测速定时器,亮刹车灯
     pca_pwm0=0x03;                 //关3路PWM信号AH
     pca_pwm1=0x03;                 //关3路PWM信号BH
     pca_pwm2=0x03;                 //关3路PWM信号CH
     pwmal=0;pwmbl=0;pwmcl=0;       //关3路下桥
     //----------------------------------------------------------------------
     while(shache==0)               //循环语句,刹车口没松开就一直等待
      {delay(500);}                 //语句体,延时抗干扰防止抖动
     hehc_bl=0;led=1;               //刹车口松开后清霍尔变量内存再关刹车灯
     //----------------------------------------------------------------------
     for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--) //以下两句为刹车口松开后减缓冲击
	   {he_gzjc();pwm_out();}                    //从最低速度加高到实时的转把设定速度  
    }
//===========EABS刹车断电=====================================================
    else                            //ABS功能已选择进入ABS刹车
    {                               //
	    TR0=0;led=0;                 //关测速定时器,亮刹车灯
       pca_pwm0=0x03;               //关3路PWM信号AH
       pca_pwm1=0x03;               //关3路PWM信号BH
       pca_pwm2=0x03;               //关3路PWM信号CH
       pwmal=0;pwmbl=0;pwmcl=0;     //关闭3个下桥:AL-BL-CL
    //-------------------------------------------------------------------------
     do                             //do-while语句先执行do再执行while判断表达式
      {
        for(h=100;h>0;h--)         //每检测一次没松开就先执行1万次ABS点刹,防止刹车抖动干扰
         { pwmal=0;pwmbl=0;pwmcl=0;
           delay1(1);
           pwmal=1;pwmbl=1;pwmcl=1; //ABS点刹
           delay1(80);
         }
      } 
     while(shache==0);               //内镶循环语句,只要刹车没松开就一直开ABS点刹制动               
         hehc_bl=0;led=1;               //刹车口为1后清霍尔变量内存再关刹车灯
         pwmal=0;pwmbl=0;pwmcl=0;       //点刹后要关闭所有下桥防止刹车松开后车推不动
    for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)//以下几句刹车后软启动,减少刹车后高速冲击
	   {he_gzjc();pwm_out();}
	 }
   //---------------
  }
} 
//*******************欠压检测函数**************************************************
void qy_jc(void)
{ //连续3次测量电池电压抗干扰
  set_p15_adc();
  get_ad_dy();                   //第1次测量电池电压
  if(adc_data<=158)                //电压小于等于3.1v吗,不等于直接退出
   {TR0=0;TR1=0;led=1;             //小于等于,电池电压过低,关PWM频率保护电池
    pca_pwm0=0x03;                 //关3路PWM信号
    pca_pwm1=0x03;                 //
    pca_pwm2=0x03;                 //
    pwmal=0;pwmbl=0;pwmcl=0;       //关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,霍尔变化存入新的数据到变量中
   he_cs_sj1=hehc;he_cs_bz1=1;
   if(he_cs_bz1==1){he_cs_sj2=hehc;he_cs_bz2=1;}
   if(he_cs_bz2==1){he_cs_sj3=hehc;he_cs_bz3=1;}
  //----------------------------------------
   if(he_cs_bz1==1)
     {if(he_cs_bz2==1)
       {if(he_cs_bz3==1)
         {if(he_cs_sj1&he_cs_sj2&he_cs_sj3!=0x00)
            {zs_js++;he_cs_bz1=0;he_cs_bz2=0;he_cs_bz3=0;}
         }
       }
     }
//--------------------
  }

}
//**********电流自动调整函数******************************************************
void dl_tz(void)
{ set_p17_adc();
  do
   {get_ad_dy();}
  while(adc_data>=20);
   {pwm_bls=adc_data*10+pwm_bl;
    if(pwm_bls>=241){pwm_bls=241;}
    he_gzjc();pwm_out();zb_fx();dgdz();
   }
  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();
     }     //语句体,调霍尔分析函数,调PWM输出函数
   sc_stop();                   //调刹车断电检测函数
  }
  //-----------------------
 }
}
//********************************************************************************

⌨️ 快捷键说明

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