串级PID控制(双环PID)

目录

一·串级PID简述

1·基本概念

2·工作原理

二·串级PID结构

三·代码实例

四·代码解释

五·串级PID调参方法

1. 副 PID 参数调整

2. 主 PID 参数调整

3. 综合调试

六·使用场景


一·串级PID简述

1·基本概念

串级 PID(Cascade PID)是一种在单级 PID 控制基础上发展而来的控制策略。它由多个 PID 控制器级联组成,通常包含一个主控制器和一个或多个副控制器。主控制器的输出作为副控制器的设定值,副控制器根据这个设定值对系统进行更精细的控制。

2·工作原理

串级 PID 的核心思想是将一个复杂的控制问题分解为多个相对简单的子问题。通过这种方式,可以提高系统的控制性能,增强系统对干扰的抵抗能力。例如,在一个温度控制系统中,主控制器可以根据设定温度和实际温度的偏差计算出一个中间控制量,副控制器则根据这个中间控制量和另一个相关变量(如加热功率)的偏差来精确控制加热设备的输出。

二·串级PID结构

一个典型的串级 PID 系统包含两个 PID 控制器:主 PID 控制器和副 PID 控制器。主 PID 控制器接收系统的设定值和主反馈值,计算出一个中间输出值;副 PID 控制器接收主 PID 的输出作为其设定值,并结合副反馈值,计算出最终的控制输出。

三·代码实例

#include <stdio.h>

// 定义PID结构体
typedef struct {
    float kp;  // 比例系数
    float ki;  // 积分系数
    float kd;  // 微分系数
    float prev_error;  // 上一次的误差
    float integral;    // 积分项
} PID;

// 初始化PID控制器
void PID_Init(PID *pid, float kp, float ki, float kd) {
    pid->kp = kp;
    pid->ki = ki;
    pid->kd = kd;
    pid->prev_error = 0;
    pid->integral = 0;
}

// 计算PID输出
float PID_Compute(PID *pid, float setpoint, float current_value) {
    float error = setpoint - current_value;
    pid->integral += error;
    float derivative = error - pid->prev_error;
    float output = pid->kp * error + pid->ki * pid->integral + pid->kd * derivative;
    pid->prev_error = error;
    return output;
}

// 串级PID控制函数
float Cascade_PID_Control(PID *main_pid, PID *sub_pid, float main_setpoint, float main_feedback, float sub_feedback) {
    // 主PID计算中间输出
    float intermediate_output = PID_Compute(main_pid, main_setpoint, main_feedback);
    // 副PID计算最终输出
    float final_output = PID_Compute(sub_pid, intermediate_output, sub_feedback);
    return final_output;
}

int main() {
    // 初始化主PID和副PID控制器
    PID main_pid, sub_pid;
    PID_Init(&main_pid, 1.0, 0.1, 0.01);
    PID_Init(&sub_pid, 0.5, 0.05, 0.005);

    // 设定主设定值
    float main_setpoint = 100.0;
    // 模拟主反馈和副反馈
    float main_feedback = 0.0;
    float sub_feedback = 0.0;

    // 进行控制迭代
    for (int i = 0; i < 100; i++) {
        float control_output = Cascade_PID_Control(&main_pid, &sub_pid, main_setpoint, main_feedback, sub_feedback);
        // 这里可以添加模拟系统响应的代码,更新反馈值
        main_feedback += control_output * 0.1;
        sub_feedback += control_output * 0.05;
        printf("Iteration %d: Control Output = %.2f, Main Feedback = %.2f, Sub Feedback = %.2f\n", i, control_output, main_feedback, sub_feedback);
    }

    return 0;
}

四·代码解释

  1. PID 结构体:定义了 PID 控制器的基本参数,包括比例系数(kp)、积分系数(ki)、微分系数(kd)、上一次的误差(prev_error)和积分项(integral)。
  2. PID_Init 函数:用于初始化 PID 控制器的参数。
  3. PID_Compute 函数:根据设定值和当前值计算 PID 控制器的输出。
  4. Cascade_PID_Control 函数:实现串级 PID 控制,先调用主 PID 计算中间输出,再将中间输出作为副 PID 的设定值,计算最终的控制输出。
  5. main 函数:初始化主 PID 和副 PID 控制器,设定主设定值,模拟主反馈和副反馈,进行控制迭代,并输出每次迭代的控制输出和反馈值。

