0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32L012的PID温度控制——算法基础

CW32生态社区 来源:CW32生态社区 作者:CW32生态社区 2026-01-05 16:27 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、什么是PID 控制算法

wKgZPGlU9SmAJD1EAAAQ7OK9QZ8910.jpg

PID 控制算法是比例(Proportional)- 积分(Integral)- 微分(Derivative) 控制的简称,是工业控制、嵌入式系统中最经典、应用最广泛的闭环控制算法。它的核心思想是通过偏差(设定值与实际值的差值)的比例、积分、微分三个环节的加权组合,计算出控制量,使系统的实际输出快速、稳定地逼近设定值

二、核心公式(连续域)

wKgZO2lU9SmAJlX6AAAMNnXF6as787.jpg

wKgZPGlU9SmATD4AAABbWOXML2o481.jpg

比例环节(P)

核心作用:即时响应偏差,偏差越大,控制量越大。

缺点:仅用 P 控制会存在稳态误差(系统稳定后,实际值与设定值仍有差距);Kp过大会导致系统震荡。

积分环节(I)

核心作用:累积历史偏差,只要存在偏差,积分项就会持续增大,直到偏差为 0,从而消除稳态误差。

缺点:积分累积会导致系统超调(实际值超过设定值),甚至震荡;系统启动初期积分饱和会影响响应速度。

微分环节(D)

核心作用:预测偏差变化趋势,偏差变化越快,微分项输出越大,提前抑制偏差的变化(类似 “阻尼” 作用)。

缺点:对噪声敏感传感器的微小波动会被放大);Kd过大会导致系统响应迟缓。

离散化公式嵌入式系统常用)

嵌入式 MCU离散采样系统,无法直接计算连续的积分和微分,需要将上述的连续域PID 公式离散化,用数值积分数值微分替代连续运算,得到离散 PID 公式

设系统采样周期为 Ts,第 k 次采样时刻的偏差为 e(k)=r(k)-y(k)(设定值-实际采样值),则离散 PID 有两种常用形式:

位置式PID

wKgZO2lU9SqAIVFVAAAN3qlv7rA736.jpg

特点:输出 u(k) 是绝对控制量,也就是阀门开度(如电机的目标占空比、舵机的目标角度)。

C语言代码(通用):

typedef struct {
    float kp;          // 比例系数
    float ki;          // 积分系数
    float kd;          // 微分系数
    float set_point;   // 设定值
    float feedback;    // 反馈值
    float error;       // 当前误差 (set_point - feedback)
    float error_sum;   // 误差积分和(防止积分饱和)
    float error_prev;  // 上一次误差(微分用)
    float output_max;  // 输出最大值
    float output_min;  // 输出最小值
} PID_Positional;
/**
- @brief 位置式 PID 核心计算(无初始化函数,参数需外部赋值)
- @param pid: 位置式 PID 结构体指针
- @param set_point: 设定值
- @param feedback: 反馈值
- @return 位置式 PID 输出值
*/
float PID_Positional_Calc(PID_Positional *pid, float set_point, float feedback) {
    if (pid == NULL) return 0.0f;
    // 更新设定值和反馈值
    pid->set_point = set_point;
    pid->feedback = feedback;
    // 计算当前误差
    pid->error = pid->set_point - pid->feedback;
    // 积分项(带积分限幅,防止积分饱和)
    pid->error_sum += pid->error;
    // 积分限幅:根据输出限幅和 ki 动态约束(也可直接赋值固定值)
    float integral_max = (pid->output_max / pid->ki) * 0.8f;
    float integral_min = (pid->output_min / pid->ki) * 0.8f;
    if (pid->error_sum > integral_max) pid->error_sum = integral_max;
    if (pid->error_sum < integral_min) pid- >error_sum = integral_min;
    // 位置式 PID 核心公式
    float output = pid->kp * pid->error +                    // 比例项
                   pid->ki * pid->error_sum +                // 积分项
                   pid->kd * (pid->error - pid->error_prev); // 微分项
    // 输出限幅
    if (output > pid->output_max) output = pid->output_max;
    if (output < pid- >output_min) output = pid->output_min;
    // 更新上一次误差
    pid->error_prev = pid->error;
    return output;
}

2.增量式 PID

计算相邻两次控制量的差值 Δ u(k),公式推导:

wKgZPGlU9SqAdGMMAAAvPKoIl2w159.jpg

特点:输出Δ u(k)控制量增量,只需叠加到上一次的控制量上(在上一次的控制输出上进行加减):u(k)=u(k-1)+Δ u(k)。

C语言代码(通用):

