大家好,欢迎来到IT知识分享网。
串级控制SITO控制系统设计文档
1. 概述
首先这篇文章禁止转载,主要是如果有对这篇论文的不同见解方便反馈,我的邮箱(), 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=Ik−1+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Δtek−2ek−1+ek−2
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} ek−1:上一时刻的误差
- e k − 2 e_{k-2} ek−2:上上一时刻的误差
- Δ 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
5. 总结及难点讲解
这个串级控制系统的设计和实现的难点在于第二级控制器的传递函数设计。第一级控制器采用PID控制算法,根据温度反馈值控制加热管的输出。第二级控制器根据第一级控制器的输出值,通过转换公式计算流量控制的输出值。
设计第二级控制器的转换公式时,需要满足以下控制律要求:
- 输入值越大,输出值越小。
- 输入值保持稳定的时间越长,输出值越大。
通过调整PID控制器的系数和转换公式中的参数,可以优化控制系统的性能,使其满足系统的要求。
实现该控制系统需要注意以下几点:
- 正确实现PID控制算法,并合理设置PID控制器的系数。
- 设计合适的转换公式,满足输入值和稳态时间对输出值的影响关系。
- 限制控制器的输出范围,避免超出有效范围。
- 根据实际需求,调整控制器的参数,优化系统性能。
希望这个技术文档对您设计和实现类似的控制系统有所帮助。如有任何问题,欢迎进一步讨论。
以上就是我对一个基本串级控制单元的实现原理介绍,支持的话可以关注下github: FanZexuan 。 准备发布一个完整的机器人控制算法/无人机控制/导航算法/so3动力学的hands-on by python 教程
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/153171.html