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

📄 无刷0621.c

📁 采用stc12c5404ad的51系列内核无刷控制器程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//===================================================================================================
#include<reg51.h>                //包含文件预处理命令
#define uchar unsigned char      //8位单片机习惯性定义
#define uint unsigned int        //8位单片机习惯性定义
//
//*********AD转换要用到的特殊寄存器地址定义*************************************
sfr  adc_contr=0xc5;             //定义AD转换控制寄存器地址    
sfr  adc_data=0xc6;              //定义AD转换结果寄存器地址
sfr  p1m0=0x91;                  //带有8路AD的P1口模式选择寄存器0定义地址
sfr  p1m1=0x92;                  //带有8路AD的P1口模式选择寄存器1定义地址
//
//*********PWM输出要用到的特殊寄存器地址定义************************************
sfr  ccap0h=0xfa;                //PCA模块0捕捉/比较寄存器高8位
sfr  ccap1h=0xfb;                //PCA模块1捕捉/比较寄存器高8位
sfr  ccap2h=0xfc;                //PCA模块2捕捉/比较寄存器高8位
sfr  ccap3h=0xfd;                //PCA模块3捕捉/比较寄存器高8位
sfr  pca_pwm0=0xf2;              //PCA模块0-PWM寄存器
sfr  pca_pwm1=0xf3;              //PCA模块1-PWM寄存器
sfr  pca_pwm2=0xf4;              //PCA模块2-PWM寄存器
sfr  pca_pwm4=0xf5;              //PCA模块3-PWM寄存器
sfr  ccapm0=0xda;                //PCA模块0工作模式寄存器
sfr  ccapm1=0xdb;                //PCA模块1工作模式寄存器
sfr  ccapm2=0xdc;                //PCA模块2工作模式寄存器
sfr  ccapm3=0xdd;                //PCA模块3工作模式寄存器
sfr  ch=0xf9;                    //PCA计数器高8位
sfr  cl=0xe9;                    //PCA计数器低8位
sfr  ccon=0xd8;                  //PCA控制寄存器
sfr  cmod=0xd9;                  //PCA工作模式寄存器
sbit cr=ccon^6;                  //PCA计数器控制位,1开0关
sbit epca_lvd=IE^6;              //PCA中断允许控制位1开0关
sfr  auxr=0x8E;                  //定时器工作于1T控制位
//==============================================================================
sbit zb=P1^3;
sbit pwmal=P2^3;                 //A相下桥驱动定义
sbit pwmbl=P2^2;                 //B相下桥驱动定义
sbit pwmcl=P2^1;                 //C相下桥驱动定义
sbit led=P2^7;                   //指示灯定义
sbit abs=P2^5;                   //ABS刹车功能选择口,对地为ABS功能
sbit shache=P3^0;                //刹车口定义,对地刹车
sbit fd=P3^3;                    //防盗检测口定义
int ledcs;                       //定义一个指示灯闪灯次数变量
static fd_hej; 
static timebj;                   //定义一个定时器计数比较变量
static timejs;                   //定义一个定时器中断计数次数变量
static pwm_bl;                   //PWM输出变量
static zs_bl=20;                  //pwm旧的变量数据,备份的
static pwm_bls;                  //PWM软启动加速用变量
static shache_bz;                //刹车后该标志置1供软启动使用
static hehc;                     //霍尔数据暂存区
static hehc_bl;                  //上相霍尔数据暂存区,用于检测霍尔变化
static dz_bz;                  //堵转标志,为1堵转
static dz_bz1;
static zbyx_bz;                  //转把有效标志,归0时为0,行驶时为1有效
static ds_bf=10;                    //转把上次的数据备份
static zs_js;                      //转速数据
static zs_ds_js;
static he_cs_bz1;
static he_cs_bz2;
static he_cs_bz3;
static he_cs_sj1;
static he_cs_sj2;
static he_cs_sj3;
int qy_1,qy_2,qy_3;              //欠压测量暂存区1,2,3
int cs1,cs2,cs3,cs_fx;           //电机测速全局变量
static qy_bf;                    //欠压上次的数据备份 
int h;                           //ABS刹车用变量
int dz;
int dz2;  
void zb_fx(void);
void he_gzjc(void);
void pwm_out(void); 
                  
