什么时候使用PD和PI——基于平衡小车分析

本文探讨了PD和PI控制器在平衡小车控制中的应用,强调了PD的快速响应和抗震荡能力,以及PI的消除静差特性。PI常用于精度要求高且噪声大的场合,如速度控制,而PD则适合快速响应但需防噪声干扰的情况。

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



前言

有时候我们都不会把PID三个控制都用上,可能之后用其中的P、PI或PD控制。P控制就不用说了,什么时候都能用,只是性能的问题。本文将基于平衡小车分析什么时候使用PI和PD控制器。


这是一篇无华且枯燥的纯文字文章,请细品。

一、PD控制器的性能

PD控制就是比例+微分控制,在系统稳定后能快速预测未来的变化并做出响应。
特点是快速性和稳定性。
微分相当于一个阻力,能有效抑制系统本身产生的震荡。缺点是有静差和放大噪声,当偏差很小时P和D基本不起作用所以会有静差。噪声与系统自身调节产生的震荡是不同的,噪声一般是高频的干扰。噪声会在输出端影响系统然后反馈到输入端,由于微分控制是有一个系数的,当系数乘上噪声后,可以想象到噪声是被放大了。噪声的放大效果取决于微分系数,如果系统的微分系数很大那就要注意噪声的干扰了。

二、什么时候用PD控制

对于需要快速响应的系统可以使用PD控制,但是要注意噪声的干扰。
平衡小车的直立控制就需要用到PD控制。当角度接近机械零度时,P控制器就不工作了,控制器认为完成了任务,然而控制器忽略了一种对下一个时刻的预测,即角度在机械零度时电机还存在角速度,简单来说就是小车还有惯性。这时候就需要加入D控制器,预测下一时刻的偏差。
既然本小节讲的是什么时候用PD控制,反过来想就是这个PID控制器中为什么不用积分。这里必须知道的一点是当比例系数很大的时候系统几乎没有静差。平衡小车直立控制需要快速性,相比之下P是很大的,积分的作用是消除静差,而静差对于直立控制的影响很小自然就不需要积分了。实际上平衡小车不一定要完全处于机械中值,稍微偏一点点也没有关系,只要稳定就行了。所以对于准确性要求不高的系统可以不加入积分控制。

三、PI控制器的性能

PI控制就是比例+积分控制,兼顾快速性并且在系统稳定后能消除静差。特点是快速性和准确性。
对一个自动控制系统,为了消除稳态误差,在控制器中必须引入积分项,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。缺点是不适用于惯性较大的系统,在某些情况下积分需要做特殊处理,可以参考PID积分项优化与C语言实现这篇文章。

四、什么时候用PI控制

PI控制可以说是最常用的组合。微分放大噪声是很难受的,微分的作用是提前响应,现在更多是采用加前馈的方式,同样可以提前响应但不会放大噪声。
先说一下平衡小车为什么要速度控制,小车的机械中值存在误差,如果只有直立控制,小车可能会一直前进或者后退以维持这个有误差的机械中值,网上有人说是小车平移速度没有限制,这样就可能超过PWM的幅值,导致电机无法加速了。我觉得这并不是加入速度控制的主要原因,对于这种说法有两种方式解决1.对PWM进行限幅 2.倾角大时直接关闭电机。小车不能长时间静止平衡主要是重心不稳,导致小车只能通过单方向运动维持平衡。加入速度环就是修正小车的角度,小车一直往前面开时,速度环让小车以更快速度行驶使小车后仰,这时直立控制让小车后退以维持平衡。
对于速度控制当然是越精确越好,平衡小车当然希望速度一直为0。速度控制的速度偏差是由直立控制电机运动引起的,即速度噪声很大,所以不加入微分控制。
对于准确性要求高,系统噪声大时可以采用PI控制。


结语

那么以上就是本篇文章的所有内容了。
本文如果有什么不对的或者需要改进的地方欢迎指出。

