OpenEdv-开源电子网

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

基于步进电机自平衡小车

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-5-15
在线时间
6 小时
发表于 2015-11-30 18:44:06 | 显示全部楼层 |阅读模式
5金钱
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;
  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  
}
这里的pid是什么意思,怎么跟正常的不一样。
我看的是kp*e+ki*e+kd*e

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2015-11-30 22:31:12 | 显示全部楼层
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-9-23
在线时间
1 小时
发表于 2016-1-11 16:37:38 | 显示全部楼层
顶一下
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-9-23
在线时间
1 小时
发表于 2016-1-15 16:18:33 | 显示全部楼层
没人解决啊
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-9-23
在线时间
1 小时
发表于 2016-1-15 16:18:48 | 显示全部楼层
顶,大家来看看啊
回复

使用道具 举报

8

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2014-9-18
在线时间
2 小时
发表于 2016-1-15 19:46:48 | 显示全部楼层
符号是由于写法不同而已,负反馈吧负号放到传函里,不就成了正反馈了吗?还有各种限幅,就构成了这个程序。
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-12-27
在线时间
8 小时
发表于 2016-1-26 21:53:49 | 显示全部楼层
帮顶
回复

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
发表于 2016-11-24 12:40:20 | 显示全部楼层
我也在做平衡车,看的程序和你的一样。

回复

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
发表于 2016-11-24 12:42:51 | 显示全部楼层
1050540045
回复

使用道具 举报

5

主题

28

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-8-8
在线时间
15 小时
发表于 2017-8-8 16:28:12 | 显示全部楼层
这个代码还有吗?
回复

使用道具 举报

5

主题

28

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-8-8
在线时间
15 小时
发表于 2017-8-8 16:28:39 | 显示全部楼层
jinhua1916 发表于 2016-11-24 12:40
我也在做平衡车,看的程序和你的一样。

程序能借我参考一下不?
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-8-8 17:14:48 | 显示全部楼层
步进电机的响应速度能做平衡车?步进电机无法瞬间加速,只能逐步加减速,否则失步。
回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-1-7
在线时间
12 小时
发表于 2017-8-8 17:17:08 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-20 11:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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