https://gist.github.com/bradley219/5373998

特色:

比起第一版,加入了 最大最小值限制,暂无测试。

  1. PIDImpl( double dt, double max, double min, double Kp, double Kd, double Ki );

代码:

pid.cpp

  1. #ifndef _PID_SOURCE_
  2. #define _PID_SOURCE_
  3.  
  4. #include <iostream>
  5. #include <cmath>
  6. #include "pid.h"
  7.  
  8. using namespace std;
  9.  
  10. class PIDImpl
  11. {
  12. public:
  13. PIDImpl( double dt, double max, double min, double Kp, double Kd, double Ki );
  14. ~PIDImpl();
  15. double calculate( double setpoint, double pv );
  16.  
  17. private:
  18. double _dt;
  19. double _max;
  20. double _min;
  21. double _Kp;
  22. double _Kd;
  23. double _Ki;
  24. double _pre_error;
  25. double _integral;
  26. };
  27.  
  28. PID::PID( double dt, double max, double min, double Kp, double Kd, double Ki )
  29. {
  30. pimpl = new PIDImpl(dt,max,min,Kp,Kd,Ki);
  31. }
  32. double PID::calculate( double setpoint, double pv )
  33. {
  34. return pimpl->calculate(setpoint,pv);
  35. }
  36. PID::~PID()
  37. {
  38. delete pimpl;
  39. }
  40.  
  41. /**
  42. * Implementation
  43. */
  44. PIDImpl::PIDImpl( double dt, double max, double min, double Kp, double Kd, double Ki ) :
  45. _dt(dt),
  46. _max(max),
  47. _min(min),
  48. _Kp(Kp),
  49. _Kd(Kd),
  50. _Ki(Ki),
  51. _pre_error(0),
  52. _integral(0)
  53. {
  54. }
  55.  
  56. double PIDImpl::calculate( double setpoint, double pv )
  57. {
  58.  
  59. // Calculate error
  60. double error = setpoint - pv;
  61.  
  62. // Proportional term
  63. double Pout = _Kp * error;
  64.  
  65. // Integral term
  66. _integral += error * _dt;
  67. double Iout = _Ki * _integral;
  68.  
  69. // Derivative term
  70. double derivative = (error - _pre_error) / _dt;
  71. double Dout = _Kd * derivative;
  72.  
  73. // Calculate total output
  74. double output = Pout + Iout + Dout;
  75.  
  76. // Restrict to max/min
  77. if( output > _max )
  78. output = _max;
  79. else if( output < _min )
  80. output = _min;
  81.  
  82. // Save error to previous error
  83. _pre_error = error;
  84.  
  85. return output;
  86. }
  87.  
  88. PIDImpl::~PIDImpl()
  89. {
  90. }
  91.  
  92. #endif

  pid.h

  1. #ifndef _PID_H_
  2. #define _PID_H_
  3.  
  4. class PIDImpl;
  5. class PID
  6. {
  7. public:
  8. // Kp - proportional gain
  9. // Ki - Integral gain
  10. // Kd - derivative gain
  11. // dt - loop interval time
  12. // max - maximum value of manipulated variable
  13. // min - minimum value of manipulated variable
  14. PID( double dt, double max, double min, double Kp, double Kd, double Ki );
  15.  
  16. // Returns the manipulated variable given a setpoint and current process value
  17. double calculate( double setpoint, double pv );
  18. ~PID();
  19.  
  20. private:
  21. PIDImpl *pimpl;
  22. };
  23.  
  24. #endif

  pid_example.cpp

  1. #include "pid.h"
  2. #include <stdio.h>
  3.  
  4. int main() {
  5.  
  6. PID pid = PID(0.1, 100, -100, 0.1, 0.01, 0.5);
  7.  
  8. double val = 20;
  9. for (int i = 0; i < 100; i++) {
  10. double inc = pid.calculate(0, val);
  11. printf("val:% 7.3f inc:% 7.3f\n", val, inc);
  12. val += inc;
  13. }
  14.  
  15. return 0;
  16. }

  

