有没有关于单片机温度控制PID算法的程序?原理详细一点,注释要有啊。。有分啊。 10
展开全部
(1) 比例系数Kp对系统性能的影响 :
比例系数加大,使系统的动作灵敏,速度加快,稳态误差减小。Kp偏大,振荡次数加多,调节时间加长。Kp太大时,系统会趋于不稳定。Kp太小,又会使系统的动作缓慢。Kp可以选负数,这主要是由执行机构、传感器以控制对象的特性决定的。如果Kc的符号选择不当对象状态(pv值)就会离控制目标的状态(sv值)越来越远,如果出现这样的情况Kp的符号就一定要取反。
(2) 积分控制Ti对系统性能的影响 :
积分作用使系统的稳定性下降,Ti小(积分作用强)会使系统不稳定,但能消除稳态误差,提高系统的控制精度。
(3) 微分控制Td对系统性能的影响 :
微分作用可以改善动态特性,Td偏大时,超调量较大,调节时间较短。Td偏小时,超调量也较大,调节时间也较长。只有Td合适,才能使超调量较小,减短调节时间。
#define MAX_PID_OUTPUT 255
#define MIN_PID_OUTPUT 0
#define MAX_INTEGRATION_ERROR 25
typedef struct {
INT16U targetValue;
INT16U Kp;
INT16U Ki;
INT16U Kd;
INT16U integrationError;
INT16U prevError;
}PID;
PID xPID,yPID;
int xError,yError;
int calcPID(PID *pid, int error) //PID
{
int output;
if (pid->Ki != 0)
{
pid->integrationError += error;
// Limit the maximum integration error
if (pid->integrationError > MAX_INTEGRATION_ERROR)
{
pid->integrationError = MAX_INTEGRATION_ERROR;
}
else if (pid->integrationError < -MAX_INTEGRATION_ERROR)
{
pid->integrationError = -MAX_INTEGRATION_ERROR;
}
}
output = pid->Kp * error + pid->Ki * pid->integrationError + pid->Kd * (error - pid->prevError);
if (output > MAX_PID_OUTPUT)
{
output = MAX_PID_OUTPUT;
}
else if (output < MIN_PID_OUTPUT)
{
output = MIN_PID_OUTPUT;
}
pid->prevError = error;
return output;
}
比例系数加大,使系统的动作灵敏,速度加快,稳态误差减小。Kp偏大,振荡次数加多,调节时间加长。Kp太大时,系统会趋于不稳定。Kp太小,又会使系统的动作缓慢。Kp可以选负数,这主要是由执行机构、传感器以控制对象的特性决定的。如果Kc的符号选择不当对象状态(pv值)就会离控制目标的状态(sv值)越来越远,如果出现这样的情况Kp的符号就一定要取反。
(2) 积分控制Ti对系统性能的影响 :
积分作用使系统的稳定性下降,Ti小(积分作用强)会使系统不稳定,但能消除稳态误差,提高系统的控制精度。
(3) 微分控制Td对系统性能的影响 :
微分作用可以改善动态特性,Td偏大时,超调量较大,调节时间较短。Td偏小时,超调量也较大,调节时间也较长。只有Td合适,才能使超调量较小,减短调节时间。
#define MAX_PID_OUTPUT 255
#define MIN_PID_OUTPUT 0
#define MAX_INTEGRATION_ERROR 25
typedef struct {
INT16U targetValue;
INT16U Kp;
INT16U Ki;
INT16U Kd;
INT16U integrationError;
INT16U prevError;
}PID;
PID xPID,yPID;
int xError,yError;
int calcPID(PID *pid, int error) //PID
{
int output;
if (pid->Ki != 0)
{
pid->integrationError += error;
// Limit the maximum integration error
if (pid->integrationError > MAX_INTEGRATION_ERROR)
{
pid->integrationError = MAX_INTEGRATION_ERROR;
}
else if (pid->integrationError < -MAX_INTEGRATION_ERROR)
{
pid->integrationError = -MAX_INTEGRATION_ERROR;
}
}
output = pid->Kp * error + pid->Ki * pid->integrationError + pid->Kd * (error - pid->prevError);
if (output > MAX_PID_OUTPUT)
{
output = MAX_PID_OUTPUT;
}
else if (output < MIN_PID_OUTPUT)
{
output = MIN_PID_OUTPUT;
}
pid->prevError = error;
return output;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询