【STM32平衡小车】平衡小车的PID环体会心得

本文详细介绍平衡车PID控制参数的调整方法,包括直立环、速度环和转向环的KP、KI、KD参数选择原则及实践技巧,适用于初学者和进阶玩家。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


2018年12月11日17:47:56更新:

平衡环:
P可增加响应速度
P过小,响应太慢,不能达到直立。
P过大,会出现大幅度的低频抖动。

D可消除P大了之后产生的大幅低频抖动。
D过大,会出现高频抖动。

速度环:
P可增加速度的响应,I和P有比例关系I=P/200.
P过小,响应慢,出现的现象是加速减速慢,迟钝。
P过大,会出现低频抖动。

转向环
P过下,转弯不及时
P过大,大幅度抖动


两个东西待解决

1、左右轮编码器之和数值输出的范围确定
2、小车转向的gyro范围确定


一、机械中值的确定

不管是那个环,小车物理人为的短时直立,这个必须要做到,不然调试任何参数,任何环都是扯。

机械中值的确定方法,通过OLED上显示的陀螺仪倾角确定,存在某一个角度是前倾和后仰的临界点,这个点对应的角度就是ZHONGZHI.

二、直立环(PD)

  • 开始调试直立环时,需要先关闭速度环和转向环。
  • 单独的直立环不足以让小车直立,最基本的环=直立环+速度环
  • 直立环代码实现

//直立环的最基本代码实现
//Angle-小车倾角 Gyro-Y 轴陀螺仪(前进方向是 MPU6050 的 X 轴的正方向,电机轴与 Y 轴平行。)
int balance(float Angle,float Gyro)
{
	float Bias,kp=300,kd=1;
	int balance;
	
	Bias=Angle-0; //计算直立偏差
	balance=kp*Bias+Gyro*kd; //计算直立 PWM
	return balance; //返回直立 PWM
}
  • 直立环的Kp范围确定

    • MiniBalance_PWM_Init(7199,0);可以知道,7200对应的占空比是100%
    • 再由PID的基本代码可知,假如设定kp=720,那么在±10°左右,电机即可实现满转。
    • 我们根据电机直立的摆幅,差不多就要≤10°,不然就抖的太厉害了。所以我们设定kp的可选范围也就限制在了≤720
  • 直立环的kp极性确定

    • 这个可以直接给kp正负值,然后放在地上观察现象, 正常出现的现象是一个负反馈,而不是出现往哪边倒就往另一边加速,致使它快速倒下,而是往要倒的方向去追(跟后面的速度环kp极性确定大同小异)。
  • 直立环的kp大下确定

    • 试参数,从小到大,响应慢慢加快, 直到出现大幅度的低频抖动选定此时的Kp,接下来进行速度环的kd确定。
  • 直立环的kd极性确定

    • kp置为0,然后给Kd正负值分别实验,当拿起小车旋转时,小车轮子没有实现跟随,这个时候说明极性是反的!
  • 直立环的kd大小确定

    • 注意,是在抖动的kp基础上,调试kd大小。依旧是从小到大实验,一直到小车出现高频的剧烈抖动

此时kp,kd同时乘上0.6,就是一组合适的直立参数,可以发现不会抖了,但是小车也仍旧不能一直保持直立,原因是单独的直立环不足以实现小车直立,还需要配合速度环。

三、速度环(PI)

  • 积分控制和比例控制的极性是相同的,且有一定的比例关系。(这里确定为200)

  • 直立小车,速度环是一种对直立环的干扰,所以我们还依旧要让直立环处于主导地位,要对速度环进行适当的低通滤波处理。

  • 直立环的基础代码实现

