当前位置:首页 > 天气预报 > 正文

单片机pid温度控制(单片机实现pid控制)

STM32的 PID和PWM墨水温度控制系统 控制方案: K_SENSOR热电偶作为温度传感器,50w电烙铁作为加温设备作为控制对象,预先设定一个温度值,微处理器为ARM公司... 查看全部基于PID算法的单片机温度控制系统设计。该误差值送到PID控制器,作为PID控制器的输入。PID控制器的输出为:误差乘比例系数Kp+Ki*误差积分+Kd*误差微分。* 当偏差绝对值小于△e时,用PID算法,提高稳定精度。

stm32单片机温度控制pid代码

单片机pid温度控制(单片机实现pid控制)

STM32的 PID和PWM墨水温度控制系统 控制方案: K_SENSOR热电偶作为温度传感器,50w电烙铁作为加温设备作为控制对象,预先设定一个温度值,微处理器为ARM公司... 查看全部

基于PID算法的单片机温度控制系统设计(实现制冷效果)

看看我以前回答过的一个问题,或许有帮助。

所谓PID指的是Proportion-Integral-Differential。翻译成中文是比例-积分-微分。

记住两句话:

1、PID是经典控制(使用年代久远)

2、PID是误差控制()

对压缩泵转速进行控制:

1、变频器-作为压缩机驱动;2、温度传感器-作为输出反馈。

PID怎么对误差控制,听我细细道来:

所谓“误差”就是命令与输出的差值。比如你希望控制压缩机转速为1500转(“命令电压”=6V),而事实上控制压缩机转速只有1000转(“输出电压”=4V),则误差: e=500转(对应电压2V)。如果泵实际转速为2000转,则误差e=-500转(注意正负号)。

该误差值送到PID控制器,作为PID控制器的输入。PID控制器的输出为:误差乘比例系数Kp+Ki*误差积分+Kd*误差微分。

Kp*e + Ki*∫edt + Kd*(de/dt) (式中的t为时间,即对时间积分、微分)

上式为三项求和(希望你能看懂),PID结果后送入电机变频器或驱动器。

从上式看出,如果没有误差,即e=0,则Kp*e=0;Kd*(de/dt)=0;而Ki*∫edt 不一定为0。三项之和不一定为0。

总之,如果“误差”存在,PID就会对变频器作调整,直到误差=0。

评价一个控制系统是否优越,有三个指标:快、稳、准。

所谓快,就是要使压力能快速地达到“命令值”(不知道你的系统要求多少时间)

所谓稳,就是要压力稳定不波动或波动量小(不知道你的系统允许多大波动)

所谓准,就是要求“命令值”与“输出值”之间的误差e小(不知道你的系统允许多大误差)

对于你的系统来说,要求“快”的话,可以增大Kp、Ki值

要求“准”的话,可以增大Ki值

要求“稳”的话,可以增大Kd值,可以减少压力波动

仔细分析可以得知:这三个指标是相互矛盾的。

如果太“快”,可能导致不“稳”;

如果太“稳”,可能导致不“快”;

只要系统稳定且存在积分Ki,该系统在静态是没有误差的(会存在动态误差);

所谓动态误差,指当“命令值”不为恒值时,“输出值”跟不上“命令值”而存在的误差。不管是谁设计的、再好的系统都存在动态误差,动态误差体现的是系统的跟踪特性,比如说,有的音响功放对高频声音不敏感,就说明功放跟踪性能不好。

调整PID参数有两种方法:1、仿真法;2、“试凑法”

仿真法我想你是不会的,介绍一下“试凑法”

“试凑法”设置PID参数的建议步骤:

1、把Ki与Kd设为0,不要积分与微分;

2、把Kp值从0开始慢慢增大,观察压力的反应速度是否在你的要求内;

3、当压力的反应速度达到你的要求,停止增大Kp值;

4、在该Kp值的基础上减少10%;

5、把Ki值从0开始慢慢增大;

6、当压力开始波动,停止增大Ki值;

7、在该Ki值的基础上减少10%;

8、把Kd值从0开始慢慢增大,观察压力的反应速度是否在你的要求内;

pic单片机pid控制算法参数整定

我这有51的

#include stdlib.h

#include "global_varible.h"

/****************************************************************************

* 模块名: PID

* 描述: PID调节子程序

* 采用PID-PD算法。在偏差绝对值大于△e时,用PD算法,以改善动态品质。

* 当偏差绝对值小于△e时,用PID算法,提高稳定精度。

* PIDout=kp*e(t)+ki*[e(t)+e(t-1)+...+e(1)]+kd*[e(t)-e(t-1)]

*============================================================================

* 入口: 无

* 出口: 无

* 改变: PID_T_Run=加热时间控制

*****************************************************************************/

void PID_Math(void)

{

signed long ee1; //偏差一阶

//signed long ee2; //偏差二阶

signed long d_out; //积分输出

if(!Flag_PID_T_OK)

return;

Flag_PID_T_OK=0;

Temp_Set=3700; //温度控制设定值37.00度

PID_e0 = Temp_Set-Temp_Now; //本次偏差

ee1 = PID_e0-PID_e1; //计算一阶偏差

//ee2 = PID_e0-2*PID_e1+PID_e2; //计算二阶偏差

if(ee1 500) //一阶偏差的限制范围

ee1 = 500;

if(ee1 -500)

ee1 = -500;

PID_e_SUM += PID_e0; //偏差之和

if(PID_e_SUM 200) //积分最多累计的温差

PID_e_SUM = 200;

if(PID_e_SUM -200)

PID_e_SUM = -200;

PID_Out = PID_kp*PID_e0+PID_kd*ee1; //计算PID比例和微分输出

if(abs(PID_e0) 200) //如果温度相差小于1.5度则计入PID积分输出

{

if(abs(PID_e0) 100) //如果温度相差大于1度时积分累计限制

{

if(PID_e_SUM 100)

PID_e_SUM = 100;

if(PID_e_SUM -100)

PID_e_SUM = -100;

}

d_out = PID_ki*PID_e_SUM; //积分输出

if(PID_e0 -5) //当前温度高于设定温度0.5度时积分累计限制

{

if(PID_e_SUM 150)

PID_e_SUM = 150;

if(PID_e_SUM 0) //当前温度高于设定温度0.5度时削弱积分正输出

d_out = 1;

}

PID_Out += d_out; //PID比例,积分和微分输出

}

else

PID_e_SUM=0;

PID_Out/=100; //恢复被PID_Out系数放大的倍数

if(PID_Out 200)

PID_Out=200;

if(PID_Out0)

PID_Out=0;

if(PID_e0 300) //当前温度比设定温度低3度则全速加热

PID_Out=200;

if(PID_e0 -20) //当前温度高于设定温度0.2度则关闭加热

PID_Out=0;

Hot_T_Run=PID_Out; //加热时间控制输出

PID_e2 = PID_e1; //保存上次偏差

PID_e1 = PID_e0; //保存当前偏差

}

////////////////////////////////////////////////////////////void PID_Math() end.