PID控制本版二的更多相关文章

  1. PID控制本版一 (M100可用)

    版本1 云台+无人机 https://en.wikipedia.org/wiki/PID_controller https://github.com/tekdemo/MiniPID 详细讲解 PIDC ...

  2. PID控制学习笔记(二)

    不管是基本的PID控制还是变形的PID控制算法,其核心都是对输入信号(设定值信号.测量信号或者偏差信号等)做基本的比例.积分.微分运算,最终提供给被控过程良好的调节信号. 在过程控制仪表,特别是在数字 ...

  3. 数字式PID控制的应用总结

    PID控制是一个二阶线性闭环控制器,通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能.PID控制优点:a. 技术成熟,b. 易被人们熟悉和掌握,c. 不需要建立数学模型 ...

  4. PID控制動手玩玩看

    PID控制動手玩玩看 PID三個參數到底該怎麼調才好,真的是一門藝術. 雖然在Marlin韌體內有提供自動測量的功能,但是測得的結果,不見得能令人滿意,還是需要調整.可是到底該怎麼調整?從哪個參數開始 ...

  5. PID控制及整定算法

    一.PID控制算法 PID是比例.积分.微分的简称,PID控制的难点不是编程,而是控制器的参数整定.参数整定的关键是正确地理解各参数的物理意义,PID 控制的原理可以用人对炉温的手动控制来理解.阅读本 ...

  6. 经典PID控制及应用体会总结

    经典PID控制及应用体会总结 PID控制原理 PID是一种线性控制器,它根据给定值rin(t)与实际输出值yout(t)构成控制方案: 重点关注相关算法是如何对偏差进行处理的: PID控制器各校正环节 ...

  7. STM32—PID控制在直流电机中的应用

    文章目录 一.PID控制算法 1.什么是PID 2.PID系数的理解 Ⅰ.比例(P)部分 Ⅱ.积分(I)部分 Ⅲ.微分(D)部分 3.PID的数字化处理 二.位置闭环控制 三.速度闭环控制 一.PID ...

  8. 专家PID控制仿真学习

    目录 专家控制 专家系统 专家控制 学习笔记,用于记录学习 资料:<智能控制>(第四版)--刘金琨 专家系统 一.专家系统的定义 专家系统是一类包含知识和推理的智能计算机程序,其内部包含某 ...

  9. 【iCore3应用开发平台】发布 iCore3 应用开发平台PID控制代码

    说明:1.本代码包包含FPGA和STM32F407两部分内容2.FPGA工程为出厂代码FPGA工程,版本为REV43.STM32F407为只含PID控制的ARM工程4.在使用风扇过程中,请勿将手伸入扇 ...

随机推荐

  1. css span宽度和css span高度成功设置经验篇

    我们介绍两种情况下的对span宽度高度样式成功设置. 为了观察和实践CSS SPAN宽度和span高度成功设置,DIVCSS5新建一个css命名为“.divcss5”的盒子,设置css宽度为150px ...

  2. Java读取excel(兼容03和07格式)

    读取excel,首先需要下载POI的jar,可以去官网下,也可以在这里下载 一.简单说明 excel2003和excel2007区别比较大,最直观的感受就是扩展名不一样,哈哈 不过,使用POI的API ...

  3. LINQ to Objects系列(3)深入理解Lambda表达式

    Lambda表达式是学好LINQ很重要的一个知识点,后面的LINQ查询中会大量地使用到Lambda表达式.这篇文章从以下几点进行总结. 1,Lambda表达式的前世今生 2,Lambda表达式的实际运 ...

  4. JAVA—集合框架

    ref:https://blog.csdn.net/u012961566/article/details/76915755 https://blog.csdn.net/u011240877/artic ...

  5. vue input输入框联想

    以下是示例,样式可以自己修改.最后是效果图,其实也挺简单的,主要是用了watch监控input输入值的变化,如果数据是请后端请求可以,先请求数据. <template> <div c ...

  6. Angular 实现Bootstrap ScrollSpy控件

    Bootstap是基于JQuery开发,Angular中不支持Bootstrap相关事件逻辑.本文基于Typecript开发了一个Angular可用的ScrollSpy控件.Scrollspy控件主要 ...

  7. SAP FI/CO 基本概念

    每一个SAP从业者都对这些概念不陌生,理解透了这些概念,对SAP的业务体系构架才能有明确地认识. 1.集团(client)的概念:是SAP中的最高等级:每一个集团建立主数据库. 2.公司(Compan ...

  8. 简单三招,设计复杂ERP报表

    报表无疑是ERP系统中用到的最频繁的单据之一.比如每天采购要打印采购明细帐:仓库每天要导出收货或者出货明细:销售每天要打印订单明细等.故报表的设计在ERP系统开发中占据大半江山. 不过笔者在实际工作中 ...

  9. MySql 正则表达式简介及使用

    MySql正则表达式简介及使用 by:授客 QQ:1033553122 简介 正则表达式描述了一组字符串,该字符放置于REGEXP工具后面.作用是将一个正则表达式与一个文本串进行比较. 最简单的正则表 ...

  10. Android 使用RecyclerView SnapHelper详解

    简介 RecyclerView在24.2.0版本中新增了SnapHelper这个辅助类,用于辅助RecyclerView在滚动结束时将Item对齐到某个位置.特别是列表横向滑动时,很多时候不会让列表滑 ...