typedef struct {
    float kp;          // 比例系数
    float ki;          // 积分系数
    float kd;          // 微分系数
    float set_point;   // 设定值
    float feedback;    // 反馈值
    float error;       // 当前误差 (set_point - feedback)
    float error_prev1; // 前1次误差
    float error_prev2; // 前2次误差
    float output_inc;  // 增量输出
    float output_max;  // 输出最大值(用于增量限幅)
    float output_min;  // 输出最小值(用于增量限幅)
} PID_Incremental;
/**
@brief 增量式 PID 核心计算(无初始化函数,参数需外部赋值)
@param pid: 增量式 PID 结构体指针
@param set_point: 设定值
@param feedback: 反馈值
@return 增量式 PID 输出增量
*/
float PID_Incremental_Calc(PID_Incremental *pid, float set_point, float feedback) {
    if (pid == NULL) return 0.0f;
    // 更新设定值和反馈值
    pid->set_point = set_point;
    pid->feedback = feedback;
    // 计算当前误差
    pid->error = pid->set_point - pid->feedback;
    // 增量式 PID 核心公式
    pid->output_inc = pid->kp * (pid->error - pid->error_prev1) +          // 比例增量
                      pid->ki * pid->error +                              // 积分增量
                      pid->kd * (pid->error - 2*pid->error_prev1 + pid->error_prev2); // 微分增量
    // 增量限幅(避免单次增量过大)
    float inc_max = (pid->output_max - pid->output_min) / 2;
    if (pid->output_inc > inc_max) pid->output_inc = inc_max;
    if (pid->output_inc < -inc_max) pid- >output_inc = -inc_max;
    // 更新误差历史(前2次 → 前1次,前1次 → 当前)
    pid->error_prev2 = pid->error_prev1;
    pid->error_prev1 = pid->error;
    return pid->output_inc;
}

三、嵌入式系统如何使用PID控制算法?

建立闭环反馈

明确被控对象

被控对象:比如温度、机器人关节、直流电机转速等;

选择合适的采样周期对被控变量进行采样

采集能反应被控对象当前状态的信号

采样周期的选择依据:

香农采样定理:采样频率至少是被控对象最高变化频率的 2 倍,避免信号混叠;

被控对象响应速度:比如直流电机响应速度为 ms 级,采样周期设置为1~10ms;温度这类慢响应对象,采样周期设置为1~5s

由此我们得到了被控对象温度的实际温度

PID运算出输出量

将目标值和采样值送入PID公式进行计算

需要注意:

抗积分饱和:当 PID 输出达到执行器最大 / 最小量程时,停止积分累加;

积分分离:当误差|ek|大于设定阈值时,暂停积分项运算,避免积分饱和导致的超调;

输出到执行器

将PID公式运算出来的结果作用到输出执行器

需要注意:

数值限幅:运算后必须将输出量限制在执行器的有效范围(比如 PWM 占空比 0~100%、DAC 输出 0~4095),避免输出超限损坏执行器;

PID参数的调参(Kp,Ki,Kd)

建立好闭环反馈环节后就可以对PID参数进行整定了,我们实际最多使用的是经验试凑法,这里只分享试凑法:

试凑法的核心逻辑:先调 P,再调 I,最后调 D,每次只改一个参数,观察系统响应,逐步逼近最优值。

只调比例环节(P),关闭 I 和 D

Ki=0,Kd=0,K_p 从 0 开始缓慢增大;直到响应较快,实际值快速接近设定值,轻微震荡后稳定,稳态误差较小

wKgZO2lU9SqARUcJAAA4KOarfRk910.jpg

(此时可能会有静态误差,即输出一直达不到目标值这种情况)

Kp过大-->系统可能会震荡

Kp过小-->系统响应较慢, 可能达不到目标值

加入积分环节(I),消除稳态误差

为了消除静态误差,加入积分环节,在Kp已有的基础上,Kd=0,加入Ki,Ki 从 0 开始缓慢增大,直到系统能消除静态误差,并且不发生震荡

wKgZPGlU9SqAYlvOAAA7AA4660I327.jpg

wKgZPGlU9SuATW43AABWDlx2zrE696.jpg

(要注意抗积分饱和,不然系统极易发生震荡)

Ki过大-->系统可能会震荡

Ki过小-->系统依旧有静差

加入微分环节(D),加快响应

若已达到预期的控制效果可不引入微分环节。

