单片机pid控制系统设计-pid控制电路设计

本文目录一览:

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

温度变化是大惯性的,真没有必要用PID。那样真是大材小用了!

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.

数字PID控制的设计(基于Protues的8051单片机)

/*转载:标准PID源程序

--- 工业控制中常用算法 ---*/

/*====================================================================================================

这是从网上找来的一个比较典型的PID处理程序,在使用单片机作为控制cpu时,请稍作简化,具体的PID

参数必须由具体对象通过实验确定。由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算,

而将所有参数全部用整数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可

大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余

数补偿。这个程序只是一般常用pid算法的基本架构,没有包含输入输出处理部分。

=====================================================================================================*/

#include string.h

#include stdio.h

/*====================================================================================================

PID Function

The PID (比例、积分、微分) function is used in mainly

control applications. PIDCalc performs one iteration of the PID

algorithm.

While the PID function works, main is just a dummy program showing

a typical usage.

=====================================================================================================*/

typedef struct PID {

double SetPoint; // 设定目标 Desired value

double Proportion; // 比例常数 Proportional Const

double Integral; // 积分常数 Integral Const

double Derivative; // 微分常数 Derivative Const

double LastError; // Error[-1]

double PrevError; // Error[-2]

double SumError; // Sums of Errors

} PID;

/*====================================================================================================

PID计算部分

=====================================================================================================*/

double PIDCalc( PID *pp, double NextPoint )

{

double dError, Error;

Error = pp-SetPoint - NextPoint; // 偏差

pp-SumError += Error; //

dError = pp-LastError - pp-PrevError; // 当前微分

pp-PrevError = pp-LastError;

pp-LastError = Error;

return (pp-Proportion * Error // 比例项

+ pp-Integral * pp-SumError // 积分项

+ pp-Derivative * dError // 微分项

);

}

/*====================================================================================================

Initialize PID Structure

=====================================================================================================*/

void PIDInit (PID *pp)

{

memset ( pp,0,sizeof(PID));

}

/*====================================================================================================

Main Program

=====================================================================================================*/

double sensor (void) // Dummy Sensor Function

{

return 100.0;

}

void actuator(double rDelta) // Dummy Actuator Function

{}

void main(void)

{

PID sPID; // PID Control Structure

double rOut; // PID Response (Output)

double rIn; // PID Feedback (Input)

PIDInit ( sPID ); // Initialize Structure

sPID.Proportion = 0.5; // Set PID Coefficients

sPID.Integral = 0.5;

sPID.Derivative = 0.0;

sPID.SetPoint = 100.0; // Set PID Setpoint

for (;;) { // Mock Up of PID Processing

rIn = sensor (); // Read Input

rOut = PIDCalc ( sPID,rIn ); // Perform PID Interation

actuator ( rOut ); // Effect Needed Changes

}

}

你是哪里的哦?


原文链接:http://527256.com/46292.html

相关文章

访客
访客
发布于 2022-11-12 05:15:29  回复
*********************************************************************/void PID_Math(void){ signed

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

返回顶部