PID算法Matlab仿真程序和C程序.doc_第1页
PID算法Matlab仿真程序和C程序.doc_第2页
PID算法Matlab仿真程序和C程序.doc_第3页
PID算法Matlab仿真程序和C程序.doc_第4页
PID算法Matlab仿真程序和C程序.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

增量式pid控制算法matlab仿真程序设一被控对象g(s)=50/(0.125s2+7s),用增量式pid控制算法编写仿真程序(输入分别为单位阶跃、正弦信号,采样时间为1ms,控制器输出限幅:-5,5,仿真曲线包括系统输出及误差曲线,并加上注释、图例)。程序如下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:1000time(k)=k*ts; s=2;if s=1 kp=10;ki=0.1;kd=15; rin(k)=1; %step signalelseif 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 controlleru(k)=u_1+du(k);%restricting the output of controllerif u(k)=5 u(k)=5;endif u(k)=110 u(k)=110;endif u(k)=10 u(k)=10;endif u(k)=-10 u(k)=-10;endu_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);endfigure(1);plot(time,rin,b,time,yout,r);xlabel(time(s);ylabel(rin,yout);figure(2);plot(time,u,r);xlabel(time(s);ylabel(u);figure(3);plot(time,rin-yout,r);xlabel(time(s);ylabel(error);figure(4);bode(q,r);dcgain(q);c语言pid演示程序#include #includetypedef 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; /当前误差 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 *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; double 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 控制量=%fn,k,spid.command,y,spid.command-y,u); u=pidcale(&spid,y); y=motorcal(&m_motor,u); k+; printf(%fn,y); fclose(fp);增量式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 ); /initialize structurevpid.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; / value与num2为共同体,共同体名laserlaserh=laser.num0;laserl=laser.num1; /title:pid参数初始化/description: proportion=0/ integral=0/ lasterror=0/input: pid的p、i控制常数和之前的误差量(pid *pp)/return: /void pidinit (pid *pp) /pid参数初始化,都置0 memset ( pp,0,sizeof(pid);/memset()的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。/ memset()函数在mem.h头文件中声明,它把数组的起始地址作为其第一个参数,/第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。/其函数原型为:void *memset(void*,int,unsigned);/头文件 /title:增量式pid算法程序/description:给出一个误差增量/input: pid的p、i控制常数和之前的误差量(pid *pp)& 当前误差量(thiserror)/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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论