算法:

struct PID {
float kp;
float kpnfac;
float ki;
float kinfac;
float kd;
}; float gCurPPM = 1300; float getCurppm() { return gCurPPM; }
float getOut(PID& pid, float dppm)
{
static float disum = 0;
static float diffLast = 0; float cppm = getCurppm();
float diff = dppm-cppm;
float dp = diff*pid.kp;
float di = diff*pid.ki; if (diff<0) {
dp *= pid.kpnfac;
di *= pid.kinfac;
}
disum += di; float out = dp + disum + (diff-diffLast)*pid.kd;
diffLast = diff; printf("Cur=%4.0f dest=%4.0f, sumi=%4.1f out=%4.0f\n", cppm, dppm, disum, out);
return out;
}

验证代码:

#define DEFAULT_PTERM			0.25f
#define DEFAULT_PNFAC 10.0f
#define DEFAULT_ITERM 0.0006f
#define DEFAULT_INFAC 0.15f int main()
{
PID pid; pid.kp = DEFAULT_PTERM;
pid.kpnfac = DEFAULT_PNFAC;
pid.ki = DEFAULT_ITERM;
pid.kinfac = DEFAULT_INFAC;
pid.kd = -0.001; for(int i=0;i <1000; i++){
float out = getOut(pid, 1900);
gCurPPM += out*2/3;
}
return 0;
}

验证输出:

Cur=1300 dest=1900, sumi= 0.4 out= 150
Cur=1400 dest=1900, sumi= 0.7 out= 126
Cur=1484 dest=1900, sumi= 0.9 out= 105
Cur=1554 dest=1900, sumi= 1.1 out= 88
Cur=1612 dest=1900, sumi= 1.3 out= 73
Cur=1661 dest=1900, sumi= 1.4 out= 61
Cur=1702 dest=1900, sumi= 1.6 out= 51
Cur=1736 dest=1900, sumi= 1.7 out= 43
Cur=1764 dest=1900, sumi= 1.7 out= 36
Cur=1788 dest=1900, sumi= 1.8 out= 30
Cur=1808 dest=1900, sumi= 1.9 out= 25
Cur=1825 dest=1900, sumi= 1.9 out= 21
Cur=1838 dest=1900, sumi= 1.9 out= 17
Cur=1850 dest=1900, sumi= 2.0 out= 14
Cur=1860 dest=1900, sumi= 2.0 out= 12
Cur=1868 dest=1900, sumi= 2.0 out= 10
Cur=1874 dest=1900, sumi= 2.0 out= 8
Cur=1880 dest=1900, sumi= 2.0 out= 7
Cur=1885 dest=1900, sumi= 2.0 out= 6
Cur=1889 dest=1900, sumi= 2.1 out= 5
Cur=1892 dest=1900, sumi= 2.1 out= 4
Cur=1895 dest=1900, sumi= 2.1 out= 3
Cur=1897 dest=1900, sumi= 2.1 out= 3
Cur=1899 dest=1900, sumi= 2.1 out= 2
Cur=1900 dest=1900, sumi= 2.1 out= 1
Cur=1901 dest=1900, sumi= 2.1 out= -1
Cur=1901 dest=1900, sumi= 2.1 out= 0
Cur=1901 dest=1900, sumi= 2.1 out= -0
Cur=1901 dest=1900, sumi= 2.1 out= 0
Cur=1901 dest=1900, sumi= 2.1 out= -0
Cur=1901 dest=1900, sumi= 2.1 out= 0
Cur=1901 dest=1900, sumi= 2.1 out= -0
Cur=1901 dest=1900, sumi= 2.1 out= 0
Cur=1901 dest=1900, sumi= 2.1 out= -0
Cur=1901 dest=1900, sumi= 2.1 out= 0
Cur=1901 dest=1900, sumi= 2.1 out= -0
Cur=1901 dest=1900, sumi= 2.1 out= 0
Cur=1901 dest=1900, sumi= 2.1 out= -0

