三天让车立起来!STM32平衡车入门PID —— 第三天(PID调参)

说明:本文章适用于STM32初学者,想完成一个好玩且有深度的项目但不知道从何下手的同学。
PID调参是平衡车的精髓所在,参数整定的好坏直接影响到平衡车的平衡效果。有的车平衡时来回晃而参数选的好的车就能稳稳地平衡在原地。可见PID调参在PID中是重中之重。我们一定要会调并且有针对性的去调。通过平衡车的例子举一反三,相信我们之后在遇到PID调参时能够从容不迫,非常迅速的找到最合适的值!!
对于一个控制系统,我们期望的响应结果是稳(系统稳定不震荡不发散)、快(系统响应快速)、准(系统静态误差小)。对PID控制器的调节结果评价也是如此。

PID系数的作用

比例系数Kp:

三个参数中的绝对主力,不可或缺。Kp增大可以加快系统响应,减小静差,但系统超调量会加大,稳定性变差。比例控制是一种立即控制,只要有偏差,就立即输出控制量。大部分系统只需要P控制即可实现基本的稳快准需求。

积分系数Ki:

三个参数中的一般主力,用于消除静差、Ki减小可以降低超调量,使系统的稳定性增强。积分控制是一种修复控制,只要有偏差,就会逐渐去往消除偏差的方向去控制。

微分系数Kd:

三个参数中的预备人员,一般不用,在反馈量噪声比较大时可能会使系统震荡。Kd增大可以加快系统响应,减小超调量,适用于迟滞系统或无阻尼系统。微分控制是一种提前控制,以偏差的变化率为基准进行控制。

基本调试方法:先比例(从中间到两边)、后积分(从0到大)、再微分(从0到大)。

所有需整定参数罗列

1.直立环(未用到I项)
Vertical_Kp——直立环P项
Vertical_Kd——直立环D项

2.速度环(未用到D项)
Velocity_Kp——速度环P项
Velocity_Ki——速度环I项

3.转向环
Turn_Kp——转向环P项
Turn_Kd——转向环D项

整定顺序:在平衡小车工程中我们先进行直立环的参数调节在进行速度环最后再加上转向环。

在PID参数整定之前我们首先要找平衡车的机械中值,所谓机械中值就是不在任何外力的干扰下,小车能够保持平衡时间最长的位置。

机械中值寻找步骤:
1.在OLED显示屏上显示对应的角度或者通过串口实时反馈角度。
2.观察角度,一只手把平衡从一个方向往另一个方向托,在其快速倒下的瞬间我们记住当前的角度值。另一个方向同理,我们将两个角度值相加除以2得到的中间值作为机械中值。(这个值往往不是0度可能是-1°、-2°、-3°或1°、2°、3°这是由小车的硬件所决定的)

直立环PID参数整定

直立环分析:直立环顾名思义就是让车别倒下,始终稳定在直立的状态,只要角度一倾斜,立马PID就要起作用通过控制电机转速来达到角度始终在机械中值位置。所以就要求小车的反应速度要快(Kp),并且要具有预测性,让其能够达到提前控制的目的(Kd)。综上分析,我们需要P项和D项而不需要I项。

直立环PD控制器:KpEk+KdEk_D

调参顺序:1️⃣Kp2️⃣Ki
1.判断参数(Kp,Kd)极性
因为我们PWM波的满占空比对应的ARR值为7200,所以我们预设一个Kp=200;这个预设值怎么来的呢,我们可以思考一下,我们将车慢慢倾斜,倾斜的角度越大,我们需要调节的量也就越大,也就是车轮转的越快。满占空比是7200,比如我们与机械中值相差10°,那我们P项算出来的占空比就是10*200=2000他是和7200在同一个数量级的所以可行。若预设值选为20或者2000,那我们的值要么根本达不到,要么可能极小的误差就会引起很大的反应。因此我们选择KP=200;
我们知道要想使小车保持平衡,那我们就要车往哪边倒,车轮就要往哪边转。所以当我们KP=200时我们观察小车的车轮转向,若和倾斜方向相同说明极性相同否则极性不同那我们就需要KP=-200;并且我们在倾斜角度越大时,车轮转的越快。若具有这个效果说明我们的PID程序没有问题可以进行下一步。

2.调节Kp
我们逐步增大Kp,我们可以步进30慢慢的往上加或往下减,并且我们要时刻观察小车的情况。我们通过对公式的分析,若P很大那么小车会大幅度低频振荡,若P还不够小车会一直向一个方向跑直到倒下。所以我们就慢慢地加减这个值,当小车达到低频振荡时说明Kp已经足够大了这个值我们就确定了。(Kp调节过程中小车会慢慢的有平衡的趋势)

