侧边栏壁纸
博主头像
塞塞哇 博主等级

开源创客

  • 累计撰写 38 篇文章
  • 累计创建 9 个标签
  • 累计收到 11 条评论

目 录CONTENT

文章目录

PID 温控算法学习笔记

塞塞蛙
2023-08-05 / 0 评论 / 5 点赞 / 669 阅读 / 0 字

PID 温控算法学习笔记

前言

当谈到控制系统和温度控制时,PID(比例-积分-微分)控制算法是最常见和广泛使用的控制算法之一。PID控制器的目标是通过调整输出来使系统的实际值(如温度)尽可能接近设定值(目标温度)。

让我们深入了解PID控制算法的每个组成部分:

  1. 比例(P)项:比例控制是根据误差的大小来产生输出的一部分。误差是设定值与实际值之间的差异。P项产生的输出与误差成正比。如果误差大,输出也大,从而更快地接近设定值。P项的过大或过小都可能导致系统不稳定。

  2. 积分(I)项:积分控制是为了消除系统的稳态误差。稳态误差是系统在达到目标值后仍存在的小误差。I项根据误差的积累(积分)来产生输出,它累积了误差随时间的总和。I项能够消除稳态误差,但过大的I项可能导致系统响应过度振荡。

  3. 微分(D)项:微分控制用于减小系统的过渡过程中的振荡和震荡。D项通过检测误差变化的速率来产生输出。当误差变化快速时,D项会增加输出,帮助系统更快地接近设定值。然而,过大的D项可能导致过度抑制系统的响应。

PID控制器的输出可以通过以下公式计算:

Output = K_p \times Error + K_i \times \int{Error dt} + K_d \times \frac{{dError}}{{dt}}

其中,

  • Kp​是比例增益,用于控制P项的影响。

  • Ki​是积分增益,用于控制I项的影响。

  • Kd​是微分增益,用于控制D项的影响。

  • Error是当前误差,即设定值与实际值之间的差异。

  • \int{Error dt}是误差随时间的积分,用于计算I项的输出。

  • \frac{{dError}}{{dt}} ​是误差随时间的导数,用于计算D项的输出。

在温度控制中,PID控制器会根据温度传感器读数和设定温度之间的误差来计算PID输出。输出通常是控制系统中的操作变量(如加热器功率或冷却器功率),以便调整温度接近目标温度。

对于实际应用中的PID控制,通常需要通过试验和调整来选择合适的增益值(Kp​、Ki​、Kd​)以获得稳定且高性能的控制。PID控制器是一个经典控制算法,但现代控制系统中可能会使用其他高级控制算法或控制方法来处理更复杂的情况。

1. 温度控制适合增量式PID还是位置式PID?

温度控制通常更适合使用位置式(也称为标准式)PID控制。增量式PID控制在一些特定情况下更适用,但在温度控制的典型应用中,位置式PID更为常见和实用。

位置式PID和增量式PID是两种常见的PID控制算法形式,它们的主要区别在于PID输出的计算方式。

  1. 位置式PID: 位置式PID是最常见的形式,其输出是PID控制算法直接计算得到的目标值。也就是说,PID输出是控制量(如PWM占空比或控制阀门的位置)的绝对值,直接控制系统的实际输出。位置式PID输出的变化量随着误差的变化而变化。

  2. 增量式PID: 增量式PID的输出是控制量的增量变化。它需要比较上一次和当前的PID输出,并将增量部分应用于系统。增量式PID通常需要保存上一次的PID输出状态。增量式PID适用于那些系统中,对于控制变量的增量变化更直接和合适的情况。

在温度控制中,位置式PID更为常见和直接适用。因为温度是一个连续的物理量,我们需要控制的是绝对温度值,而不是控制温度的变化量。通过位置式PID,我们可以直接计算出目标温度和实际温度之间的误差,并将PID输出直接应用于控制系统,例如调整加热器功率或控制阀门的位置,以使温度接近设定值。

增量式PID通常用于那些需要控制的是变化率或速率的系统,例如飞行器姿态控制或电机速度控制等,而不是直接控制绝对位置或数值的系统。

总结:温度控制通常适用于位置式PID,因为我们需要直接控制绝对的温度值,而不是温度变化的增量。增量式PID适用于需要控制速率或变化率的系统。

