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

特色:

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

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

代码:

pid.cpp

#ifndef _PID_SOURCE_
#define _PID_SOURCE_ #include <iostream>
#include <cmath>
#include "pid.h" using namespace std; class PIDImpl
{
public:
PIDImpl( double dt, double max, double min, double Kp, double Kd, double Ki );
~PIDImpl();
double calculate( double setpoint, double pv ); private:
double _dt;
double _max;
double _min;
double _Kp;
double _Kd;
double _Ki;
double _pre_error;
double _integral;
}; PID::PID( double dt, double max, double min, double Kp, double Kd, double Ki )
{
pimpl = new PIDImpl(dt,max,min,Kp,Kd,Ki);
}
double PID::calculate( double setpoint, double pv )
{
return pimpl->calculate(setpoint,pv);
}
PID::~PID()
{
delete pimpl;
} /**
* Implementation
*/
PIDImpl::PIDImpl( double dt, double max, double min, double Kp, double Kd, double Ki ) :
_dt(dt),
_max(max),
_min(min),
_Kp(Kp),
_Kd(Kd),
_Ki(Ki),
_pre_error(0),
_integral(0)
{
} double PIDImpl::calculate( double setpoint, double pv )
{ // Calculate error
double error = setpoint - pv; // Proportional term
double Pout = _Kp * error; // Integral term
_integral += error * _dt;
double Iout = _Ki * _integral; // Derivative term
double derivative = (error - _pre_error) / _dt;
double Dout = _Kd * derivative; // Calculate total output
double output = Pout + Iout + Dout; // Restrict to max/min
if( output > _max )
output = _max;
else if( output < _min )
output = _min; // Save error to previous error
_pre_error = error; return output;
} PIDImpl::~PIDImpl()
{
} #endif

  pid.h

#ifndef _PID_H_
#define _PID_H_ class PIDImpl;
class PID
{
public:
// Kp - proportional gain
// Ki - Integral gain
// Kd - derivative gain
// dt - loop interval time
// max - maximum value of manipulated variable
// min - minimum value of manipulated variable
PID( double dt, double max, double min, double Kp, double Kd, double Ki ); // Returns the manipulated variable given a setpoint and current process value
double calculate( double setpoint, double pv );
~PID(); private:
PIDImpl *pimpl;
}; #endif

  pid_example.cpp

#include "pid.h"
#include <stdio.h> int main() { PID pid = PID(0.1, 100, -100, 0.1, 0.01, 0.5); double val = 20;
for (int i = 0; i < 100; i++) {
double inc = pid.calculate(0, val);
printf("val:% 7.3f inc:% 7.3f\n", val, inc);
val += inc;
} return 0;
}

  

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. 【转】SAP HANA学习资料大全[非常完善的学习资料汇总]

    Check out this SDN blog if you plan to write HANA Certification exam http://scn.sap.com/community/ha ...

  2. [android] 手机卫士输入框抖动和手机震动

    查看apiDemos,找到View/Animation/shake找到对应的动画代码,直接拷贝过来 当导入一个项目的时候,报R文件不存在,很多情况是xml文件出错了 Animation shake = ...

  3. Mysql替换两个字段的内容(字符串)

    问题:用一条sql来替换两个字段的内容 表内容:  待优化sql: update student set name=CONCAT(name,dname),dname=SUBSTR(name FROM ...

  4. Java面试中遇到的坑【填坑篇】

    看到大家对上篇<Java面试中遇到的坑>一文表现出强力的关注度,说明大家确实在面试中遇到了类似的难题.大家在文章留言处积极留言探讨面试中遇到的问题,其中几位同学还提出了自己的见解,我感到非 ...

  5. EF框架的code first

    需要添加EntityFramework的引用,在NuGet(在工具--库程序包管理--程序包管理控制台) 控制台输入Install-Package EntityFramework,目前版本是6.1.3 ...

  6. 【读书笔记】iOS-网络-解析响应负载

    Web Service可以通过多种格式返回结构化数据, 不过大多数时候使用的是XML与JSON.也可以让应用只接收HTML结构的数据.实现了这些Web Service或是接收HTML文档的应用必须能解 ...

  7. 百度自动推送js

    <!DOCTYPE html> <!-- saved from url=(0014)about:internet --> <html> <head> & ...

  8. win7下解决vs2015新建项目,提示“未将对象引用设置到引用实例“的问题

    问题描述: 打开vs2015新建c++项目时,出现有如下内容的对话框“未将对象引用设置到引用实例”的提示 解决方法: 1.  温馨提示:千万不要一冲动,就去卸载vs2015!! win7下安装vs20 ...

  9. MSCRM中报表开发一:创建基于SQL报表

    1.       新建报表项目.打开SQL Server Business Intelligence Development Studio,点击 文件 > 新建 > 项目,项目类型选择 商 ...

  10. NetBeans 打开项目中文乱码最简单的解决办法

    网上各种修改配置文件,中文乱码还是没有解决,其实不是NetBeans的问题,是编辑器设置的字符集不支持中文,最简单的办法:!!! 设置新字体即可 !!!