串级控制SITO控制系统设计实现及重难点讲解

串级控制SITO控制系统设计文档

1. 概述

首先这篇文章禁止转载,主要是如果有对这篇论文的不同见解方便反馈,我的邮箱(fanzexuan135@163.com), My github: 范泽宣
正文开始: 串级控制系统能解决复杂的高阶控制问题。很多同学对串级控制不甚理解,今天读完这个文档相信你会有新的感悟。
假设你要做一个水流温度控制算法,只可以测量温度,但可同时控制水的流量和加热管的功率,那么应该如何设计这个SITO(单输入双输出的控制器)来实现目标温度的追踪呢。
这实际上是一个常见的串级控制器的思路,且为二阶,因为同时控制了加热管(加热功率)和水泵(流量),初级工程师也会遇到不知道如何设计这种控制器而只是实现单独的并行控制或是一级控制,那么我来抛砖引玉,一步一步解释如何实现一个串级控制系统。
很明显需要这个串级控制系统包括两个级的控制器:第一级控制器用于温度反馈控制的加热管控制,第二级控制器用于根据第一级控制器的输出进行流量控制。

2. 系统要求

2.1 第一级控制器(温度反馈控制)

  • 根据温度传感器的反馈值和设定温度,控制加热管的输出。
  • 采用PID控制算法,根据温度误差调整加热管的输出。
  • 输出值范围为0到100,表示加热管的工作功率百分比。

2.2 第二级控制器(流量控制)

  • 根据第一级控制器的输出值,控制流量。
  • 满足以下要求:
    • 输入值(第一级控制器的输出)越大,输出值(流量)越小。
    • 输入值保持稳定的时间越长,输出值(流量)越大。
  • 输出值范围为0到100,表示流量百分比。

3. 设计与实现

3.1 第一级控制器(温度反馈控制)

第一级控制器采用PID控制算法,根据温度传感器的反馈值和设定温度,计算加热管的输出值。

PID控制器的离散化公式

比例项 (Proportional Term)

P k = K p e k P_k = K_p e_k Pk=Kpek

积分项 (Integral Term)

I k = I k − 1 + K i e k Δ t I_k = I_{k-1} + K_i e_k \Delta t Ik=Ik1+KiekΔt

微分项 (Derivative Term)

D k = K d e k − 2 e k − 1 + e k − 2 Δ t D_k = K_d \frac{e_k - 2e_{k-1} + e_{k-2}}{\Delta t} Dk=KdΔtek2ek1+ek2

PID 控制器输出 (PID Controller Output)

u k = P k + I k + D k u_k = P_k + I_k + D_k uk=Pk+Ik+Dk

其中:

  • K p K_p Kp:比例增益
  • K i K_i Ki:积分增益
  • K d K_d Kd:微分增益
  • e k e_k ek:当前时刻的误差
  • e k − 1 e_{k-1} ek1:上一时刻的误差
  • e k − 2 e_{k-2} ek2:上上一时刻的误差
  • Δ t \Delta t Δt:采样时间间隔
  • u k u_k uk:PID 控制器的输出

通过调整PID控制器的系数(Kp, Ki, Kd),可以优化控制器的性能,使温度快速、平稳地达到设定值。

3.2 第二级控制器(流量控制)

第二级控制器根据第一级控制器的输出值,计算流量控制的输出值。

流量控制的转换公式如下:

output = k * (1 - input / input_max) * (1 + stable_time / time_constant)

其中:

  • output: 转换公式的输出,表示流量百分比
  • input: 第一级控制器的输出值
  • input_max: 第一级控制器输出值的最大值
  • stable_time: 输入值保持稳定的时间
  • time_constant: 时间常数,用于调整稳态时间对输出的影响程度
  • k: 比例系数,用于调整输出的大小

传递函数公式的设计满足了以下要求:

  • 当输入值(input)越大时,(1 - input / input_max) 的值越小,导致输出值(output)减小。这体现了输入值越大,输出值越小的关系。
  • 当输入值保持稳定的时间(stable_time)越长时,(1 + stable_time / time_constant) 的值越大,导致输出值(output)增大。这体现了输入值保持稳定的时间越长,输出值越大的关系。

通过调整转换公式中的参数(input_max, time_constant, k),可以优化流量控制的性能,满足系统的要求。

4. 代码实现

以下是使用C语言实现的串级控制器仿真代码:

#include <stdio.h>