2. 在控制温度的系统中,需要引入积分项进行计算吗?引入和不引入对计算准确度有哪些关系和因素?

在控制温度的系统中,引入积分项是很常见的,尤其是为了解决系统的稳态误差问题。积分项可以帮助消除长期存在的小误差,使得系统更快地达到设定温度并保持稳定。然而,是否引入积分项以及其影响取决于具体的系统特性和控制要求。

以下是关于引入积分项的一些因素和影响:

  1. 稳态误差: 如果系统在达到设定温度后仍然存在小的稳态误差(即系统无法完全稳定在设定值附近),则引入积分项可以帮助消除这些误差,使得系统能够更准确地维持在设定温度。

  2. 积分饱和: 引入积分项可能会导致积分饱和问题。当系统初始状态较差或外部扰动较大时,积分项可能会积累很大,导致系统超过目标值。为了避免这种情况,通常会限制积分项的范围,例如使用积分分离(anti-windup)技术来控制积分项的增长。

  3. 振荡和过冲: 引入过大的积分增益可能会导致系统产生振荡或过冲现象,使系统不稳定。因此,在设置积分增益时需要谨慎,经过适当的调试和测试。

  4. 响应速度: 积分项的引入会增加系统的响应速度,但过大的积分增益可能会导致系统的响应过度迅速,引起振荡或不稳定。

  5. 噪声和扰动: 积分项对系统噪声和外部扰动比较敏感,因为它会累积这些变化。过大的积分增益可能会导致系统对噪声和扰动过于敏感,从而影响控制性能。

  6. 调参: 引入积分项会增加调参的复杂性。需要仔细选择适当的积分增益,以平衡稳态误差的消除和系统的稳定性。

总的来说,引入积分项可以提高控制系统的精度和稳定性,但需要注意的是,合适的积分增益是关键。在实际应用中,往往需要进行试验和调试来找到最佳的PID参数配置,以满足系统的控制要求。

3. 确定PID参数是一个迭代过程

确定PID参数是一个迭代过程,需要在实际系统中进行试验和调试。没有一个固定的方法可以直接确定最佳参数,因为每个系统的性质和响应都可能不同。以下是一个一般性的方法来调试PID参数:

  1. 初始参数选择: 一般来说,可以从将比例增益 Kp​ 设置为一个较小的值开始,将积分增益 Ki​ 和微分增益 Kd​ 设置为0。这样做是为了避免初始的调试过程中出现不稳定的情况。

  2. 手动调整 Kp​: 首先,通过逐步增大 Kp​ 值,观察系统响应。增大 Kp​ 会增加系统对误差的响应,但过大的 Kp​ 可能导致系统产生振荡。因此,逐步增加 Kp​ 直到系统开始产生轻微的振荡为止。

  3. 手动调整 Ki​: 一旦 Kp​ 被设置,可以开始调整积分增益 Ki​。增大 Ki​ 可以帮助消除稳态误差,但过大的 Ki​ 可能导致积分饱和和振荡。逐步增加 Ki​ 直到达到稳态时,系统误差接近零。

  4. 手动调整 Kd​: 最后,可以开始调整微分增益 Kd​。增大 Kd​ 可以减少系统的振荡,但过大的 Kd​ 可能导致过度抑制。逐步增加 Kd​ 直到系统响应变得平滑。

  5. 综合调试: 在设置 Kp​、Ki​ 和 Kd​ 后,通过逐步微调这些值来获得更好的系统响应。需要注意的是,调整这些参数时要逐步增加或减小,以免系统变得不稳定。

  6. 测试和验证: 调试好参数后,对系统进行测试,观察系统的温度响应、稳定性和控制性能。如果需要,可以进行进一步的微调。

重要的是要进行试验和测试,根据实际的系统响应来调整参数。此外,如果你的系统存在一些特殊性质(如非线性特性),可能需要考虑使用高级的自适应控制策略。

总的来说,PID参数的调整是一个迭代过程,需要根据实际情况进行试验和调试,以找到最佳的参数配置,以达到稳定、快速且准确的控制效果。

4. PID计算的结果控制输出作为PWM占空比输入的理解

当你使用PID控制算法来控制温度,其计算的结果可以被视为控制输出,通常称为“控制信号”。这个控制信号会被映射到PWM占空比,从而控制加热器的功率或其他执行器,以调整系统温度接近设定值。

