智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1354|回复: 2
打印 上一主题 下一主题

速度增量式PID

[复制链接]

18

主题

32

帖子

0

精华

高级会员

Rank: 4

积分
697
威望
376
贡献
195
兑换币
215
注册时间
2016-12-9
在线时间
63 小时
毕业学校
JH
跳转到指定楼层
1#
发表于 2017-4-9 12:15:20 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
int16_t  SpeedKP = 4 ;
int16_t  SpeedKI = 0 ;
int16_t  SpeedKD = 2 ;
//int16_t  SpeedPWM = 0 ;

int16_t SpeedPID(uint16_t speedCount,uint16_t AmSpeed)// 比较经典的增量式PID
{                                                 // 请参考相关PID的资料
  // 在此不做展开
  static int16_t LastSpeedCut0,LastSpeedCut1,LastSpeedCut2 ,SpeedLastPWMK ;
  int16_t  SpeedPWMKP ,SpeedPWMKI ,SpeedPWMKD,SpeedPWMK ;
  int16_t  SpeedPWMOUT;   
  int16_t  SpeedDifference0=0;
  int16_t  speedDEARE1,speedDEARE2,DSpeed ;              
  
  
  LastSpeedCut0 = (int16_t) speedCount ;
  DSpeed =(int16_t) AmSpeed ;
  
  SpeedDifference0 = DSpeed - LastSpeedCut0  ;
  
  speedDEARE1 = LastSpeedCut0 - LastSpeedCut1;
  speedDEARE2 = LastSpeedCut2+LastSpeedCut0-2*LastSpeedCut1;
  LastSpeedCut2  = LastSpeedCut1;
  LastSpeedCut1  = LastSpeedCut0;
  
  
  SpeedPWMKP = SpeedKP*SpeedDifference0;
  
  if(SpeedPWMKP>KPPLUSMAX)
  {
    SpeedPWMKP = KPPLUSMAX;
  }
  else if (SpeedPWMKP <KPNEGATIVEMAX)
  {
    SpeedPWMKP = KPNEGATIVEMAX;                       
  }
  
  
  SpeedPWMKI = SpeedKI* speedDEARE1;
  if(SpeedPWMKI > KIPLUSMAX)
  {
    SpeedPWMKI = KIPLUSMAX;
  }
  else if(SpeedPWMKI < KINEGATIVEMAX)
  {
    SpeedPWMKI = KINEGATIVEMAX;
  }
  
  SpeedPWMKD = SpeedKD* speedDEARE2;
  
  if(SpeedPWMKD > KDPLUSMAX)
  {         
    SpeedPWMKD = KDPLUSMAX;
  }
  else if(SpeedPWMKD < KDNEGATIVEMAX)
  {
    SpeedPWMKD = KDNEGATIVEMAX;
  }
  
  SpeedPWMK = SpeedPWMKD+SpeedPWMKI+SpeedPWMKP ;
  
  if(SpeedPWMK > KWPLUSMAX)
  {
    SpeedPWMK = KWPLUSMAX;
  }
  else if(SpeedPWMK < KWNEGATIVEMAX)
  {
    SpeedPWMK = KWNEGATIVEMAX;         
  }
  
  SpeedPWMOUT = SpeedLastPWMK + SpeedPWMK;
  if(SpeedPWMOUT < 0 )
  {
    SpeedPWMOUT = 0 ;
  }
  else if(SpeedPWMOUT > KOUPLUSMAX)
  {
    SpeedPWMOUT = KOUPLUSMAX ;
  }
  SpeedLastPWMK = SpeedPWMOUT ;
  //   uart_putchar(UART0,SpeedPWMOUT);
  //   uart_putchar(UART0,SpeedPWMK);        
  return  SpeedPWMOUT ;
  
}
有采集的速度,有目标速度,但是输出的速度达不到目标速度,总是在限幅速度输出,怎么破。求大神指教。
回复

使用道具 举报

4

主题

113

帖子

0

精华

跨届大侠

过程重于结果!!!

Rank: 10Rank: 10Rank: 10

积分
6142

优秀会员奖章活跃会员奖章

威望
4638
贡献
1208
兑换币
393
注册时间
2017-2-21
在线时间
148 小时
毕业学校
浙江工业大学
推荐
发表于 2017-4-9 13:21:06 | 只看该作者
我想问的是,楼主有没有好的调参经验分享一下呗;感谢!
回复 支持 1 反对 0

使用道具 举报

32

主题

3009

帖子

0

精华

杰出人士

学期班的来卖萌?

Rank: 12Rank: 12Rank: 12

积分
14832

在线王奖章活跃会员奖章优秀会员奖章论坛元老奖章资源大师奖章

威望
5952
贡献
3172
兑换币
4257
注册时间
2013-11-26
在线时间
2854 小时
2#
发表于 2017-4-9 13:13:27 | 只看该作者
这变量命名,肯定过不了code review
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 19:44 , Processed in 0.134868 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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