PID算法验证的更多相关文章

  1. 线性控制原理——PID算法应用

    使用控制系统(PID)控制被控对象 PID控制的三要素:控制器,被控对象,反馈器.控制器就是一个数学模型,就PID来说,等同于PID算法.是对反馈量的一个处理与输出.通俗的说就是对于每个被控的量,我的 ...

  2. PID算法学习记录

    最近做项目需要用到PID算法,这个本来是我的专业(控制理论与控制工程),可是我好像是把这个东西全部还给老师了. 没办法,只好抽时间来学习了. 先占个座,后续将持续更新!

  3. 基于Python的函数回归算法验证

    看机器学习看到了回归函数,看了一半看不下去了,看到能用方差进行函数回归,又手痒痒了,自己推公式写代码验证: 常见的最小二乘法是一阶函数回归回归方法就是寻找方差的最小值y = kx + bxi, yiy ...

  4. 位置式PID与增量式PID算法

    位置式PID与增量式PID算法  PID控制是一个二阶线性控制器     定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能.     优点             ...

  5. PID算法笔记2

    总所周知,PID算法是个很经典的东西.而做自平衡小车,飞行器PID是一个必须翻过的坎.因此本节我们来好好讲解一下PID,根据我在学习中的体会,力求通俗易懂.并举出PID的形象例子来帮助理解PID.一. ...

  6. PID算法

    所谓PID就是比例-积分-微分的英文缩写,但并不是必须同时具备这三种算法,也可以是 PD, PI,甚至只有 P算法控制,下面分别介绍每个参数的含义:首先需要明确一个事实就是,要实现PID算法,必须在硬 ...

  7. 利用ZYNQ SOC快速打开算法验证通路(1)——MATLAB浮点数与定点二进制补码互转

    最近本人一直在学习ZYNQ SOC的使用,目的是应对科研需要,做出通用的算法验证平台.大概思想是:ZYNQ PS端负责与MATLAB等上位机数据分析与可视化软件交互:既可传输数据,也能通过上位机配置更 ...

  8. PID算法(c 语言)(转)

    PID算法(c 语言)(来自老外) #include <stdio.h> #include<math.h> //定义PID 的结构体 struct _pid { int pv; ...

  9. PID控制器开发笔记之一:PID算法原理及基本实现

    在自动控制中,PID及其衍生出来的算法是应用最广的算法之一.各个做自动控制的厂家基本都有会实现这一经典算法.我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于更多的应用场景. ...

随机推荐

  1. Codeforces Round #668 (Div. 2)【ABCD】

    比赛链接:https://codeforces.com/contest/1405 A. Permutation Forgery 题意 给出一个大小为 $n$ 的排列 $p$,定义 \begin{equ ...

  2. Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version)

    传送门 题意: 给你一个长为n的仅由'R','G','B'构成的字符串s,你需要在其中找出来一个子串.使得这个子串在"RGBRGBRGBRGB........(以RGB为循环节,我们称这个串 ...

  3. 二叉排序树的构造 && 二叉树的先序、中序、后序遍历 && 树的括号表示规则

    二叉排序树的中序遍历就是按照关键字的从小到大顺序输出(先序和后序可没有这个顺序) 一.以序列 6 8 5 7 9 3构建二叉排序树: 二叉排序树就是中序遍历之后是有序的: 构造二叉排序树步骤如下: 插 ...

  4. 设计模式(十八)——观察者模式(JDK Observable源码分析)

    1 天气预报项目需求,具体要求如下: 1) 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方). 2) 需要设计开放型 API,便于其他第三方也能接入气象 ...

  5. Dapr微服务应用开发系列2:Hello World与SDK初接触

    题记:上篇介绍了Dapr的环境配置,这次我们来动手尝试一下Dapr应用的开发 Hello World Dapr应用的Hello World其实和其他的Hello World一样简单: 首先用你喜欢的语 ...

  6. MySQL 连接管理

    目录 MySQL 连接方式 TCP/IP 连接 Socket 连接 MySQL 连接工具 自带连接工具 第三方连接工具 MySQL 连接方式 TCP/IP 连接 # TCP/IP 连接 mysql - ...

  7. spring再学习之AOP事务

    spring中的事务 spring怎么操作事务的: 事务的转播行为: 事务代码转账操作如下: 接口: public interface AccountDao { //加钱 void addMoney( ...

  8. Linux系统CentOS进入单用户模式和救援模式详解

    一.概述 目前在运维日常工作中,经常会遇到服务器异常断电.忘记root密码.系统引导文件损坏无法进入系统等等操作系统层面的问题,给运维带来诸多不便,现将上述现象的解决方法和大家分享一下,本次主要以Ce ...

  9. codeforces 6D

    D. Lizards and Basements 2 time limit per test 2 seconds memory limit per test 64 megabytes input st ...

  10. Gym 100796B Wet Boxes(思维)题解

    题意:给一个如图坐标系,每个方形都放在下面两个中间,已知一个木块湿了那么他下面所有的都会湿,显然,不能湿两次.问,每次给出一个坐标,把他弄湿,有几个木块从干变成湿了. 思路:我们把坐标系拉直,就变成了 ...