理解这个过程的关键在于如何将PID输出映射到PWM占空比,以便对温度产生影响。这个映射通常是通过一些逻辑和数学计算来实现的,可以根据系统特性进行调整。

  1. PID计算: PID控制算法根据当前的温度误差(设定值与实际值之间的差异)来计算出一个控制输出。这个输出是基于比例、积分和微分项的组合,用于反映系统的状况和调整需求。

  2. 控制输出: 这个控制输出通常是一个浮点数值,代表着需要对系统进行的调整幅度。它可能为正或负,具体取决于系统误差的方向和大小。

  3. 映射到PWM占空比: 控制输出需要被映射到PWM占空比,以实际调整加热器或执行器的状态。这个映射过程需要根据你的硬件和系统特性来进行调整。

    例如,假设你的加热器是通过PWM信号控制的,占空比范围在0到100%。你需要将PID输出映射到这个占空比范围,这可能需要进行一些数学计算,将浮点数的PID输出映射到整数的占空比值。

    如果你的加热器有一个特定的功率和响应时间,你可能需要根据这些参数来决定如何映射PID输出。比如,更大的PID输出可能对应更高的占空比,以产生更多的热量。

  4. 更新PWM信号: 一旦计算出映射后的PWM占空比,你会使用这个值来更新PWM信号的参数,从而控制加热器的工作状态。

总结起来,PID控制算法计算出的控制输出是一个调整信号,它会通过映射转化为PWM占空比,从而影响加热器或执行器的工作状态,进而控制温度系统的温度。这个过程需要根据实际系统特性进行调试和优化,以确保稳定的温度控制效果。

PID是一个负反馈闭环系统,这点很重要。

4.1 具体反馈流程

首先PID算法第一步 会对目标值和实际值做一个差值计算,计算偏差之刚开始很大逐渐会变小。

每次的PID输出会作为PWM占空比的输入,传感器会对每次的检测数值进行读取,刚开始读到的数值很小,它会把这个值作为实际值传入PID输入这个时候PID的目标值还会和这个实际值进行比较,直到误差为0。

这个过程会一直进行,只是误差为0时积分项的累加值就稳定了,微分项的差值也稳定了,比例项也稳定了。也就是PID的输出就稳定了。而这个值就是PWM的占空比,这个值是三项的和的稳定值。

5. STM32F103环境下的PID代码参考示例

头文件的定义


#ifndef CCY_PTCHOT_PID_H
#define CCY_PTCHOT_PID_H

#include "main.h"

#define PID_DEBUG 1
#define PID_MAX_PWM_COUNTER 19999

/**
 * 设定PID常量
 * @param p
 * @param i
 * @param d
 */
void pid_set_constant(u8 p, u8 i, u8 d);

/**
 * 计算PID并输出结果
 * @param userValue 用户期望值
 * @param dynamicValue 传感器动态检测值
 * @return 返回计算结果
 */
u16 pid_calculate(u16 userValue, u16 dynamicValue);

#endif //CCY_PTCHOT_PID_H

算法的实现方法:

//
// Created by 83503 on 2023/8/4.
//
#include "pid.h"

//声明PID常量
static double kp = 1,
        ki = 0,
        kd = 0;

//前一次偏差
static u16 last_error;

//偏差积分
static double integral;

void pid_set_constant(u8 p, u8 i, u8 d) {
    kp = p;
    ki = i;
    kd = d;
}

/**
 *
 * @param userValue
 * @param dynamicValue
 * @return
 */
u16 pid_calculate(u16 userValue, u16 dynamicValue) {
    //当前偏差 偏差:期望-测量值
    u16 current_error = userValue - dynamicValue;
    // 计算积分项
    integral += current_error;
    // 计算微分项
    double derivative = current_error - last_error;
    // 计算PID输出
    double output = kp * current_error + ki * integral + kd * derivative;
    // 更新上一次误差
    last_error = current_error;

    // 控制输出限制在合理范围内
    if (output < 0) {
        output = 0;
    } else if (output > PID_MAX_PWM_COUNTER) {
        output = PID_MAX_PWM_COUNTER;
    }
    // 将PID输出映射到PWM占空比范围
#if PID_DEBUG == 1
    printf("");
#endif
    return (u16) output;
}

5
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区