OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6163|回复: 5

平衡小车PID控制程序,有看懂的大神,可以给我详细解释下吗?谢谢

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-5-30
在线时间
0 小时
发表于 2015-5-30 11:51:21 | 显示全部楼层 |阅读模式
5金钱

名称:void pid(float angle, float angle_dot)
功能:PID运算
输入参数:
     float angle     倾斜角度
  float angle_dot 倾斜角速度
输出参数:无
返回值:  无
**************************************************/
void pid(float angle, float angle_dot)
{
  u32 temp;
  u16 sl, sr;

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;

  now_error = set_point - angle;

  speed_filter();

  speed *= 0.7;
  speed += speed_out * 0.3;
  position += speed;
  position -= speed_need;
 
  if(position < -60000)
  {
    position = -60000;
  }
  else if(position > 60000)
  {
    position =  60000;
  }
 
  rout = proportion * now_error + derivative * angle_dot - position * integral2 - derivative2 * speed;
 
  speed_l = -rout + turn_need_l;
  speed_r = -rout + turn_need_r;
 
  if(speed_l > MAX_SPEED) 
  {
    speed_l = MAX_SPEED; 
  }
  else if(speed_l < -MAX_SPEED) 
  {
 speed_l = -MAX_SPEED;
  }

  if(speed_r > MAX_SPEED) 
  {
    speed_r = MAX_SPEED; 
  }
  else if(speed_r < -MAX_SPEED) 
  {
 speed_r = -MAX_SPEED;
  }
 
  if(speed_l > 0)
  {
    GPIO_ResetBits(GPIOB, GPIO_Pin_8);  //left fr
 sl = speed_l;
  }
  else 
  {
    GPIO_SetBits(GPIOB, GPIO_Pin_8);
 sl = speed_l * (-1);
  }

  if(speed_r > 0)
  {
    GPIO_SetBits(GPIOA, GPIO_Pin_3);  //right fr
 sr = speed_r;
  }
  else 
  {
    GPIO_ResetBits(GPIOA, GPIO_Pin_3);
 sr = speed_r * (-1);
  }
 
  temp = 1000000 / sl;
  if(temp > 65535)
  {
    sl = 65535;
  }
  else
  {
    sl = (u16)temp;
  }
   
  temp = 1000000 / sr;
  if(temp > 65535)
  {
    sr = 65535;
  }
  else
  {
    sr = (u16)temp;
  } 

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = sl - 1;  // (Period + 1) * (Prescaler + 1) / 72M = 1ms 
  TIM_TimeBaseStructure.TIM_Prescaler = 30 - 1; 
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 

  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = sl >> 1;

  TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //PB9  left

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = sr - 1;   
  TIM_TimeBaseStructure.TIM_Prescaler = 30  - 1; 
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 

  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = sr >> 1;

  TIM_OC3Init(TIM2, &TIM_OCInitStructure);  //PA2 right 
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-5-30 18:08:45 | 显示全部楼层
开往春天的手扶拖拉机
回复

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
发表于 2016-11-24 12:42:10 | 显示全部楼层
我也在做平衡车,程序能知道大概。方便留QQ交流吗?
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-7-5
在线时间
2 小时
发表于 2018-12-5 22:41:05 | 显示全部楼层
顶一个先
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-12-7 15:39:36 | 显示全部楼层

顶一个先
回复

使用道具 举报

21

主题

138

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-1
在线时间
52 小时
发表于 2019-7-20 22:38:21 | 显示全部楼层
可以分享完整源代码吗,谢谢
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 17:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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