//输入左右轮电机编码器
int velocity(int encoder_left,int encoder_right)
{
	static float Velocity,Encoder_Least,Encoder;
	static float Encoder_Integral;
	
	float kp=80,ki=0.4;
	Encoder_Least =(Encoder_Left+Encoder_Right)-0;
	Encoder *= 0.7;
	Encoder += Encoder_Least*0.3;
	Encoder_Integral +=Encoder;
	Velocity=Encoder*kp+Encoder_Integral*ki;
	return Velocity;
}
  • 速度环的kp范围确定

    • 测速是通过 STM32 定时器的编码器接口模式对编码器进行四倍频(软件实现,提高精度),并使用 M法测速(每 10ms 的脉冲数)得到小车的速度。
    • 通过实验,实际串口输出,小车满速旋转时左右轮编码器相加可达160,假设速度偏差达到50%时满转。,160/2=80,7200/80=90,也就说kp最大为90(注意这里只是在假设50%的前提下).
  • 速度环的kp极性确定

    • 极性判断,需要先关闭直立环和转向环。
    • 要想达到直立,速度环这里正反馈,意思就是假如向前倒,那么小车就要以更快的速度向前冲,保持直立。
    • Encoder_Least =(Encoder_Left+Encoder_Right)-0;Encoder_Least -是速度偏差,(Encoder_Left+Encoder_Right)是当前速度值,0-是目标速度值,可知,当旋转其中一个轮子,两个轮子往相同方向旋转,到速度最大值。
  • 速度环的kp大小确定

    • 大小确定打开直立环。
    • kp,ki同符合且有ki=kp/200的比例关系
    • kp,ki逐步增大,直到使得小车的响应迅速稳定,即是合适的PI参数。

遥控的加入

int velocity(int encoder_left,int encoder_right)
{
	static float Velocity,Encoder_Least,Encoder,Movement;
	static float Encoder_Integral;
	
	float kp=80,ki=0.4;
	if(1==Flag_Qian) Movement=-90; //===如果前进标志位置 1 位移为负
	else if(1==Flag_Hou) Movement=90; //===如果后退标志位置 1 位移为正
	else Movement=0;
	Encoder_Least =(Encoder_Left+Encoder_Right)-0; //获取最新速度偏差==测量速度(左
	右编码器之和)-目标速度(此处为零)
	Encoder *= 0.7; //===一阶低通滤波器
	Encoder += Encoder_Least*0.3; //===一阶低通滤波器
	Encoder_Integral +=Encoder; //===积分出位移 积分时间:10ms
	Encoder_Integral=Encoder_Integral-Movement; //接收遥控器数据,控制前进后退
	if(Encoder_Integral>10000) Encoder_Integral=10000; //积分限幅
	if(Encoder_Integral<-10000) Encoder_Integral=-10000; //限制遥控最大速度
	Velocity=Encoder*kp+Encoder_Integral*ki; //===速度控制
	if(Turn_Off(Angle_Balance,Voltage)==1) Encoder_Integral=0; //电机关闭后清除积分
	return Velocity;
}


//其中Encoder_Integral=Encoder_Integral-Movement; 遥控的速度通过积分融入
速度控制器,减缓了速度突变对直立控制的影响。
//积分限幅中的最大赋值决定了小车的最大前进速度,而 Movement 值决定了小车的给定速度。

四、转向环§

  • 基本原理
    • 使用 Z 轴陀螺仪的数据作为转向速度偏差进行 P 控制,目标是保持转向速度为设定值。
  • 基本代码实现
//gyro是陀螺仪的y轴,电机方向.
int turn(int encoder_left,int encoder_right,float gyro)
{
	float Turn,Kp=1,Bias;
	
	Bias=gyro-0;
	Turn=-Bias*Kp;
	return Turn;
}
  • 直立环kp的极性判断

    • 调试小车转向环,需要关闭直立环和速度环
    • 实际通过串口观察gyro的值,我们发现它最大不过4位,根据 7200 代表占空比 100%,所以我们估算 kp 值应该在 0~2 之间。
    • 取合适的正负值实验,正常是我们把小车按在地上,旋转小车,小车会有抵抗,阻止旋转。
  • 直立环kp的大小确定

    • 逐步增加kp值,直到有走直线效果良好。

遥控功能加入

int turn(int encoder_left,int encoder_right,float gyro)
{
	float Turn,Kp=1,Bias;
	if(1==Flag_Left) Turn_Amplitude=1100;
	else if(1==Flag_Right) Turn_Amplitude=-1100;
	else Turn_Amplitude=0;
	Bias=gyro-0;
	Turn=-Bias*Kp;
	Turn+=Amplitude;
	return Turn;
}


//其中Turn+=Amplitude; 转向遥控叠加在转向控制里面。
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReCclay

如果觉得不错,不妨请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值