您当前的位置:五五电子网电子知识单片机-工控设备PIC单片机PIC单片机控制的电动自行车驱动系统(C程序) 正文
PIC单片机控制的电动自行车驱动系统(C程序)

PIC单片机控制的电动自行车驱动系统(C程序)

点击数:7770 次   录入时间:03-04 11:41:32   整理:http://www.55dianzi.com   PIC单片机
                                 //上语句
  off=1;     //置复位标志
  }
}
//---------欠保护子程序-------------------
void POWER()
{
 char x;
 lowpower=0;
 voltage>>=1;     //电压值换为7位,以利于单字节运算
 if(voltage<VOLOFF) {   //电池电压小于3*k(V)时保护
  ADIE=0;
  INTE=0;
  TMR1ON=0;
  CCPR1L=FULLDUTY;
  for(;ADGO==1;)continue;
  ADIF=0;
  CHS0=0;CHS1=1;
  x=1;
 DELAY1(x);
  do{ADGO=1;
    for(;ADIF==0;)continue;
    ADIF=0;
    voltage=(ADRESH>>1);
    CCPR1L=FULLDUTY;
   asm("CLRWDT");
   }while(voltage<VOLON); //电池电压小于35 V时继续保护
   off=1;     //置复位标志
    }
}
//------------电流环运算子程序-----------------
void CURPI()
{ static int curep=0x00,curek=0x00,curuk=0x00;
 union data{int pwm;
  char a[2];}b;   //定义电流环运算寄存器
 curpid=0;     //清电流运算标志
 curep=curek*CURB;   //计算上一次偏差与比例系数的积
 if(currenth<2)currenth=2;  //如果采样电流为零,则认为有一个小电流以利于
 //使转速下降
 currenth>>=1;
 curek=gcur-currenth;   //计算本次偏差
 curuk=curuk+curek*CURA-curep;  //按闭环PI运算方式得到本次输出结果,下
 //面对结果进行处理
 if(curuk<0x00) {    //如果输出小于零,则认为输出为零
   curuk=0;CCPR1L=FULLDUTY;CCP1X=0;CCP1Y=0; 
   } 
 else if(curuk-THL>=0) { //如果输出大于限幅值,则输出最大电压
    curuk=THL;CCPR1L=0;CCP1X=0;CCP1Y=0;
   }
 else {    //否则,按比例输出相应的高电平时间到CCPR1寄存器
     b.pwm=THL-curuk;
     b.pwm<<=1;
      CCPR1L=b.a[1];  //CCPR1L=(b.pwm>>8)&0x0ff;将PWM寄存器的高半字节
      if(b.pwm&0x80!=0) CCP1X=1;
      else CCP1X=0;
      if(b.pwm&0x40!=0) CCP1Y=1;
      else CCP1Y=0;
 }
}
//---------------转速环运算子程序-----------------------
void SPEPI()
{ static int speep=0x00,speek=0x00,speuk=0x00;
 int tsh1,speed1;    //转速寄存器定义
  spepid=0;     //清转速运算标志  
 if(spe==1) speed1=0x00;  //若转速太低,则认为转速为零
 else speed1=0x7f-speed;  //否则计算实际转速
 if(speed1<0) speed1=0;
 speep=speek*SPEB;
 tsh1=tsh-0x38;    //得到计算用的手柄值
 speek=tsh1-speed1;
 if(tsh1<0) {speuk=0;gcur=0;} //当手柄值低于1.1 V时,则认为手柄给定为零
 else {      //否则,计算相应的转速环输出
  if(tsh1>=GSPEH)   //限制最大转速
  tsh1=GSPEH;
  speuk=speuk+speek*SPEA-speep; //计算得转速环输出
  if(speuk<=0X00) {speuk=0x00;gcur=0x00;}//转速环输出处理
  else if(speuk>GCURHILO) { //转速环输出限制,即限制最大电流约12 A
   speuk=GCURHILO;gcur=GCURH;}
  else  {     //调速状态时的输出
   gcur=(speuk>>4)&0x0ff;
  }
    }
}
//-----------主程序-------------------------
main()
{
 for(;;){
  INIT877();    // 单片机 复位后,先对其进行初始化
  off=0;     //清复位标志
  for(;off==0;) {  //复位标志为零,则执行下面程序,否则复位
  if(curpid==1) CURPI(); //电流PI运算
  else if(spepid==1) SPEPI(); //转速PI运算
  else if(lowpower==1) POWER();
  else if(shutdown==1) BREAKON();
  asm("CLRWDT");
 }
  }
}
//---------中断服务子程序---------------------
#pragma interrupt_level 1
void interrupt INTS(void)

 if(RBIF==1) {RBIF=0;sample();}
 else if(ADIF==1) AD();
 else if(INTF==1) {shutdown=1;INTF=0;} //刹车中断来,置刹车标志
}

上一页  [1] [2] 


本文关键字:单片机  程序  电动自行车  PIC单片机单片机-工控设备 - PIC单片机