// 第一级控制器(温度反馈控制)
double pid_control(double set_temp, double actual_temp, double* integral_error, double* prev_error, double Kp, double Ki, double Kd) {
    double error = set_temp - actual_temp;
    *integral_error += error;
    double derivative = error - *prev_error;
    double output = Kp * error + Ki * (*integral_error) + Kd * derivative;
    *prev_error = error;

    // 限制输出范围在0到100之间
    if (output < 0) {
        output = 0;
    } else if (output > 100) {
        output = 100;
    }

    return output;
}

// 第二级控制器(流量控制)
double transfer_function(double input, double input_max, double stable_time, double time_constant, double k) {
    double output = k * (1 - input / input_max) * (1 + stable_time / time_constant);

    // 限制输出范围在0到100之间
    if (output < 0) {
        output = 0;
    } else if (output > 100) {
        output = 100;
    }

    return output;
}

int main() {
    // 设置PID控制器参数
    double Kp = 2.0;
    double Ki = 0.5;
    double Kd = 1.0;
    double integral_error = 0.0;
    double prev_error = 0.0;

    // 设置流量控制转换公式参数
    double input_max = 100.0;
    double time_constant = 10.0;
    double k = 50.0;
    double stable_time = 0.0;

    // 模拟温度变化并计算控制器输出
    double set_temp = 100.0;
    double actual_temp_values[] = {50.0, 60.0, 70.0, 80.0, 90.0, 95.0, 98.0, 100.0, 100.0, 100.0, 100.0, 100.0};
    int num_values = sizeof(actual_temp_values) / sizeof(actual_temp_values[0]);

    for (int i = 0; i < num_values; i++) {
        double actual_temp = actual_temp_values[i];
        double pid_output = pid_control(set_temp, actual_temp, &integral_error, &prev_error, Kp, Ki, Kd);
        double flow_output = transfer_function(pid_output, input_max, stable_time, time_constant, k);

        printf("Actual Temp: %.2f, PID Output: %.2f, Flow Output: %.2f\n", actual_temp, pid_output, flow_output);

        // 更新稳态时间
        if (i > 0 && actual_temp == actual_temp_values[i - 1]) {
            stable_time += 1.0;
        } else {
            stable_time = 0.0;
        }
    }

    return 0;
}

该代码可以在在线编译器上独立运行;
流量控制器基本运行输出结果如下,符合控制律设计预期:

  • 输入值(第一级的输出)越大,输出值越小。
  • 输入值保持稳定的时间越长,输出值越大。
Input: 10.00, Stable Time: 0.00, Output: 45.00
Input: 20.00, Stable Time: 0.00, Output: 40.00
Input: 30.00, Stable Time: 0.00, Output: 35.00
Input: 40.00, Stable Time: 0.00, Output: 30.00
Input: 50.00, Stable Time: 0.00, Output: 25.00
Input: 50.00, Stable Time: 0.00, Output: 25.00
Input: 50.00, Stable Time: 0.00, Output: 25.00
Input: 50.00, Stable Time: 0.00, Output: 25.00
Input: 50.00, Stable Time: 0.00, Output: 25.00
Input: 60.00, Stable Time: 0.00, Output: 20.00
Input: 70.00, Stable Time: 0.00, Output: 15.00
Input: 80.00, Stable Time: 0.00, Output: 10.00
Input: 90.00, Stable Time: 0.00, Output: 5.00

第一级控制器的输入越大,Output变小;趋于稳态的时候(也就是第一级输出持续最大输入无法收敛温度误差)第二级的Output就会变大;
二阶控制同时影响作用温度,达到最好的控制效果。

5. 总结及难点讲解

这个串级控制系统的设计和实现的难点在于第二级控制器的传递函数设计。第一级控制器采用PID控制算法,根据温度反馈值控制加热管的输出。第二级控制器根据第一级控制器的输出值,通过转换公式计算流量控制的输出值。

设计第二级控制器的转换公式时,需要满足以下控制律要求:

  • 输入值越大,输出值越小。
  • 输入值保持稳定的时间越长,输出值越大。

通过调整PID控制器的系数和转换公式中的参数,可以优化控制系统的性能,使其满足系统的要求。

实现该控制系统需要注意以下几点:

  • 正确实现PID控制算法,并合理设置PID控制器的系数。
  • 设计合适的转换公式,满足输入值和稳态时间对输出值的影响关系。
  • 限制控制器的输出范围,避免超出有效范围。
  • 根据实际需求,调整控制器的参数,优化系统性能。

希望这个技术文档对您设计和实现类似的控制系统有所帮助。如有任何问题,欢迎进一步讨论。

以上就是我对一个基本串级控制单元的实现原理介绍,支持的话可以关注下github: FanZexuan 。 准备发布一个完整的机器人控制算法/无人机控制/导航算法/so3动力学的hands-on by python 教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值