智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 865|回复: 0
打印 上一主题 下一主题

调节速度P和I会对车子有影响,但车还是会往一个方向走,求大神帮忙,

[复制链接]

2

主题

5

帖子

0

精华

高级会员

Rank: 4

积分
513
QQ
威望
227
贡献
136
兑换币
145
注册时间
2014-9-11
在线时间
75 小时
毕业学校
南昌工程学院
跳转到指定楼层
1#
发表于 2015-6-1 16:23:29 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
/********************************************/
//函数 : 数度控制
//名称 : SpeedControl();
//
/*********************************************/
void SpeedControl(void)
{
     float fP;
     float fI;
     int fDelta1=0;
     int fDelta;
  //   CarSpeed=(Left+Right)/2;
     CarSpeed = Left;
     Left=Right=0;
  //   CarSpeed*=2;
     fDelta=0;
     
    fDelta=fDelta1-CarSpeed;
     SPEED_P =0.5;
     fP=fDelta*SPEED_P;
     SPEED_I=0;
     fI=fDelta*SPEED_I;
     Speedlast+=fI;
     if(Speedlast<-50){
        Speedlast=-50;
     }
     if(Speedlast>50){
        Speedlast=50;
     }
     SpeedOld=SpeedNew;
     SpeedNew=fP+Speedlast;
     LCD_write_english_string(0,0,"SO");
     LCD_Write_Num(20,0,SpeedOld,5);  
     LCD_write_english_string(0,4,"SN");
     LCD_Write_Num(20,4,SpeedNew,5);   
}
/*****************************************/
//函数 : 速度平滑输出
//名称 : Speedput(void);
//
/******************************************/
void Speedput(void)
{
     float fValue;
     fValue=SpeedNew-SpeedOld;
     SpeedOut=fValue*(SpeedPeriod+1)/100+SpeedOld;
     LCD_write_english_string(0,2,"SO");
     LCD_Write_Num(20,2,SpeedOut,5);
}
/**********************************************/
//函数 : 电机驱动函数
//名称 : void SetMotorVoltage(float fLeftVoltage,float fRightVoltage)
//
/**********************************************/
void SetMotorVoltage(float fLeftVoltage,float fRightVoltage)
{   
    if(fLeftVoltage>0){
      if(fLeftVoltage>255){fLeftVoltage=255;}
      PWMDTY67=(int)fLeftVoltage;
      PWMDTY45=0;
    }
   else if(fLeftVoltage<0){
      fLeftVoltage=-fLeftVoltage;
      if(fLeftVoltage>255){fLeftVoltage=255;}
      PWMDTY67=0;
      PWMDTY45=(int)fLeftVoltage;
      }
  if(fRightVoltage>0){
      if(fRightVoltage>255){fRightVoltage=255;}
      PWMDTY23=(int)fRightVoltage;
      PWMDTY01=0;
      }
   else if(fRightVoltage<0){
      fRightVoltage=-fRightVoltage;
      if(fRightVoltage>255){fRightVoltage=255;}
      PWMDTY23=0;
      PWMDTY01=(int)fRightVoltage;
   }
}
/**********************************************/
// 函数 : 电机输出函数
// 名称 : Mtorput();
//
/**********************************************/
void Motorput(void)
{
     float fLeft,fRight;
     if(AngleOut>0){
        fLeft=AngleOut+SpeedOut/*-DirectionOut*/;
        fRight=AngleOut+SpeedOut/*+DirectionOut*/;      
              }
    if(AngleOut<0){
        fLeft=AngleOut-SpeedOut/*-DirectionOut*/;
        fRight=AngleOut-SpeedOut/*+DirectionOut*/;
              }
    LeftOut=fLeft;
    RightOut=fRight;
    SetMotorVoltage(LeftOut,RightOut);
    LCD_write_english_string(0,1,"LO");
    LCD_Write_Num(20,1,LeftOut,5);
  }
/***********************************************/
// 函数 : 主函数
// 名称 : main();
//
/***********************************************/   
void main(void)
{
      DisableInterrupts;
      PLL_INIT();
      init_pwm();
    //  PORT_INIT();
      ATD_INIT();
      PIT_INIT();
      PACNT_INIT();
      PORT_Init();
      LCD_clear();
       LCD_init();
      EnableInterrupts;
      for(;;)
      {
      
      }
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED   
interrupt VectorNumber_Vpit0 void PIT_ISR(void)
{
    PITTF_PTF0=1;
    SpeedPeriod++;
    Speedput();
//   DirectionPeriod++;
//   Directionput();
    count = count+1;
    if(count==1){       //脉冲计数
       TIM1_init();
     //  LeftPulse=PACNT;
        LCD_write_english_string(0,5,"LP");
       LCD_Write_Num(20,5,LeftPulse,5);
    }
    else if(count==2){  //AD采集
      
      // TIM2_init();
       ATD_capture();
    }
    else if(count==3){   //角度计算与直立
    //   RightPulse=PACNT;
       AngleCalculate();
       AngleControl();
       Motorput();
    }
    else if(count==4){   //速度控制
         SpeedCount++;
         Left+=LeftPulse;
      //   Right+=RightPulse;
         Right+=LeftPulse;
         if(SpeedCount>=10){
            SpeedControl();
            SpeedCount=0;
            SpeedPeriod=0;
         }
    }
    else if(count==5){
      
        count=0;
    }
}
#pragma CODE_SEG DEFAULT  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-9 00:57 , Processed in 0.043342 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表