PID算法(三)串级PID

本文解析了串级PID算法的工作原理,它如何通过双重控制提高精度,以小车定位为例说明其原理。讨论了内环输出与控制量的关系,并质疑了线性的误解。

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

串级PID

如果说前一次的衍生PID,是在基础PID算法的横向上变形的话,那本片的串级PID就是在基础PID的算法上,做纵向的嵌套。

与单级PID的不同

与单级PID不同的是,串级PID,需要两个实际值输入,其中内层的变量,是外层变量的一次导数,比如,外层是角速度,内层就是角加速度。而且外层的输出,将作为内层的目标值输入。
现在我对于串级PID的一点浅显的理解是,就相当于知道了误差的变化,对我们的控制变量进行更加精细的调节。
举个例子,我们需要控制小车的位置,我们通过控制速度,对速度进行一个时间的积分,我们可以得到我们要的位移。可是这时候,小车的速度和我们的目标速度拟合的不是很好,这时候我们如果知道加速度,让加速度在时间上做一个积分,我们是不是可以对速度做一个更好的控制呢?

代码

pid_param_t * pid;
const float pid_core_input[3] = {0,0,0}, pid_shell_input[3] = {0,0,0};//这是要调到的的三参数

float now_shell, float target_shell,float output_shell;//外层 实际值,外层目标值,外层输出值
float now_core, float target_core,float output_core;//内层实际值,内层目标值,内层输出值
{
pid_init(pid,  PID_POSITION, pid_core_input,  10000,  10000);//内层PID初始化
pid_init(pid, PID_POSITION, pid_shell_input, 10000, 10000);//外层PID初始化
	
output_shell = pid_Calc(pid, now_shell, target_shell);

target_core = output_shell;

output_core = pid_Calc(pid, now_core, target_core);//内层误差=output_shell-now_core;//将外层输出当作内层的目标值
}

串级之后,我们的内环输出与我们的控制量还是线性的吗

比如使用串级PID,输出 为速度的调节与电机的压差还是线性关系吗?
刚开始问,这个问题,我还自己想了一下,后来想想,不就是相当于求导吗?求导之后,怎么就不线性啦?

这只是个人暂时的粗浅的理解,如有错误,欢迎指正。

