张力控制pid增益(kp)自适应算法详解(含scl和梯形图完整源代码)
时间: 2023-06-05 13:02:50 浏览: 1154
张力控制详解
张力控制PID增益自适应算法是一种控制方法,旨在消除材料拉伸或收缩时可能产生的误差。该算法通过使用PID控制器,能够实现对张力控制系统的稳定性和精度的提高。
该算法中使用的自适应算法包括SCL和梯形图。SCL算法是一种使用脉冲反应法(PR)来计算系统动态特性的方法。它能够根据测量的系统输出和参考输入数据,推导出控制器的增益值,并进行调整。梯形图算法是一种用于预测系统响应的方法,该方法利用梯形曲线来模拟系统操作。
自适应算法的源代码如下:
#include<stdio.h>
#include<math.h>
#define kc 500
#define Tn 0.2
#define Tu 0.05
#define DT 1e-3//模拟周期
#define r 10 //期望张力
#define k 100 //控制器增益
#define T 0.3 //积分时间
#define PID_MODE 2 //选择PID模式(位置型或增量型)
double SCL(double x, double d, double T)//SCL函数
{
static double z[2];
static double y[2];
double e;
double q;
double u;
double y0;
double y1;
double z0;
double z1;
e=x-d;
q=kc/T;
u=z[1]+q*e;
y0=u;
y1=y[1];
z0=u;
z1=z[1];
y[1]=y0;
z[1]=z0;
return y1;
}
double T_function(double x, double T_pos, double T_neg)//梯形函数
{
if(x>=T_pos)
return 1.0;
else if(x<=T_neg)
return -1.0;
else
return (2.0*x-T_pos-T_neg)/(T_pos-T_neg);
}
double pid_control(double x, double d, double *z)//PID控制器
{
static double e;
static double e1;
static double u;
static double delta_u;
static double I;
static int action;
e=x-d;
delta_u=k*(e-e1);
if(PID_MODE==2)
{
u=*z+delta_u+I;
I=I+k*T*e;
}
else
u=k*(e+T*e/Tn+Tu*delta_u);
e1=e;
*z=u;
return u;
}
int main()
{
double x,r,x_predelta,T_pos,T_neg;
double T_predelta;
double delta_x,delta_t,P;
double z=0.0, u;
double T_p,T_i,T_d;
double t=0.0;
T_pos=0.1;
T_neg=-0.1;
T_predelta=0.02;
while(1)
{
x=SCL(x,r,T_p);
x_predelta=T_function(x,T_pos,T_neg);
delta_x=fabs(x-x_predelta);
T_i=SCL(delta_t,delta_x,T_p);
T_d=T_function(delta_t,T_predelta,0);
P=pid_control(delta_t,delta_x,&z);
u=P+(T_i-T_d)/k;
r+=u*DT;
delta_t+=DT;
printf("%g,%g,%g,%g,%g\n",t,x,r,delta_x,u);
t+=DT;
//每5秒改变期望张力值
if(t>=5.0)
{
r=-r;
t=0.0;
}
//控制张力值在最大最小值内
if(r>=20)
r=20;
else if(r<=-20)
r=-20;
//终止程序
if(t>=40.0)
break;
}
return 0;
}
通过该自适应算法,我们能够有效地控制材料的张力,并减少由于材料伸缩不一造成的误差,从而提高材料的生产效率。
阅读全文