五·串级PID调参方法

1. 副 PID 参数调整

  • 比例系数(kp:先将主 PID 的输出固定,单独调整副 PID 的比例系数。逐渐增大kp,观察副反馈值的响应速度。kp越大,系统响应越快,但可能会导致系统超调增大,甚至不稳定。当系统出现轻微超调时,记录此时的kp值。
  • 积分系数(ki:在确定了合适的kp后,加入积分作用。逐渐增大ki,直到系统的稳态误差消除。但ki过大可能会导致系统出现积分饱和现象,使系统不稳定。
  • 微分系数(kd:如果系统存在较大的超调,可以适当增加微分系数kd来抑制超调。但kd过大可能会使系统对噪声过于敏感。

2. 主 PID 参数调整

  • 在副 PID 参数调整好后,开始调整主 PID 的参数。调整方法与副 PID 类似,先调整比例系数,再调整积分系数,最后调整微分系数。
  • 由于主 PID 的输出作为副 PID 的设定值,主 PID 的参数调整会影响副 PID 的控制效果。因此,在调整主 PID 参数时,需要综合考虑系统的整体性能。

3. 综合调试

  • 在完成主 PID 和副 PID 的单独调整后,需要进行综合调试。观察系统在不同工况下的响应,如设定值变化、干扰输入等,根据实际情况微调主 PID 和副 PID 的参数,以达到最佳的控制效果。

六·使用场景

在进行闭云台电机角度时,我们通常选用双环PID,即串级PID。外环为角度环,内环为速度环。先将目标角度与电机角度进行PID计算,得到的输出作为速度环的目标,与电机的速度进行PID计算。得到的输出即可发给电机。这样我们在控制电机角度的同时,也能让电机以一个较理想的速度去达到目标角度。

在调参时一般我们将角度环的Kp给大,而速度环的Kp较小。这样电机能够更精确的到达目标角度,且系统不会出现震荡。或者我们将角度环的Kp给小,而速度环的Kp给大,这样我们也可以使系统稳定,且响应速度较快,但电机的角度与目标角度存在一个较大的误差。

而在上图所示的简单系统中,将位置环Kp给大,而速度环较小时

如果位置环Kp相对速度环Kp较小时

由此可见,在位置环较大时,该系统会出现超调,而速度环较大时系统的响应很快,且没有出现超调,所以将内外环参数合理调整,系统的响应可以达到一个令人满意的程度。

由于该系统是最简单的二阶系统,并非电机系统,因此和我上面说的云台(电机)调参经验有所不同。

PID计算代码:PID控制器简述(附代码)-CSDN博客

调参是一个经验性的过程,需要不断地尝试和调整,同时结合系统的实际运行情况进行优化。

以下是使用JavaMailSender发送附件邮件到qq邮箱的示例代码: ```java // 创建一个JavaMailSender实例 JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("smtp.qq.com"); // 设置SMTP服务器地址 mailSender.setPort(587); // 设置SMTP服务器端口号 mailSender.setUsername("你的QQ邮箱账号"); // 设置发送邮件的账号 mailSender.setPassword("你的QQ邮箱授权码"); // 设置发送邮件的授权码 // 创建一个MimeMessage实例 MimeMessage message = mailSender.createMimeMessage(); // 使用MimeMessageHelper添加邮件内容和附件 MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom("你的QQ邮箱地址"); // 设置件人邮箱 helper.setTo("收件人邮箱地址"); // 设置收件人邮箱 helper.setSubject("邮件主题"); // 设置邮件主题 helper.setText("邮件正文"); // 设置邮件正文 // 添加附件 FileSystemResource resource = new FileSystemResource(new File("附件路径")); helper.addAttachment("附件名称", resource); // 发送邮件 mailSender.send(message); ``` 其中,`setHost()`方法设置SMTP服务器地址,`setPort()`方法设置SMTP服务器端口号,`setUsername()`方法设置QQ邮箱账号,`setPassword()`方法设置QQ邮箱授权码。`MimeMessageHelper`类的`addAttachment()`方法用于添加附件,第一个参数为附件名称,第二个参数为附件文件资源。`FileSystemResource`类是Spring Framework提供的文件系统资源类,用于访问文件系统中的文件发送邮件时,调用`mailSender.send()`方法即可。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

J-TS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值