<think>好的,我现在需要帮助用户理解增量式PID算法的实现和原理,并且提供代码示例。首先,我得回顾一下用户的问题和之前的引用内容。用户之前提到了PID算法的基础,闭环系统,以及STM32的PID控制代码片段。现在用户问的是增量式PID,这比普通的PID更复杂一些,所以需要详细分解。 首先,我需要确认PID的结构。PID一般有两个控制环,内环和外环。外环处理主控变量,比如温度控制系统中的整体温度,而内环处理辅助变量,比如加热器的电流。外环的输出作为内环的设定值,这样内环可以更快地响应干扰,提高系统的控制效果。 接下来是增量式PID。增量式PID与位置式PID的区别在于,增量式输出的是控制量的变化量,而不是绝对量。这有助于避免积分饱和,并且在执行机构有累积功能(如步进电机)时更为适用。增量式PID的计算公式需要推导,通常是基于位置式的差分得到的。 然后,我需要将这两者结合起来,形成增量式PID。也就是说,外环和内环都使用增量式PID算法。外环计算出一个增量输出,作为内环的设定值变化量,内环再根据这个设定值的变化量来计算最终的输出增量。 在代码实现方面,需要分别定义外环和内环的结构体,包含必要的参数和状态变量,比如误差项、积分项、微分项等。每个控制周期,先运行外环PID计算得到内环的设定值增量,然后内环根据新的设定值和实际测量值计算输出增量。需要注意将输出限制在合理范围内,防止积分饱和或其他异常情况。 用户可能需要一个具体的代码示例,比如用C语言编写的简单示例,展示如何实现增量式PID的结构。同时,代码中需要注释说明各个部分的作用,特别是增量式计算的部分,比如如何保存上一次的误差和上上次的误差,以及如何计算比例、积分、微分项的变化量。 此外,还需要考虑实际应用中的问题,比如参数的整定、抗积分饱和的措施,以及采样时间的选择。可能还需要解释为什么结构能提高系统的响应速度和抗干扰能力,比如内环快速响应扰动,外环处理更慢的动态变化。 最后,生成的相关问题需要覆盖PID的优势、参数调整方法、与位置式的区别,以及实际应用案例,这样用户可以根据自己的需求进一步探索。 现在需要检查是否有遗漏的部分,比如公式是否正确,代码结构是否清晰,是否遵循了用户之前的引用内容中的要点,比如反馈控制的思想,以及如何避免积分饱和。同时确保使用中文回答,行内公式用$...$,独立公式用$$...$$,并且代码块用正确的语法标注。</think>### 增量式PID算法解析 #### 一、基本原理 增量式PID由**外环**(主控制器)和**内环**(副控制器)组成,形成双闭环控制: $$ \Delta U_{outer} = K_{p1} \cdot (e_{1}(k)-e_{1}(k-1)) + K_{i1} \cdot e_{1}(k) + K_{d1} \cdot (e_{1}(k)-2e_{1}(k-1)+e_{1}(k-2)) $$ 外环输出作为内环设定值,内环增量式为: $$ \Delta U_{inner} = K_{p2} \cdot (e_{2}(k)-e_{2}(k-1)) + K_{i2} \cdot e_{2}(k) + K_{d2} \cdot (e_{2}(k)-2e_{2}(k-1)+e_{2}(k-2)) $$ 最终控制量: $$ u(k) = u(k-1) + \Delta U_{inner} $$ 通过内外环协同,提升系统抗干扰能力[^2]。 #### 二、实现步骤 1. **外环处理**:计算主变量偏差 $e_1 = Target - OuterFeedback$ 2. **外环增量输出**:生成内环设定值变化量 $\Delta U_{outer}$ 3. **内环处理**:计算副变量偏差 $e_2 = \Delta U_{outer} - InnerFeedback$ 4. **内环增量输出**:生成最终执行量 $\Delta U_{inner}$ #### 、C语言代码示例 ```c // 定义PID结构体 typedef struct { float Kp, Ki, Kd; float error[3]; // 当前、上次、上上次误差 float output; } IncPID; // PID全局变量 IncPID outer_pid = {0.8, 0.05, 0.1, {0}}; IncPID inner_pid = {1.2, 0.1, 0.3, {0}}; float cascade_inc_pid(float target, float outer_fb, float inner_fb) { // 外环计算 outer_pid.error[0] = target - outer_fb; float delta_outer = outer_pid.Kp * (outer_pid.error[0] - outer_pid.error[1]) + outer_pid.Ki * outer_pid.error[0] + outer_pid.Kd * (outer_pid.error[0] - 2*outer_pid.error[1] + outer_pid.error[2]); // 更新外环误差 outer_pid.error[2] = outer_pid.error[1]; outer_pid.error[1] = outer_pid.error[0]; // 内环计算(外环输出作为内环目标) inner_pid.error[0] = delta_outer - inner_fb; float delta_inner = inner_pid.Kp * (inner_pid.error[0] - inner_pid.error[1]) + inner_pid.Ki * inner_pid.error[0] + inner_pid.Kd * (inner_pid.error[0] - 2*inner_pid.error[1] + inner_pid.error[2]); // 更新内环误差 inner_pid.error[2] = inner_pid.error[1]; inner_pid.error[1] = inner_pid.error[0]; return inner_pid.output += delta_inner; // 返回累积输出值 } ``` #### 四、核心优势 1. **抗干扰能力**:内环快速抑制扰动(如电机负载突变) 2. **动态响应**:外环专注稳态精度,内环负责快速调节 3. **无静差控制**:积分项消除系统稳态误差[^1] #### 五、参数整定原则 1. **先内后外**:先调内环使副回路响应快速 2. **比例先行**:先设置$K_p$至临界振荡,再调整$K_i$, $K_d$ 3. **衰减比法**:保持4:1~10:1的振荡衰减比
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值