欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C++实现PID控制算法.doc

    • 资源ID:33464104       资源大小:418.50KB        全文页数:4页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C++实现PID控制算法.doc

    -作者xxxx-日期xxxxC+实现PID控制算法【精品文档】C+实现PID控制算法|C+/VC/MFC/PID算法2008-06-10 18:50第一步:控制系统的结构仿真我们要用C+实现对这个单输入单输出系统的PID控制算法,就需要先进行结构仿真,系统结构和对象的数学模型如上图所示,我们取定参数:K=2、T1=1、T2=2.5,tao=0.6(tao代表上面那个延时参数)。系统性能指标要求:超调<=10%,调节时间Ts<=10秒,绘制出系统的单位阶跃响应。控制器采用PID控制器,控制器参数包括:kp、ki、kd、T(采样时间)。对被控对象采用Z变换进行离散化,离散化后的离散化对象为:yout(k)=-den(2)yout(k-1)-den(3)yout(k-2)+num(2)u(k-1)+num(3)u(k-2)           tao=0yout(k)=-den(2)yout(k-1)-den(3)yout(k-2)+num(2)u(k-1-n)+num(3)u(k-2-n)           tao/T=n,n>1为整数den、num参数的获取参看“C+实现PID控制算法 理论分析|C+/VC/MFC/PID算法”2、参数声明在算法中要用到很多参数,为了方便我们定义一个结构体。typedef struct tagPid     double tao;    /系统纯延时参数,一般为采样时间的整数倍    double ts;    /采样时间    int n;    /n=tao/ts    double rin,yout,u;    /系统输入、系统输出、PID控制器输出    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_2; /系统输出过去时刻的值     CArray<double,double> u_;     /控制器过去时刻的输出值,就是上面公式中的u(k-2-n) 等    int size_Yout;/Yout的大小,算法循环次数,每次的输出值计入数组Yout,用来绘制输出曲线     CArray<double,double> Yout; /输出数据数组    double maxYout,minYout; /输出值的最大值和最小值Pid;定义控制对象参数:double m_t1,m_t2,m_k,m_tao; /控制对象参数3、初始化参数void CICDoc:PidInit(Pid* pid)m_t1=1;m_t2=2.5;m_k=2;pid->ts=0.1;pid->tao=0.6;pid->n=(int)(pid->tao/pid->ts+0.5);pid->rin=1;pid->yout=0.0;pid->u=0.0;pid->kp=0.70;pid->ki=0.15;pid->kd=0.90;pid->error_1=0.0;pid->error_2=0.0;pid->error=0.0;pid->perror=0.0;pid->ierror=0.0;pid->derror=0.0;double z1,z2,b,c;if (m_t1=m_t2)   z1=exp(-(pid->ts/m_t1);      /e(-T/T1) z2=z1    pid->num_1=0;    pid->num_2=m_k*(1-z1-pid->ts*z1/m_t1);    pid->num_3=m_k*(z1*z1-z1+pid->ts*z1/m_t1);    pid->den_1=1;    pid->den_2=-2*z1;    pid->den_3=z1*z1; else    z1=exp(-(pid->ts/m_t1);      /e(-T/T1)    z2=exp(-(pid->ts/m_t2);      /e(-T/T2)    b=m_t1/(m_t2-m_t1);    c=m_t2/(m_t1-m_t2);    pid->num_1=0;    pid->num_2=m_k*(1+b*z1+c*z2);    pid->num_3=m_k*(z1*z2+b*z2+c*z1);    pid->den_1=1;    pid->den_2=-(z1+z2);    pid->den_3=z1*z2; pid->yout_0=0.0;pid->yout_1=0.0;pid->u_.SetSize(pid->n+2,0);for (int i=0;i<pid->n+2;i+)    pid->u_i=0.0;pid->size_Yout=500;pid->Yout.SetSize(pid->size_Yout); for (int i=0;i<pid->size_Yout-1;i+)    pid->Youti=0.0;/最大值和最小值初始化为第一个值pid->maxYout=pid->Yout0;pid->minYout=pid->Yout0;4、PID控制算法    for (int k=0;k<pid.size_Yout;k+)              pid.rin=1;    /阶跃信号         pid.u=pid.kp*pid.perror+pid.ki*pid.ierror+pid.kd*pid.derror;        /输出限幅        if (pid.u>10)                      pid.u=10;                 if (pid.u<-10)                      pid.u=-10;                  pid.yout=(pid.den_2)*(pid.yout_0)+(pid.den_3)*(pid.yout_1)+(pid.num_2)*(pid.u_pid.n)+(pid.num_3)*(pid.u_pid.n+1);         pid.error=(pid.rin)-(pid.yout);         pid.perror=pid.error;         pid.ierror=pid.ierror+pid.error*pid.ts;         pid.derror=(pid.error-pid.error_1)/pid.ts;         pid.error_2=pid.error_1;         pid.error_1=pid.error;         pid.yout_1=pid.yout_0;         pid.yout_0=pid.yout;        for (int j=pid.n+1;j>0;j-)                      pid.u_j=pid.u_j-1;                  pid.u_0=pid.u;         pid.Youtk=pid.yout;        /得到最大输出值        if (pid.Youtk>pid.maxYout)                      pid.maxYout=pid.Youtk;                 /得到最小输出值        if (pid.Youtk<pid.minYout)                      pid.minYout=pid.Youtk;              【精品文档】

    注意事项

    本文(C++实现PID控制算法.doc)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开