//*********************AD转换后PWM对照表*****************************************
uchar code pwmout[256]=
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,//60个1为1.3v以下
//------------------------------------------------------------------------------------------
 241,239,237,235,233,231,229,227,225,223,221,219,217,215,213,211,209,207,205,203,
 201,199,197,195,193,191,189,187,185,183,181,179,177,175,173,171,169,167,165,163,
 161,159,157,155,153,151,149,147,145,143,141,139,137,135,133,131,129,127,125,123,//60
 121,119,117,115,113,111,109,107,105,103,101,99,97,95,93,91,89,87,85,83,81,79,77,//23
 75,73,71,69,67,65,63,61,59,57,55,53,51,49,47,46,45,44,43,42,41,40,39,38,37,36,//26
 35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,//26
 9,8,7,6,5,4,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,//34 //25个0为4.1--4.5v
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1};       //26个为4.5V以上
//*********************1MS延时函数***********************************************
void delay(int t)
{ 
  int i,j;
  for(i=0;i<t;i++)
   for(j=0;j<250;j++)
   ;
}
//*********************ABS刹车延时函数***********************************************
void delay1(int t)
{ 
  int i,j;
  for(i=0;i<t;i++)
   for(j=adc_data;j>0;j--)
   {}
}
//*********************设置AD电源和开漏函数**************************************
adc_power()
{
  adc_contr|=0x80;               //开AD电源
  delay(2);                      //首次开AD电源要延时1MS左右
  p1m0|=0x88;                    //设置P1.3和P1.7为开漏即AD转换模式
  p1m1|=0x88;                    //同上
}
//-------------------设置P1.3为转把测量通道函------------------------------------
set_p13_adc()
{ zb=1;
  adc_contr=0xe3;                //P13口为转换通道
}
//-------------------设置P17为电机超载测量通道函数--------------------------------
set_p17_adc()
{
  adc_contr=0xe7;
}
//------------------设置P15为欠压检测测量通道-------------------------------------
set_p15_adc()
{adc_contr=0xe5;}
//===================测量电压函数=================================================
get_ad_dy()
{ int adon=0;                    //定义一个整型变量用于检测AD转换是否结束
  adc_data=0;                    //AD转换结果寄存器清0
  adc_contr|=0x08;               //转换位置1启动转换
  while(adon==0)                 //循环判断表达式成立反复执行语句,不成立退出
   {adon=adc_contr&0x10;}        //循环语句体,即判断AD转换是否完成,完成后高第4位为1
  adc_contr&=0xe7;               //循环语句退出转换完成,清adc_flag,adc_start,停止转换
}
//********************PWM初始化函数***********************************************
pwm_sz()
{
   cmod=0x82;                    //PCA在空闲模式下停止PCA计数器工作
                                 //PCA时钟源为1/2溢出
                                 //禁止PCA计数器溢出中断
   ccon=0x00;                    //禁止PCA计数器工作,清除中断标志和计数器溢出标志
   cl=0x00;                      //清0计数器
   ch=0x00;
//======================以下为4路PWM输出设置程序=============================
//设置模块0为8位PWM输出模式,PWM无需中断支持,,脉冲在P3.7口输出
   ccapm0=0x42;                  //***程序核心语句,-----0100,0010
   pca_pwm0=0x03;                //先关闭PWM-输出为0,写入0x00就可开PWM输出
//设置模块1为8位PWM输出模式,PWM无需中断支持,,脉冲在P3.5口输出
   ccapm1=0x42;                  //***程序核心语句,-----0100,0010
   pca_pwm1=0x03;                //先关闭PWM-输出为0,写入0x00就可开PWM输出
//设置模块2为8位PWM输出模式,PWM无需中断支持,,脉冲在P2.0口输出
   ccapm2=0x42;                  //***程序核心语句,-----0100,0010
   pca_pwm2=0x03;                //先关闭PWM-输出为0,写入0x00就可开PWM输出
//模块3未用
   epca_lvd=1;                   //开PCA中断
   EA=1;                         //开总中断
   cr=1;                         //开PCA计数器打开
}
//********************快闪灯函数***********************************************
led_k()
   { int k;                      //定义一个临时变量
     for(k=0;k<ledcs;k++)        //表达式2条件不满足即次数未到重复执行循环体语句
     {led=0;delay(700);
      led=1;delay(700);}
     delay(2000);
   }
//********************定时器0和1初始化函数*******************************************
time_csh()
{ 
   TMOD=0x11;                   //定时器0工作于8位自动重装,1工作于方式1
   TH0=0x3c;                    //
   TL0=0x0b;
   TH1=0x3c;                    //12MHZ时50MS数据,20次为1S
   TL1=0x0b;
   IT0=1;                       //设置外中断0为下降沿触发358第一脚
   EX0=1;                       //开外中断0
   EA=1;                        //开总中断
   ET0=1;                       //开定时期0中断
   ET1=1;                       //开定时期1中断
}
//********************定时器0中断函数PWM频率用************************************
void time0(void)interrupt 1
 {TR0=0;TH0=0x3c;TL0=0x0b;
  zs_ds_js++;
  if(zs_ds_js==10)
   {if(zs_js<20)
    {  
     dz_bz1=1;zs_ds_js=0;zs_js=0;
     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=170;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;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;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;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;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;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;break;}  //第6拍ccap0h刷新参数开b下桥a上桥     
  }
}

//********************上电初始化函数**********************************************
void sd_csh(void)
{P1=0xff;zb=0;P2=0xff;P3=0xff;

⌨️ 快捷键说明

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