<think>好的,我现在需要解决用户的问题:在STM32平衡小车中,速度环的输出值如何转化成角度。这个问题看起来涉及到控制系统的两个主要部分——速度环角度环。我需要先理清楚整个控制流程,再具体分析速度环的输出是如何影响角度控制的。 首先,平衡小车通常使用PID控制算法,可能有内环外环的结构。常见的结构是角度环作为内环,速度环作为外环。不过用户的问题是关于速度环的输出如何转化为角度,所以可能需要反过来考虑,可能是速度环的输出作为角度环的输入或者设定值? 让我回忆一下平衡小车控制结构。一般来说,平衡小车的直立控制是通过角度环(PD控制)来维持车体垂直,而速度环则是通过调整角度设定值来实现速度的控制。例如,当小车需要前进时,速度环会根据当前速度与目标速度的差异,计算出需要的倾斜角度,这个角度设定值会被输入到角度环中,角度环再通过电机控制来调整车体角度,从而改变加速度,进而影响速度。 所以,速度环的输出实际上是一个角度的设定值偏移量。例如,当速度环检测到当前速度低于目标速度时,它会输出一个向前的倾斜角度增量,这个增量会被加到角度环的设定值上,让小车向前倾斜,进而电机加速,小车前进,速度增加。反之亦然。 不过,这里的转化过程需要具体的数学处理。比如,速度环的输出可能是一个比例积分(PI控制的结果,其输出量Δθ被加到角度环的设定值θ_setpoint上。原本角度环的设定值可能为0(直立状态),而速度环的输出会让设定值变成θ_setpoint = Δθ,这样角度环就会控制小车倾斜到该角度,从而产生加速度,调整速度。 接下来,我需要确认这个转化是否需要积分项。速度环通常使用PI控制,积分部分用来消除稳态误差。例如,速度误差经过PI运算后得到角度偏移量,这个偏移量被送给角度环作为新的目标角度。这样,当速度存在持续误差时,积分项会累积,导致目标角度逐渐变化,直到速度误差被消除。 此外,需要注意角度环速度环的执行频率是否一致。通常角度环需要更高频率的执行,比如1kHz,而速度环可能频率稍低,但需要根据实际情况调整参数,避免两个环之间的相互干扰。 还有,具体的转化可能需要考虑单位转换或者比例系数。例如,速度环的输出是一个数值,需要乘以一个系数才能转换为角度值(如弧度或度数)。这个系数可能需要根据小车的物理参数(如轮径、电机扭矩、质量分布等)进行调整,或者通过实验整定。 不过,这里可能存在一个问题,如果直接将速度环的输出作为角度设定值的增量,如何保证系统的稳定性?比如,当速度环的输出过大时,可能导致角度环无法及时调整,小车倾倒。因此,可能需要对速度环的输出进行限幅,确保角度设定值的变化在合理范围内,使角度环能够有效控制。 另外,可能需要将速度环的输出与角度环的当前实际角度进行比较,或者结合其他传感器数据(如陀螺仪的角速度)进行补偿。例如,使用串级控制结构,速度环的输出作为角度环的设定值,而角度环的输出直接控制电机。这种情况下,速度环的输出转化为角度设定值,角度环根据这个设定值当前角度反馈计算出电机所需的PWM信号。 总结来说,转化过程大致如下: 1. 速度环(PI控制器)根据速度误差计算出一个角度偏移量Δθ。 2. 这个Δθ被加到直立时的目标角度(通常为0)上,形成新的角度设定值θ_set = 0 + Δθ。 3. 角度环根据θ_set当前实际角度θ_actual的误差,通过PD控制计算出电机输出,调整小车姿态,从而改变速度。 这样,速度环的输出Δθ直接决定了小车需要倾斜的角度,进而通过角度环控制实现速度调节。整个过程中,Δθ的大小符号决定了倾斜方向程度,而速度环的参数(KpKi)则影响系统的响应速度稳定性。 可能还需要注意的一点是,这里的角度设定值实际上是期望的倾斜角度,但小车的动力学模型中,倾斜角度与加速度之间存在关系,比如倾斜角度θ与加速度a的关系可能近似为a = g * sinθ(g为重力加速度)。因此,当小车倾斜θ角度时,会产生一个加速度,从而改变速度。因此,速度环的输出Δθ实际上对应了所需的加速度,进而积分成速度的变化。 不过,实际应用中可能通过实验来调整参数,而不是精确依赖物理模型。例如,通过试凑法调整速度环的KpKi,使得小车能够平稳地维持速度而不倾倒。 最后,需要确保在代码实现时,将速度环的输出正确地叠加到角度环的设定值上,并且处理好单位转换限幅问题,以防止过大的角度设定导致控制失效。</think>在STM32平衡小车中,速度环输出值通过以下步骤转化为角度控制: --- ### 一、控制环路结构 平衡小车采用**双闭环控制**: 1. **外环(速度环)**:PI控制,调节目标速度 2. **内环(角度环)**:PD控制,维持直立平衡 速度环输出本质是**角度偏移量**,通过叠加到直立角度设定值,实现速度与角度的耦合控制。 --- ### 二、数学转化原理 1. **速度误差计算**: $$ e_v = v_{target} - v_{actual} $$ (目标速度与编码器反馈速度的差值) 2. **PI控制器输出**: $$ \Delta\theta = K_{p\_v} \cdot e_v + K_{i\_v} \cdot \sum e_v $$ (输出为角度偏移量,单位:弧度) 3. **角度设定值更新**: $$ \theta_{set} = \theta_{default} + \Delta\theta $$ (默认直立角度$\theta_{default}=0$,通过叠加$\Delta\theta$实现前倾/后仰) --- ### 三、代码实现关键步骤 ```c // 伪代码示例 float Velocity_PI_Control(void) { static float integral = 0; float error = Target_Velocity - Get_EncoderVelocity(); integral += error * dt; // dt为控制周期 float delta_theta = Kp_v * error + Ki_v * integral; return delta_theta; } void Angle_Control(void) { float theta_set = Velocity_PI_Control(); // 获取速度环输出 float theta_real = Get_MPU6050_Angle(); // 读取真实角度 float error = theta_set - theta_real; float output = Kp_a * error + Kd_a * Get_Gyro(); // 角度环PD控制 Set_MotorPWM(output); // 最终输出到电机 } ``` --- ### 四、参数调节要点 1. **输出限幅**:限制$\Delta\theta$范围(如±5°),防止过度倾斜 2. **单位匹配**:确保角度量纲统一(推荐使用弧度) 3. **动态补偿**:结合陀螺仪角速度数据提升响应速度 4. **解耦调试**:先调角度环再调速度环 --- ### 五、物理意义解析 当小车需要加速时: 1. 速度环输出正向$\Delta\theta$ → 设定角度前倾 2. 角度环驱动电机向前加速 → 产生加速度 3. 加速度积分 → 速度逐渐提升 4. 速度误差减小 → $\Delta\theta$回归平衡点 --- ### 六、注意事项 1. 确保角度环执行频率 > 速度环(建议10:1) 2. 编码器数据需滤波处理(滑动平均/Kalman滤波) 3. 避免积分饱(Clamping抗饱处理) 4. 车体机械结构影响转化系数,需实验校准 通过这种控制策略,速度环与角度环形成级联控制,最终实现动态平衡与速度跟踪的统一。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

微光feng

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值