PID算法验证
算法:
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算法验证的更多相关文章
- 线性控制原理——PID算法应用
使用控制系统(PID)控制被控对象 PID控制的三要素:控制器,被控对象,反馈器.控制器就是一个数学模型,就PID来说,等同于PID算法.是对反馈量的一个处理与输出.通俗的说就是对于每个被控的量,我的 ...
- PID算法学习记录
最近做项目需要用到PID算法,这个本来是我的专业(控制理论与控制工程),可是我好像是把这个东西全部还给老师了. 没办法,只好抽时间来学习了. 先占个座,后续将持续更新!
- 基于Python的函数回归算法验证
看机器学习看到了回归函数,看了一半看不下去了,看到能用方差进行函数回归,又手痒痒了,自己推公式写代码验证: 常见的最小二乘法是一阶函数回归回归方法就是寻找方差的最小值y = kx + bxi, yiy ...
- 位置式PID与增量式PID算法
位置式PID与增量式PID算法 PID控制是一个二阶线性控制器 定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能. 优点 ...
- PID算法笔记2
总所周知,PID算法是个很经典的东西.而做自平衡小车,飞行器PID是一个必须翻过的坎.因此本节我们来好好讲解一下PID,根据我在学习中的体会,力求通俗易懂.并举出PID的形象例子来帮助理解PID.一. ...
- PID算法
所谓PID就是比例-积分-微分的英文缩写,但并不是必须同时具备这三种算法,也可以是 PD, PI,甚至只有 P算法控制,下面分别介绍每个参数的含义:首先需要明确一个事实就是,要实现PID算法,必须在硬 ...
- 利用ZYNQ SOC快速打开算法验证通路(1)——MATLAB浮点数与定点二进制补码互转
最近本人一直在学习ZYNQ SOC的使用,目的是应对科研需要,做出通用的算法验证平台.大概思想是:ZYNQ PS端负责与MATLAB等上位机数据分析与可视化软件交互:既可传输数据,也能通过上位机配置更 ...
- PID算法(c 语言)(转)
PID算法(c 语言)(来自老外) #include <stdio.h> #include<math.h> //定义PID 的结构体 struct _pid { int pv; ...
- PID控制器开发笔记之一:PID算法原理及基本实现
在自动控制中,PID及其衍生出来的算法是应用最广的算法之一.各个做自动控制的厂家基本都有会实现这一经典算法.我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于更多的应用场景. ...
随机推荐
- sql语句定义和执行顺序
sql语句定义的顺序 (1) SELECT (2)DISTINCT<select_list> (3) FROM <left_table> (4) <join_type&g ...
- HDU5407 CRB and Candies 【LCM递推】
HDU5407 CRB and Candies 题意: 计算\(LCM(C(n,0),C(n,1),C(n,2),\cdots,C(n,n-1),C(n,n))\) \(n\le 10^6\) 题解: ...
- POJ2932 Coneology【圆扫描线】
POJ2932 Coneology 题意: 给出一些不相交的圆,问有多少个圆不被其他圆包围 题解: 扫描线,把所有圆的左边界和右边界放到\(vector\)里排序,遍历到圆左边界的时候判断是否满足条件 ...
- 「LYOI2018 Summer」Hzy's Rabbit Candy----拓扑排序问题
「LYOI2018 Summer」Hzy's Rabbit Candy 题目描述 Hzy 和她的 m 只兔兔在一个 n 个点 m 条边的有向无环图上玩. 为了让兔兔们开心,Hzy 带了一些糖.Hzy ...
- 【bzoj 1202】[HNOI2005] 狡猾的商人(图论--带权并查集+前缀和)
题意:一个账本记录了N个月以来的收入情况,现在有一个侦探员不同时间偷看到M段时间内的总收入,问这个账本是否为假账. 解法:带权并查集+前缀和. 判断账本真假是通过之前可算到的答案与当前读入的值是否 ...
- C#线程Thread类
在System.Threading 命名空间下,包含了用于创建和控制线程的Thread 类.对线程的常用操作有:启动线程.终止线程.合并线程和让线程休眠等. 1 启动线程 在使用线程前,首先要创建一个 ...
- codeforces 1036B - Diagonal Walking v.2【思维+构造】
题目:戳这里 题意:起点(0,0),终点(n,m),走k步,可以走8个方向,问能不能走到,能走到的话最多能走多少个斜步. 解题思路:起点是固定的,我们主要分析终点.题目要求走最多的斜步,斜步很明显有一 ...
- hdu 6242 Geometry Problem
Geometry Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Other ...
- 关于malloc/free用法
和很多人一样,我一直觉得new/delete和malloc/free的用法很随意,直到我真正遇到了麻烦,才想着去好好区分一下. (1)首先mallo函数原型void* malloc(size_t).头 ...
- C# 类 (11) - Const
Const variable 变量 ,值可变的constant 常量,不可变,C# 里关键字是const当我们定义一个常量的时候,需要立马赋值,以后不能再改这个量了我们可以把常量定义在 method ...