⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pid2.cpp

📁 pid控制算法与程序
💻 CPP
字号:
#include<stdio.h>
#include<math.h>
void main()
{
	double tao;    //系统纯延时参数,一般为采样时间的整数倍
    double ts;    //采样时间
    int n;    //n=tao/ts
    
    double kp,ki,kd;    //PID控制器参数
    double error_1,error_2;    //,前1、2次的误差,在增量PID算法中需要error_2
    double error,perror,ierror,derror;    //用于计算PID输出u的参数
    double den_1,den_2,den_3;    //Z传函分母的系数
    double num_1,num_2,num_3;    //Z传函的分子系数
    double yout[500],rin,yout_1,yout_2,yout_3,u_1,u_2,u_3; 
	//系统输入、系统输出、PID控制器输出; 
	for(int i=0;i<=500;i++)
	{
		yout[i]=0;
	
	}


	//PID参数初始化 G(s)=m_k*exp(-tao*s)/[(m_t1s+1)(m_t2s+1)]
    double m_t1,m_t2,m_k,tao0,e[500];
	double x=0.0,A=0.0,T,k0,ti,td;
	printf("input m_t1:  m_t1=");
	scanf("%lf",&m_t1);
	printf("input m_t2:  m_t2=");
	scanf("%lf",&m_t2);
	printf("input m_k:  m_k=");
	scanf("%lf",&m_k);
	printf("input tao:  tao=");
	scanf("%lf",&tao);
	printf("input ts:  ts=");
	scanf("%lf",&ts);
	

     n=(int)(tao/ts+0.5);
     double u[100];
     error_1=0.0;
     error_2=0.0;
     error=0.0;
     perror=0.0;
     ierror=0.0;
     derror=0.0;
    double z1,z2,b,c;
    if (m_t1==m_t2)
	{
    z1=exp(-(ts/m_t1));      //e(-T/T1) z2=z1    pid->num_1=0;
    num_2=m_k*(1-z1-ts*z1/m_t1);
    num_3=m_k*(z1*z1-z1+ts*z1/m_t1);    
	den_1=1;
    den_2=-2*z1;
    den_3=z1*z1; 
	} 
    else
    {
    z1=exp(-(ts/m_t1));      //e(-T/T1)
    z2=exp(-(ts/m_t2));      //e(-T/T2)
    b=m_t1/(m_t2-m_t1);
    c=m_t2/(m_t1-m_t2);    
	num_1=0;
    num_2=m_k*(1+b*z1+c*z2);
    num_3=m_k*(z1*z2+b*z2+c*z1);    
	den_1=1;
    den_2=-(z1+z2);
    den_3=z1*z2; 
    }
   
  
  for(int j=0;j<n+2;j++)
  {
    u[j]=0.0;
  }

  num_2=0.058824;
  num_3=0.0;

  //参数整定
  int a=500;
  printf("input 阶跃信号 rin:  rin=");
  scanf("%lf",&rin);//阶跃信号
  for(int k=0;k<=a;k++)
	{
		yout[k]=den_2*yout_1+den_3*yout_2+num_2*u[n];//+num_3*u[n+1];
        error=rin-yout[k];
		
		 for (int j=n+1;j>0;j--)
         {
             u[j]=u[j-1];
         }
         u[0]=error;
	
		 yout_3=yout_2;
		 yout_2=yout_1;
		 yout_1=yout[k];
		 e[k]=yout_1-yout_2;
         x=e[k]*k*ts;
		 A=A+x;
		// if(yout_1=yout_3&&yout_1!=0)break;
	}
	k0=yout_1;   
	T=A/k0;
	kp=rin/k0;
	ti=1.8*T;
	td=0.167*T;
	ki=kp*ts/ti;
	kd=kp*td/ts;
	printf("kp= %lf\n",kp);
	printf("ki= %lf\n",ki);
	printf("kd= %lf\n",kd);
	printf("num_2= %lf\n",num_2);
    printf("num_3= %lf\n",num_3);
    printf("den_2= %lf\n",den_2);
    printf("den_3= %lf\n",den_3);
	printf("A= %lf\n",A);
 
   

 




}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -