PID控制本版二
https://gist.github.com/bradley219/5373998
特色:
比起第一版,加入了 最大最小值限制,暂无测试。
- PIDImpl( double dt, double max, double min, double Kp, double Kd, double Ki );
代码:
- #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
- #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
- #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控制本版二的更多相关文章
- PID控制本版一 (M100可用)
版本1 云台+无人机 https://en.wikipedia.org/wiki/PID_controller https://github.com/tekdemo/MiniPID 详细讲解 PIDC ...
- PID控制学习笔记(二)
不管是基本的PID控制还是变形的PID控制算法,其核心都是对输入信号(设定值信号.测量信号或者偏差信号等)做基本的比例.积分.微分运算,最终提供给被控过程良好的调节信号. 在过程控制仪表,特别是在数字 ...
- 数字式PID控制的应用总结
PID控制是一个二阶线性闭环控制器,通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能.PID控制优点:a. 技术成熟,b. 易被人们熟悉和掌握,c. 不需要建立数学模型 ...
- PID控制動手玩玩看
PID控制動手玩玩看 PID三個參數到底該怎麼調才好,真的是一門藝術. 雖然在Marlin韌體內有提供自動測量的功能,但是測得的結果,不見得能令人滿意,還是需要調整.可是到底該怎麼調整?從哪個參數開始 ...
- PID控制及整定算法
一.PID控制算法 PID是比例.积分.微分的简称,PID控制的难点不是编程,而是控制器的参数整定.参数整定的关键是正确地理解各参数的物理意义,PID 控制的原理可以用人对炉温的手动控制来理解.阅读本 ...
- 经典PID控制及应用体会总结
经典PID控制及应用体会总结 PID控制原理 PID是一种线性控制器,它根据给定值rin(t)与实际输出值yout(t)构成控制方案: 重点关注相关算法是如何对偏差进行处理的: PID控制器各校正环节 ...
- STM32—PID控制在直流电机中的应用
文章目录 一.PID控制算法 1.什么是PID 2.PID系数的理解 Ⅰ.比例(P)部分 Ⅱ.积分(I)部分 Ⅲ.微分(D)部分 3.PID的数字化处理 二.位置闭环控制 三.速度闭环控制 一.PID ...
- 专家PID控制仿真学习
目录 专家控制 专家系统 专家控制 学习笔记,用于记录学习 资料:<智能控制>(第四版)--刘金琨 专家系统 一.专家系统的定义 专家系统是一类包含知识和推理的智能计算机程序,其内部包含某 ...
- 【iCore3应用开发平台】发布 iCore3 应用开发平台PID控制代码
说明:1.本代码包包含FPGA和STM32F407两部分内容2.FPGA工程为出厂代码FPGA工程,版本为REV43.STM32F407为只含PID控制的ARM工程4.在使用风扇过程中,请勿将手伸入扇 ...
随机推荐
- css span宽度和css span高度成功设置经验篇
我们介绍两种情况下的对span宽度高度样式成功设置. 为了观察和实践CSS SPAN宽度和span高度成功设置,DIVCSS5新建一个css命名为“.divcss5”的盒子,设置css宽度为150px ...
- Java读取excel(兼容03和07格式)
读取excel,首先需要下载POI的jar,可以去官网下,也可以在这里下载 一.简单说明 excel2003和excel2007区别比较大,最直观的感受就是扩展名不一样,哈哈 不过,使用POI的API ...
- LINQ to Objects系列(3)深入理解Lambda表达式
Lambda表达式是学好LINQ很重要的一个知识点,后面的LINQ查询中会大量地使用到Lambda表达式.这篇文章从以下几点进行总结. 1,Lambda表达式的前世今生 2,Lambda表达式的实际运 ...
- JAVA—集合框架
ref:https://blog.csdn.net/u012961566/article/details/76915755 https://blog.csdn.net/u011240877/artic ...
- vue input输入框联想
以下是示例,样式可以自己修改.最后是效果图,其实也挺简单的,主要是用了watch监控input输入值的变化,如果数据是请后端请求可以,先请求数据. <template> <div c ...
- Angular 实现Bootstrap ScrollSpy控件
Bootstap是基于JQuery开发,Angular中不支持Bootstrap相关事件逻辑.本文基于Typecript开发了一个Angular可用的ScrollSpy控件.Scrollspy控件主要 ...
- SAP FI/CO 基本概念
每一个SAP从业者都对这些概念不陌生,理解透了这些概念,对SAP的业务体系构架才能有明确地认识. 1.集团(client)的概念:是SAP中的最高等级:每一个集团建立主数据库. 2.公司(Compan ...
- 简单三招,设计复杂ERP报表
报表无疑是ERP系统中用到的最频繁的单据之一.比如每天采购要打印采购明细帐:仓库每天要导出收货或者出货明细:销售每天要打印订单明细等.故报表的设计在ERP系统开发中占据大半江山. 不过笔者在实际工作中 ...
- MySql 正则表达式简介及使用
MySql正则表达式简介及使用 by:授客 QQ:1033553122 简介 正则表达式描述了一组字符串,该字符放置于REGEXP工具后面.作用是将一个正则表达式与一个文本串进行比较. 最简单的正则表 ...
- Android 使用RecyclerView SnapHelper详解
简介 RecyclerView在24.2.0版本中新增了SnapHelper这个辅助类,用于辅助RecyclerView在滚动结束时将Item对齐到某个位置.特别是列表横向滑动时,很多时候不会让列表滑 ...