一起游 手游攻略 手游评测 CW32L012的PID温度控制——算法基础

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

时间: 来源:互联网 浏览:0

一、什么是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有两种常见形式:

位置式PIDwKgZO2lU9SqAIVFVAAAN3qlv7rA736.jpg

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

C语言代码(通用):

typedef 结构体{ float kp; //比例系数float ki; //积分系数float kd; //微分系数float set_point; //设置浮点反馈值; //反馈值浮动错误; //当前误差(设定点- 反馈) 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, 浮点反馈) { if (pid==NULL) return 0.0f; //更新设定值和反馈值pid-set_point=set_point; pid-反馈=反馈; //计算当前误差pid-error=pid-set_point - pid-feedback; //积分项(带有积分限制器以防止积分饱和) pid-error_sum +=pid-error; //积分限制器:基于输出限制器和ki动态约束(也可以直接赋值固定值) float积分_max=(pid-output_max/pid-ki) * 0.8f;浮点积分最小值=(pid-output_min/pid-ki) * 0.8f; if (pid-error_sum积分_max) pid-error_sum=积分_max; if (pid-error_sum积分_最小值) pid-error_sum=积分_最小值; //位置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 (输出pid-output_min) 输出=pid-output_min; //更新最后一个错误pid-error_prev=pid-error;返回输出;}

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

wKgZPGlU9SqAdGMMAAAvPKoIl2w159.jpg

特点:输出 u(k)控制量增量,只需要叠加在最后一个控制值上(在最后一个控制输出上加减):u(k)=u(k-1)+ u(k)。

C语言代码(通用):

typedef 结构体{ float kp; //比例系数float ki; //积分系数float kd; //微分系数float set_point; //设置浮点反馈值; //反馈值浮动错误; //当前错误(设定点- 反馈) float error_prev1; //上一个错误float error_prev2; //前两个错误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, 浮点设定点, 浮点反馈) { if (pid==NULL) return 0.0f; //更新设定值和反馈值pid-set_point=set_point; pid-反馈=反馈; //计算当前误差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-错误;返回pid-output_inc;}

三、嵌入式系统如何使用PID控制算法?建立闭环反馈明确谁被控制

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

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

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

采样周期的选择基于:

香农采样定理:采样频率至少应为被控对象最大变化频率的两倍,以避免信号混叠;

被控对象的响应速度:例如直流电机的响应速度为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)以加快响应速度

如果已经达到了预期的控制效果,则可以不引入差动环节。

如果没有达到预期的控制效果,可以在上一步的基础上,从0开始慢慢增加Kid,直到超调量大大减少,响应速度基本不变,系统很快稳定下来。

标题:CW32L012的PID温度控制——算法基础
链接:https://yqqlyw.com/news/sypc/67734.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
绯红之境兑换码最新2021 礼包兑换码大全

绯红之境兑换码最新2021 礼包兑换码大全[多图],绯红之境兑换码怎么领取?绯红之境兑换码有哪些?绯红之境在今日

2026-01-05
三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法

三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法[多图],三国群英传7霸王再临怎么玩?三国群英传7霸王再临

2026-01-05
妄想山海怎么加好友 加好友方法大全

妄想山海怎么加好友 加好友方法大全[多图],妄想山海添加好友功能在哪里?妄想山海添加好友的方法是什么?好友添

2026-01-05
江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略

江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略[多图],江南百景图又见桃花村钓鱼怎么钓?又见桃花村钓

2026-01-05