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

📄 stc5404ad无刷控制器.c

📁 采用stc12c5404ad的51系列内核无刷控制器程序
💻 C
📖 第 1 页 / 共 3 页
字号:
     TH1=0X3C;TL1=0X0B;TR1=1;
     TH0=0x3c;TL0=0x0b;TR0=1;
    // pwm_bls=200;
    }
	 else
	 {dz_bz1=0;zs_ds_js=0;zs_js=0;zs_bl=zs_js;
     TH1=0X3C;TL1=0X0B;TR1=0;
     TH0=0X3C;TL0=0X0B;TR0=1;
    }
   }
	else
	{TR0=1;}
 }
//********************定时器1中断函数*********************************************
void time1(void)interrupt 3
 { TR1=0;TH1=0x3c;TL1=0x0b;
   timejs++;
   if(timejs==12)           //中断次数等于给定的次数就取反LED
     {if(zbyx_bz==0)        //转把归0标志为0,可以闪灯
      {led=~led;timejs=0;TR1=1;}
	  }
	if(timejs==80)
	{if(dz_bz1==1)
	 {TR0=0;dz_bz1=0;dz_bz=1;zs_ds_js=0;zs_js=0;timejs=0;}
	 else
	 {dz_bz=0;zs_ds_js=0;zs_js=0;timejs=0;}
	}
   TR1=1;
 }
//*******************电机堵转转函数***********************************************
//根据2S定时内一直堵转的话置DZ_BZ为1,本函数检测到该标志为1立即关闭所有输出
//并闪烁指示灯间隔快闪2次提示,最后监控转把归0后可以退出本函数重新启动
void dgdz(void)
{
  while(dz_bz1==1)
 {pwm_bls=100;he_gzjc();pwm_out();  
if(dz_bz==1)
 { TR0=0;TR1=0;
   pca_pwm0=0x03;                 //关3路PWM信号
   pca_pwm1=0x03;                 //
   pca_pwm2=0x03;                 //
   pwmal=0;pwmbl=0;pwmcl=0;       //关3路下桥
   set_p13_adc();                 //电机进入保护后开始等待转把归零后可以重新启动
 do{ledcs=2;led_k();get_ad_dy();} //间隔开闪2次提示堵转保护,测量转把电压是否归0
 while(adc_data>=61);             //没有归0执行DO循环体语句
   led=1;dz_bz=0;dz_bz1=0;                 //转把归0后关指示灯清堵转标志
 }
 }
}
//********************外中断0函数限流或康铜开路************************************
void intt0()interrupt 0 
{
  TR0=0;TR1=0;                         //关PWM频率
  pca_pwm0=0x03;                 //关3路PWM信号
  pca_pwm1=0x03;                 //
  pca_pwm2=0x03;                 //
  pwmal=0;pwmbl=0;pwmcl=0;       //关3路下桥
  set_p13_adc();
  get_ad_dy();
  while(adc_data>=61)
  {ledcs=4;led=0;get_ad_dy();}
  led=1;
}
//********************PWM驱动桥驱动输出函数****************************************
void pwm_out(void)   //入口:pwm_bl里有转把调速参数.出口:输出全桥驱动信号
{ 
  switch(hehc)                               //多分支语句根据霍尔位置输出对应节拍
  {case  0x01:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
         ccap0h=pwm_bls;pwmcl=1;pca_pwm0=0x00;cs1=0x01;break;}  //第1拍ccap0h刷新参数开C下桥A上桥
       //-------------------------------------------------------------
   case  0x03:{pca_pwm0=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
         ccap1h=pwm_bls;pwmcl=1;pca_pwm1=0x00;cs2=0x03;break;}  //第2拍ccap1h刷新参数开C下桥b上桥
       //-------------------------------------------------------------    
   case  0x02:{pca_pwm0=0x03;pca_pwm2=0x03;pwmbl=0;pwmcl=0;
         ccap1h=pwm_bls;pwmal=1;pca_pwm1=0x00;cs3=0x02;break;}  //第3拍ccap1h刷新参数开a下桥b上桥
       //-------------------------------------------------------------  
   case  0x06:{pca_pwm0=0x03;pca_pwm1=0x03;pwmbl=0;pwmcl=0;
         ccap2h=pwm_bls;pwmal=1;pca_pwm2=0x00;cs1=0x06;break;}  //第4拍ccap2h刷新参数开a下桥c上桥
       //-------------------------------------------------------------  
   case  0x04:{pca_pwm0=0x03;pca_pwm1=0x03;pwmal=0;pwmcl=0;
         ccap2h=pwm_bls;pwmbl=1;pca_pwm2=0x00;cs2=0x04;break;}  //第5拍ccap2h刷新参数开b下桥c上桥
       //-------------------------------------------------------------  
   case  0x05:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmcl=0;
         ccap0h=pwm_bls;pwmbl=1;pca_pwm0=0x00;cs3=0x05;break;}  //第6拍ccap0h刷新参数开b下桥a上桥     
  }
}

//********************上电初始化函数**********************************************
void sd_csh(void)
{P1=0xff;zb=0;P2=0xff;P3=0xff;
 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次测量电池电压
  qy_1=adc_data;                 //保存第1次测量数据
  get_ad_dy();                   //第2次测量电池电压
  qy_2=adc_data;                 //保存第2次测量数据
  get_ad_dy();                   //第3次测量电池电压
  qy_3=adc_data;                 //保存第3次测量数据
  //比较取舍法,只有其中两次相同才有效
  if(qy_1==qy_2)                  //比较第1次和第2次结果是否相同,否转下一轮判断
     {qy_bf=qy_1;adc_data=qy_1;}  //相同的话本次测量有效有效,保存本次数据备份后直接退出IF语句           
   else                           //第1次和第2次的结果不同,
     {if(qy_2==qy_3)              //再判断第2次和第3次的结果相同吗,否转下一轮判断
      {qy_bf=qy_2;adc_data=qy_2;} //相同的话本次测量有效有效,保存本次数据备份后直接退出IF语句
     else                         //第1次和第2次的结果不同,
       {if(qy_1==qy_3)            //再判断第1次和第3次的结果相同吗,3次都不同的话取旧备份数据
        {qy_bf=qy_3;adc_data=qy_3;}////相同的话本次测量有效有效,保存本次数据备份后直接退出IF语句
        else                       //3次都不同取旧备份数据
         {adc_data=qy_bf;}
       }
     } 
  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路下桥

⌨️ 快捷键说明

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