PID算法Matlab仿真程序和C程序.docx

上传人:小飞机 文档编号:3163835 上传时间:2023-03-11 格式:DOCX 页数:11 大小:39.48KB
返回 下载 相关 举报
PID算法Matlab仿真程序和C程序.docx_第1页
第1页 / 共11页
PID算法Matlab仿真程序和C程序.docx_第2页
第2页 / 共11页
PID算法Matlab仿真程序和C程序.docx_第3页
第3页 / 共11页
PID算法Matlab仿真程序和C程序.docx_第4页
第4页 / 共11页
PID算法Matlab仿真程序和C程序.docx_第5页
第5页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《PID算法Matlab仿真程序和C程序.docx》由会员分享,可在线阅读,更多相关《PID算法Matlab仿真程序和C程序.docx(11页珍藏版)》请在三一办公上搜索。

1、PID算法Matlab仿真程序和C程序增量式PID控制算法Matlab仿真程序 设一被控对象G=50/(0.125s2+7s),用增量式PID控制算法编写仿真程序。程序如下 clear all; close all; ts=0.001; sys=tf(50,0.125,7, 0); dsys=c2d(sys,ts,z); num,den=tfdata(dsys,v); u_1=0.0;u_2=0.0; y_1=0.0;y_2=0.0; x=0,0,0; error_1=0; error_2=0; for k=1:1:1000 time(k)=k*ts; S=2; if S=1 kp=10;ki

2、=0.1;kd=15; rin(k)=1; %Step Signal elseif S=2 kp=10;ki=0.1;kd=15; %Sine Signal rin(k)=0.5*sin(2*pi*k*ts); end du(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID Controller u(k)=u_1+du(k); %Restricting the output of controller if u(k)=5 u(k)=5; end if u(k)=110 u(k)=110; end if u(k)=10 u(k)=10; end if u(k)=-10 u(k)=

3、-10; end u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k); y_3=y_2;y_2=y_1;y_1=yout(k); error_1=error(k); end figure(1); plot(time,rin,b,time,yout,r); xlabel(time(s);ylabel(rin,yout); 3 figure(2); plot(time,u,r); xlabel(time(s);ylabel(u); figure(3); plot(time,rin-yout,r); xlabel(time(s);ylabel(error); figur

4、e(4); bode(Q,r); dcgain(Q); C语言PID演示程序 #include #include typedef struct PID double Command; /输入指令 double Proportion; /比例系数 double Integral; /积分系数 double Derivative; /微分系数 double preErr; /前一拍误差 double sumErr; /误差累积 PID; double PIDCale(PID *p,double feedback) double dErr,Err; Err=p-Command-feedback; /

5、当前误差 p-sumErr+=Err; /误差累加 dErr=Err-p-preErr; /误差微分 p-preErr=Err; return(p-Proportion*Err /比例项 +p-Derivative*dErr /微分项 +p-Integral*p-sumErr); /积分项 void PIDInit(PID *p) memset(p,0,sizeof(PID); /初始化 typedef struct motor double lastY; double preY; double lastU; double preU; motor; void motorInit(motor *

6、m) memset(m,0,sizeof(motor); double motorCal(motor *m,double u) double y=1.9753*m-lastY-0.9753*m-preY+0.00003284*u+0.00006568*m-lastU+0.00003284*m-preU;/二阶系统 m-preY=m-lastY; m-lastY=y; m-preU=m-lastU; m-lastU=u; return y; void main FILE *fp=fopen(data.txt,w+); PID sPID; motor m_motor; int k=0; doubl

7、e u; double y=0; PIDInit(&sPID); sPID.Proportion=2; sPID.Derivative=1; sPID.Integral=0.00001; sPID.Command=10; motorInit(&m_motor); while(k=1000) fprintf(fp,%d 设定值=%f 被控量=%f 偏差=%f 控制量4 =%fn,k,sPID.Command,y,sPID.Command-y,u); u=PIDCale(&sPID,y); y=motorCal(&m_motor,u); k+; printf(%fn,y); fclose(fp);

8、 增量式PID控制C语言代码 增量式PID控制C语言代码 / / 定义PID参数结构体 / typedef struct PID /结构体定义 int SetPoint /设定值 int Proportion; / Proportion 比例系数 int Integral; / Integral 积分系数 int Derivative; / Derivative 微分系数 int LastError; / Error-1 前一拍误差 int PreError; / Error-2 前两拍误差 PID; main PID vPID; /定义结构变量名 PIDInit ( &vPID ); /In

9、itialize Structure vPID.Proportion = 10; /Set PID Coefficients vPID.Integral = 10; / Set PID Integral vPID.Derivative = 10; / Set PID Derivative vPID. SetPoint = /根据实际情况设定 while(1) Verror=Measure; /得到AD的输出值 Error =vPID. SetPoint- Verror; /与设定值比较,得到误差值 tempi=PIDCal(&vPID, Error; laser.Value+=tempi; /

10、 Value与Num2为共同体,共同体名laser LASERH=laser.Num0; LASERL=laser.Num1; / /Title:PID参数初始化 /Description: Proportion=0 / Integral=0 / LastError=0 /Input: PID的P、I控制常数和之前的误差量 /Return: / void PIDInit (PID *pp) /PID参数初始化,都置0 memset ( pp,0,sizeof(PID); /memset的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。 / memset函数在mem.h头文件中声明,它

11、把数组的起始地址作为其第一个参数, /第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。 /其函数原型为: void *memset(void*,int,unsigned); /头文件 / /Title:增量式PID算法程序 /Description:给出一个误差增量 /Input: PID的P、I控制常数和之前的误差量& 当前误差量 /Return: 误差增量templ / int PIDCal( PID *pp, int ThisError ) /增量式PID算法 int pError,dError,iError; long templ; pError = ThisError-pp-LastError; iError = ThisError; dError = ThisError-2*(pp-LastError)+pp-PreError; /增量计算 templ=pp-Proportion*pError + pp-Integral*iError+pp-Derivative*dError; /增量 /存储误差用于下次运算 pp-PreError = pp-LastError; pp-LastError = ThisError; return (int)(templ8); 5 6

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号