3.调节Kd
KD的作用是消除振荡,所以我们D项要从0慢慢往上加,同时Kd的极性与Kp相同。我们步进0.5,当我们选取Kd=0.5时我们可以发现低频振荡已经消失。我们在往上加,当小车有良好的跟随性时(当我们手拿着小车在平面上快速移动,小车能够很良好的跟随并且平衡),当前的KD就可以确定了。如果直立环参数调的好,小车在没有人为干扰下能够静止在原地,平衡很长时间。
根据工程的经验,我们要将此时所定下来的Kp,Ki都乘0.6.

速度环PID参数整定

速度环PI:KpEk+KiEk_S

1.判断参数(Kp,Ki)极性
因为我们使用的是串级PID,速度环的输出是直立环的输入,我们直立环的KP已经是几百了所以我们速度环的PID参数会很小。所以我们预设KP=0.1根据工程的经验我们的速度环Kp=Ki*200所以我们预设的KP=0.1那么Ki=0.0005。判断极性有两种方法:
1️⃣试。我们在直立环数值保持不变的情况下,要么取正要么取负。若极性错误的话,小车不会像单纯直立环控制那样,会快速倒下。如果小车的平衡效果并且用手轻轻取碰小车,小车不会倒下说明极性正确。
2️⃣把直立环的参数注释掉或者都设为0。并且将最后PWM赋值的数值直接改为速度环的输出,也就是暂时取消串级PID,以及屏蔽掉直立环。单纯让速度环算出来的值加载到电机上,若极性正确向一端倾斜,小车的车轮会向同方向轻微转动一下。

2.调节Kp,ki
kp=200*Ki
在直立环参数整定完成之后,我们从0开始往上加,KP步进为0.1对应的KI步进就为0.005.我们一直往上试,直到小车有轻微高频抖动像抽搐一样,我们的值就可以了。注意:小车的高频抖动可能会损坏电机以及驱动等,所以我们在小车高频抖动时要立即关闭小车。避免损坏。
这样通过直立环,速度环的共同作用我们的小车也能良好的保持平衡并且拥有抗干扰能力。用外力干扰他他也不会倒下,迅速的回归平衡状态。到此小车的基本功能也就实现了。如果小车虽然能平衡但效果不是那么好,我们可以细调,步进值小一点,要有耐心。
我们也可以通过一些波形显示的上位机去观看图形的情况,这样更有利于我们去调参!

转向环PID参数整定

PWM_out=Turn_Kdgyro_Z + Turn_KpRC;

在转向环中,我们其实只用整定一个Kd。
我们不加转向环时,小车在平衡中会慢慢的转向。而转向环的作用就是对他的转向进行一个约束。这里是对Z轴的角速度进行约束。我们小车向左转那我们就要有一个反方向的力去抑制转向。这里我们通过差速法。将直立环,速度环运算出来的PWM值,一个车轮+转向环输出值。而另一个车轮-输出值。形成差速。
1.判断参数(Kd)极性
KD预设为0.5,若我们用手拿着小车旋转,有一个抵抗的力说明极性正确。若帮助你旋转,助力那么极性错误,我们就需要将值改为-0.5.

2.调节Kd
我们将速度环的入口参数Target_Speed赋值例如10。小车就会在保持平衡的同时
向前或向后移动,我们观察他沿直线行驶的偏移情况,若偏移较大那么kd偏小,若近似位置,在50cm内没有较大偏移那么当前的值就合适。

3.调节Kp
这个kp我们通常是蓝牙控制它的值已达到转向的目的。当转向时KP=20,kd=0去掉转向约束。当不转向时我们kp=0,kd的值变为之前整定的值加上转向约束。这样我们的小车就会更加稳定的平衡在原地。

到此我们的PID调参就已经全部完毕,我们可以根据这些加一些更好玩的功能例如平衡车循迹其实就是对期望速度,转向时的PID值的操作,还有避障,跟随等都是对PID的某些参数做改变从而让小车做出相应的动作。
到此平衡小车系列就全部结束了,如果有问题的话可以再评论区讨论!谢谢!

<think>好的,我现在需要帮助用户了解如何通过PID控制实现平衡的直立稳定,以及相关的程序编写方法。首先,我应该先回顾一下用户提供的参考引用,特别是引用[2]和[3],因为它们直接提到了平衡PID控制。用户的问题涉及原理和程序实现,所以需要分这两个部分来回答。 首先,PID控制的基本原理是比例、积分、微分三个环节的组合。在平衡中,直立环通常使用PD控制,因为积分环节可能会引入滞后,导致响应变慢,而小需要快速响应角度变化。引用[2]提到使用了串级PID,其中直立环和速度环的组合可能存在冲突,这可能需要解释如何协调这两个环。 接下来,我需要解释直立环的具体实现。角度数据来自MPU6050传感器,通过卡尔曼滤波或互补滤波处理后得到。直立环的PD计算产生PWM输出,控制电机的转动来维持平衡。这里需要说明P和D项的作用:比例项纠正角度偏差,微分项抑制角度变化的速度,防止振荡。 然后,程序实现部分需要给出代码框架。主循环中读取传感器数据,进行滤波,计算PID输出,最后控制电机。这里要注意代码的结构,比如使用定时中断确保控制频率,通常在100Hz到200Hz之间。引用[2]中的代码示例可能是一个好的参考,但需要简化并注释清楚。 用户可能还会关心参数整定方法,这里需要提到手动调试,先调P再调D,以及可能的自动整定方法如Ziegler-Nichols。引用[3]提到用Matlab验证控制算法,可能涉及系统模型的建立,但用户可能更关注实际调试步骤。 另外,用户的问题中提到速度环和直立环的冲突,引用[2]指出速度环的输出可能影响直立环,因此需要解释串级PID的结构,直立环作为内环,速度环作为外环,两者的输出如何叠加。可能需要分开说明两个环的作用,直立环快速响应角度变化,速度环调节长期的速度偏差,避免小持续加速。 在代码部分,需要确保变量定义正确,比如误差、上次误差、PWM输出等。同时,电机控制函数需要根据PWM值正负决定方向,并限制在合理范围内,防止过载。 最后,生成的相关问题需要考虑用户可能的后续疑问,比如参数调节、抗积分饱和、传感器选择、与其他控制算法对比等,这些都需要基于提供的引用和一般PID知识来设计。 现在需要检查是否有遗漏点,比如是否解释了为什么直立环用PD而不是完整的PID,是否说明了串级PID的结构,以及代码示例是否清晰正确。同时,确保所有数学公式使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,并正确引用文献。</think>### 平衡PID控制原理及程序实现方法 #### 一、PID控制原理 平衡的直立稳定通过**串级PID控制**实现,主要分为**直立环(角度控制)**和**速度环(速度控制)**。核心思想是通过传感器(如MPU6050)获取身倾角$\theta$和角速度$\omega$,结合PID算法生成电机控制信号。 1. **直立环(PD控制)** - **比例项(P)**:纠正角度偏差,公式为$P_{out} = K_p \cdot (\theta_{target} - \theta_{current})$。 - **微分项(D)**:抑制角度变化速度,公式为$D_{out} = K_d \cdot (\omega_{target} - \omega_{current})$[^2]。 - **总输出**:$U_{angle} = P_{out} + D_{out}$。 - **为何不用积分项(I)**?积分易引入滞后,可能导致振荡[^3]。 2. **速度环(PI控制)** - 通过编码器测量轮转速,控制长期速度稳定: $$U_{speed} = K_{p\_speed} \cdot (v_{target} - v_{current}) + K_{i\_speed} \cdot \sum (v_{target} - v_{current})$$ - 速度环输出会叠加到直立环,避免小持续加速[^2]。 #### 二、程序实现步骤 1. **传感器数据采集与滤波** 使用MPU6050读取角度和角速度,通过**卡尔曼滤波**或**互补滤波**消除噪声: ```c float kalman_filter(float raw_angle, float raw_gyro) { // 卡尔曼滤波实现(略) } ``` 2. **PID计算与控制** **直立环代码示例**: ```c // PD参数定义 float Kp_angle = 30.0, Kd_angle = 0.5; float error, last_error, pwm_output; void angle_PID_control(float current_angle, float current_gyro) { error = 0 - current_angle; // 目标角度为0(直立) pwm_output = Kp_angle * error + Kd_angle * (error - last_error); last_error = error; // 电机控制(假设电机驱动函数为set_motor_speed) set_motor_speed(pwm_output); } ``` 3. **串级PID整合** 将速度环输出叠加到直立环: ```c float U_angle, U_speed; // 直立环和速度环输出 void cascade_PID() { U_angle = angle_PID_control(...); // 直立环计算 U_speed = speed_PID_control(...); // 速度环计算 float final_output = U_angle + U_speed; set_motor_speed(final_output); } ``` 4. **定时中断控制** 使用定时器确保控制频率(通常100Hz~200Hz): ```c void TIM_IRQHandler() { if (TIM_GetITStatus(TIMx, TIM_IT_Update) != RESET) { read_sensors(); cascade_PID(); TIM_ClearITPendingBit(TIMx, TIM_IT_Update); } } ``` #### 三、关键调试经验 1. **参数整定顺序**:先调直立环P值至小小幅振荡,再加D值抑制振荡;最后调速度环。 2. **抗积分饱和**:速度环积分项需限幅,避免长期偏差累积。 3. **电机死区补偿**:实测电机启动电压阈值,在代码中补偿偏移量。 #### 四、典型问题解决 - **抖动严重**:增大D项或降低P项。 - **单向加速**:检查速度环极性是否与直立环匹配。 - **响应延迟**:提高控制频率或优化滤波算法。 ---
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值