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

📄 无刷0621.lst

📁 采用stc12c5404ad的51系列内核无刷控制器程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 189   3          }
 190   2      	 else
 191   2      	 {dz_bz1=0;zs_ds_js=0;zs_js=0;zs_bl=zs_js;
 192   3           TH1=0X3C;TL1=0X0B;TR1=0;
 193   3           TH0=0X3C;TL0=0X0B;TR0=1;
 194   3          }
 195   2         }
 196   1      	else
 197   1      	{TR0=1;}
 198   1       }
 199          //********************定时器1中断函数*********************************************
 200          void time1(void)interrupt 3
 201           { TR1=0;TH1=0x3c;TL1=0x0b;
 202   1         timejs++;
 203   1         if(timejs==12)           //中断次数等于给定的次数就取反LED
 204   1           {if(zbyx_bz==0)        //转把归0标志为0,可以闪灯
 205   2            {led=~led;timejs=0;TR1=1;}
 206   2      	  }
 207   1      	if(timejs==80)
 208   1      	{if(dz_bz1==1)
 209   2      	 {TR0=0;dz_bz1=0;dz_bz=1;zs_ds_js=0;zs_js=0;timejs=0;}
 210   2      	 else
 211   2      	 {dz_bz=0;zs_ds_js=0;zs_js=0;timejs=0;}
 212   2      	}
 213   1         TR1=1;
 214   1       }
 215          //*******************电机堵转转函数***********************************************
 216          //根据2S定时内一直堵转的话置DZ_BZ为1,本函数检测到该标志为1立即关闭所有输出
 217          //并闪烁指示灯间隔快闪2次提示,最后监控转把归0后可以退出本函数重新启动
 218          void dgdz(void)
 219          {
 220   1        while(dz_bz1==1)
 221   1       {pwm_bls=170;he_gzjc();pwm_out();  
 222   2      if(dz_bz==1)
 223   2       { TR0=0;TR1=0;
 224   3         pca_pwm0=0x03;                 //关3路PWM信号
 225   3         pca_pwm1=0x03;                 //
 226   3         pca_pwm2=0x03;                 //
 227   3         pwmal=0;pwmbl=0;pwmcl=0;       //关3路下桥
 228   3         set_p13_adc();                 //电机进入保护后开始等待转把归零后可以重新启动
 229   3       do{ledcs=2;led_k();get_ad_dy();} //间隔开闪2次提示堵转保护,测量转把电压是否归0
 230   3       while(adc_data>=61);             //没有归0执行DO循环体语句
 231   3         led=1;dz_bz=0;dz_bz1=0;                 //转把归0后关指示灯清堵转标志
 232   3       }
 233   2       }
 234   1      }
 235          //********************外中断0函数限流或康铜开路************************************
 236          void intt0()interrupt 0 
 237          {
 238   1        TR0=0;TR1=0;                         //关PWM频率
 239   1        pca_pwm0=0x03;                 //关3路PWM信号
 240   1        pca_pwm1=0x03;                 //
 241   1        pca_pwm2=0x03;                 //
C51 COMPILER V6.12  _轤_0621                                                               06/28/2005 07:25:16 PAGE 5   

 242   1        pwmal=0;pwmbl=0;pwmcl=0;       //关3路下桥
 243   1        set_p13_adc();
 244   1        get_ad_dy();
 245   1        while(adc_data>=61)
 246   1        {ledcs=4;led=0;get_ad_dy();}
 247   1        led=1;
 248   1      }
 249          //********************PWM驱动桥驱动输出函数****************************************
 250          void pwm_out(void)   //入口:pwm_bl里有转把调速参数.出口:输出全桥驱动信号
 251          { 
 252   1        switch(hehc)                               //多分支语句根据霍尔位置输出对应节拍
 253   1        {case  0x01:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
 254   3               ccap0h=pwm_bls;pwmcl=1;pca_pwm0=0x00;break;}  //第1拍ccap0h刷新参数开C下桥A上桥
 255   2             //-------------------------------------------------------------
 256   2         case  0x03:{pca_pwm0=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
 257   3               ccap1h=pwm_bls;pwmcl=1;pca_pwm1=0x00;break;}  //第2拍ccap1h刷新参数开C下桥b上桥
 258   2             //-------------------------------------------------------------    
 259   2         case  0x02:{pca_pwm0=0x03;pca_pwm2=0x03;pwmbl=0;pwmcl=0;
 260   3               ccap1h=pwm_bls;pwmal=1;pca_pwm1=0x00;break;}  //第3拍ccap1h刷新参数开a下桥b上桥
 261   2             //-------------------------------------------------------------  
 262   2         case  0x06:{pca_pwm0=0x03;pca_pwm1=0x03;pwmbl=0;pwmcl=0;
 263   3               ccap2h=pwm_bls;pwmal=1;pca_pwm2=0x00;break;}  //第4拍ccap2h刷新参数开a下桥c上桥
 264   2             //-------------------------------------------------------------  
 265   2         case  0x04:{pca_pwm0=0x03;pca_pwm1=0x03;pwmal=0;pwmcl=0;
 266   3               ccap2h=pwm_bls;pwmbl=1;pca_pwm2=0x00;break;}  //第5拍ccap2h刷新参数开b下桥c上桥
 267   2             //-------------------------------------------------------------  
 268   2         case  0x05:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmcl=0;
 269   3               ccap0h=pwm_bls;pwmbl=1;pca_pwm0=0x00;break;}  //第6拍ccap0h刷新参数开b下桥a上桥     
 270   2        }
 271   1      }
 272          
 273          //********************上电初始化函数**********************************************
 274          void sd_csh(void)
 275          {P1=0xff;zb=0;P2=0xff;P3=0xff;
 276   1       pwmal=0;                        //上电复位后首先关闭3组下桥
 277   1       pwmbl=0;                        //
 278   1       pwmcl=0;                        //
 279   1       adc_power();                    //调AD转换用初始化函数
 280   1       pwm_sz();                       //调PWM输出用初始化函数
 281   1       time_csh();                     //调两个定时器初始化函数
 282   1      }
 283          //********************上电防飞车函数归0后LED正常闪烁******************************
 284          void sd_ffc(void)
 285          {
 286   1       set_p13_adc();                  //调转把电压转换通道 
 287   1       get_ad_dy();                    //上电后测量转把电压是否归零
 288   1       while(adc_data>=61)              //61为1.2V转换值转把如果大于1.2V执行循环体语句等待归0 
 289   1          {ledcs=2;led_k();            //循环体语句,2次间隔性快闪灯
 290   2           get_ad_dy();                //循环体语句,重新检测电压等待归0
 291   2          }
 292   1       TR0=0;                          //关PWM频率否则干扰闪灯
 293   1       timebj=12;                      //归0后定时器中断10次闪烁一次LED
 294   1       TR1=1;                          //归0后开定时器1-LED闪烁
 295   1      }
 296          //*************刹车函数自动选择是断电还是ABS刹车功***************************
 297          void sc_stop(void)    //ABS刹车有外接口对地选择,对地时为ABS功能
 298          { 
 299   1        if(shache==0)                     //判断语句刹车口等于0执行大语句1
 300   1        {  abs=1;                           
 301   2          //大语句体1
 302   2          if(abs==1)                      //判断ABS选择不为0就执行普通刹车断电,否则执行ABS刹车
 303   2      //==========普通刹车断电==================================================
C51 COMPILER V6.12  _轤_0621                                                               06/28/2005 07:25:16 PAGE 6   

 304   2          {
 305   3           TR0=0;led=0;                   //关测速定时器,亮刹车灯
 306   3           pca_pwm0=0x03;                 //关3路PWM信号AH
 307   3           pca_pwm1=0x03;                 //关3路PWM信号BH
 308   3           pca_pwm2=0x03;                 //关3路PWM信号CH
 309   3           pwmal=0;pwmbl=0;pwmcl=0;       //关3路下桥
 310   3           //----------------------------------------------------------------------
 311   3           while(shache==0)               //循环语句,刹车口没松开就一直等待
 312   3            {delay(500);}                 //语句体,延时抗干扰防止抖动
 313   3           hehc_bl=0;led=1;               //刹车口松开后清霍尔变量内存再关刹车灯
 314   3           //----------------------------------------------------------------------
 315   3           for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--) //以下两句为刹车口松开后减缓冲击
 316   3      	   {he_gzjc();pwm_out();}                    //从最低速度加高到实时的转把设定速度  
 317   3          }
 318   2      //===========EABS刹车断电=====================================================
 319   2          else                            //ABS功能已选择进入ABS刹车
 320   2          {                               //
 321   3      	    TR0=0;led=0;                 //关测速定时器,亮刹车灯
 322   3             pca_pwm0=0x03;               //关3路PWM信号AH
 323   3             pca_pwm1=0x03;               //关3路PWM信号BH
 324   3             pca_pwm2=0x03;               //关3路PWM信号CH
 325   3             pwmal=0;pwmbl=0;pwmcl=0;     //关闭3个下桥:AL-BL-CL
 326   3          //-------------------------------------------------------------------------
 327   3           do                             //do-while语句先执行do再执行while判断表达式
 328   3            {
 329   4              for(h=100;h>0;h--)         //每检测一次没松开就先执行1万次ABS点刹,防止刹车抖动干扰
 330   4               { pwmal=0;pwmbl=0;pwmcl=0;
 331   5                 delay1(1);
 332   5                 pwmal=1;pwmbl=1;pwmcl=1; //ABS点刹
 333   5                 delay1(80);
 334   5               }
 335   4            } 
 336   3           while(shache==0);               //内镶循环语句,只要刹车没松开就一直开ABS点刹制动               
 337   3               hehc_bl=0;led=1;               //刹车口为1后清霍尔变量内存再关刹车灯
 338   3               pwmal=0;pwmbl=0;pwmcl=0;       //点刹后要关闭所有下桥防止刹车松开后车推不动
 339   3          for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)//以下几句刹车后软启动,减少刹车后高速冲击
 340   3      	   {he_gzjc();pwm_out();}
 341   3      	 }
 342   2         //---------------
 343   2        }
 344   1      } 
 345          //*******************欠压检测函数**************************************************
 346          void qy_jc(void)
 347          { //连续3次测量电池电压抗干扰
 348   1        set_p15_adc();
 349   1        get_ad_dy();                   //第1次测量电池电压
 350   1        if(adc_data<=158)                //电压小于等于3.1v吗,不等于直接退出
 351   1         {TR0=0;TR1=0;led=1;             //小于等于,电池电压过低,关PWM频率保护电池
 352   2          pca_pwm0=0x03;                 //关3路PWM信号
 353   2          pca_pwm1=0x03;                 //
 354   2          pca_pwm2=0x03;                 //
 355   2          pwmal=0;pwmbl=0;pwmcl=0;       //关3路下桥
 356   2        do{ledcs=3;led_k();get_ad_dy();} //闪灯提示重新测量电压
 357   2          while(adc_data<=175);          //检测是否恢复到正常电压44V
 358   2          ledcs=3;led_k();               //电压恢复44V以上再闪灯做为延时用     
 359   2          hehc_bl=0;                     //清霍尔旧数据为了起动
 360   2         }
 361   1      }
 362          //*******************霍尔故障检测函数**********************************************
 363          void he_gzjc(void)
 364          {  
 365   1      hehc=P1&0x07;               //读入霍尔数据,并分离有效数据
C51 COMPILER V6.12  _轤_0621                                                               06/28/2005 07:25:16 PAGE 7   

 366   1      //--查霍尔是否全1--------
 367   1      while(hehc==0x07)           //判断是否为3个全1,成立循环执行语句体
 368   1        {pca_pwm0=0x03;           //霍尔出现故障关闭所有输出
 369   2         pca_pwm1=0x03;           //
 370   2         pca_pwm2=0x03;           //
 371   2         pwmal=0;pwmbl=0;pwmcl=0; //
 372   2         TR0=0;zs_ds_js=0;zs_js=0;    //关测速定时器,定时计数器清0,转速度计数器清0
 373   2      	ledcs=6;led_k();   //循环执行语句体6次闪烁,直到不成立退出
 374   2         hehc=P1&0x07;            //重新检测霍尔
 375   2        }
 376   1      //--查霍尔是否全0--------
 377   1      while(hehc==0x00)           //不为3个1再判断是否为3个0,成立执行循环语句体
 378   1        {pca_pwm0=0x03;           //霍尔出现故障关闭所有输出
 379   2         pca_pwm1=0x03;           //
 380   2         pca_pwm2=0x03;           //
 381   2         pwmal=0;pwmbl=0;pwmcl=0; //
 382   2         TR0=0;zs_ds_js=0;zs_js=0;    //关测速定时器,定时计数器清0,转速度计数器清0
 383   2      	ledcs=6;led_k();   //循环执行语句体6次闪烁,直到不成立退出
 384   2         hehc=P1&0x07;            //重新检测霍尔
 385   2        }

⌨️ 快捷键说明

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