若未达到预期的控制效果,可以在前面的基础上使Kid从 0 开始缓慢增大,直到超调大幅减小,响应速度基本不变,系统快速稳定。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 温度控制
    +关注

    关注

    7

    文章

    357

    浏览量

    39235
  • PID
    PID
    +关注

    关注

    38

    文章

    1506

    浏览量

    92143
  • 控制算法
    +关注

    关注

    4

    文章

    177

    浏览量

    22867
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FOC控制中如何利用芯片内部的运放设计电流采样电路?

    最近开发电机控制的项目,我开始使用最新的CW32L012做主控,CW32L012作为混合信号MCU,相比于传统MCU控制,集成度较高,性能当然也更好,加之又是48Pin的芯片,因此我开
    的头像 发表于 01-05 16:50 3034次阅读
    FOC<b class='flag-5'>控制</b>中如何利用芯片内部的运放设计电流采样电路?

    坚持继续布局32位MCU,进一步完善产品阵容,96Mhz主频CW32L012新品发布!

    基于CW32L01x系列低功耗微控制器家族的全新成员:CW32L012系列产品。 CW32L012基于ARM® Cortex-M0+内核,主频高达96MHz,同时集成了CORDIC硬件
    发表于 07-16 16:32

    **CW32L012****开发评估板的第一个程序**

    CW32L012****开发评估板的第一个程序 最近以15.99在CW32生态社区入手了这块CW32L012开发评估板,我迫不及待的烧录进电灯程序,看看这块板子是否是正常的,能否满足我后面的学习
    发表于 11-22 00:09

    CW32L012小型机器人控制评估板活动 四足机器人+智能小车 开箱评测

    。 这次CW32L012的评测活动,CW32生态社区将开发板、以及各类套件与相关资料(技术资料、例程代码、视频教程等)准备得非常丰富,对初学者非常地有好,可以说是手把手带你入门,新手小白可以趁机入手
    发表于 11-24 23:44

    基于PID算法温度控制

    利用安芯一号单片机控制温度加热器,软件实现PID算法,利用温度传感器返回温度值,将
    发表于 11-04 15:34

    温度控制PID算法的C语言程序

    温度控制PID算法的C语言程序,以前寫論文收集的一些資料
    发表于 06-06 10:00 66次下载

    温度控制PID算法及C程序实现

    温度控制PID算法j较为复杂,下面结合实际浅显易懂的阐述一下PID控制理论,将
    发表于 05-31 16:31 121次下载

    基于改进PID控制算法的火电厂过热温度控制

    基于改进PID控制算法的火电厂过热温度控制
    发表于 07-01 16:20 39次下载

    基于CW32的PID温度控制案例分享

    PID温控系统是一种常用的控制系统,用于实现对温度变量的精确控制PID算法根据当前的
    的头像 发表于 08-14 18:21 4155次阅读
    基于<b class='flag-5'>CW</b>32的<b class='flag-5'>PID</b><b class='flag-5'>温度</b><b class='flag-5'>控制</b>案例分享

    坚持继续布局32位MCU,进一步完善产品阵容,96Mhz主频CW32L012新品发布!

    CW32L012基于ARM® Cortex-M0+内核,主频高达96MHz,同时集成了CORDIC硬件单元、扩展算术运算单元(EAU),可以提供部分数学函数、算术运算的硬件加速,特别适用于电机控制、电源、计量、信号处理等应用。
    的头像 发表于 07-16 16:34 1622次阅读
    坚持继续布局32位MCU,进一步完善产品阵容,96Mhz主频<b class='flag-5'>CW32L012</b>新品发布!

    使用芯源CW32的CW32L012开发评估板做了spi屏幕驱动

    CW32生态社区以极高的性价比入手了这块CW32L012开发评估板,开发板以底板、核心板、1.77寸TFT显示屏构成,所有的IO口都引出了排针,这点好评,使用杜邦线可以非常方便的连接其他模块。引脚
    的头像 发表于 11-21 11:34 907次阅读
    使用芯源<b class='flag-5'>CW</b>32的<b class='flag-5'>CW32L012</b>开发评估板做了spi屏幕驱动

    CW32L012小机器人的电机控制

    线的大功率调速,电机的控制性能直接决定了系统的响应速度、运行精度、能耗效率与稳定性。这里分享CW32L012小机器人的正反转、调速的电机控制 电机的正反转 从配套的开发板资料介绍中可以知道,这是电机的驱动芯片RZ7899 从立创
    的头像 发表于 11-21 13:18 2616次阅读
    <b class='flag-5'>CW32L012</b>小机器人的电机<b class='flag-5'>控制</b>

    CW32L012与STM32F103的三角运算性能对比

    没有硬件浮点运算单元。 但在运算三角函数时,CW32L012支持CORDIC算法。 二、 三角运算性能具体分析 1:标准库浮点运算(如 math.h 的 sinf, cosf) 这是最常用但也是最慢的方式。 STM32F103C8 :
    的头像 发表于 12-29 15:32 2598次阅读
    <b class='flag-5'>CW32L012</b>与STM32F103的三角运算性能对比

    CW32L012与STM32G431的CORDIC三角函数运算性能对比

    本文对比均为作者实测,结果仅供参考,可附代码供有意者评估~ STM32G431是STM32家族中较新的产品。CW32L012也是武汉芯源半导体最新推出的混合信号MCU,让我们深入分析基于各自芯片
    的头像 发表于 12-29 15:55 2914次阅读
    <b class='flag-5'>CW32L012</b>与STM32G431的CORDIC三角函数运算性能对比

    CW32L012电压电流表设计思路

    CW32L012C8T6 定位为 电机控制、电源管理、智能仪表、工业传感器 等领域的高性价比解决方案,尤其适合需要 高精度模拟信号处理 + 复杂数字控制 的混合信号系统, ARM
    的头像 发表于 03-31 21:32 683次阅读