增量式PID推导及C语言实现
PID控制器表达式为:
\]
离散化:
令 $ t = nT,~T$为采样周期。可得:
\int_0^t e(\tau)d\tau = \sum_{i=0}^{n-1} e(iT) \\\\
\frac{de(t)}{dt} = \frac{e(nT)-e[(n-1)T]}{T}
\]
因为\(T\)是固定的,不妨设为1,可简化为:
\int_0^t e(\tau)d\tau = \sum_{i=0}^n e(i) \\\\
\frac{de(t)}{dt} = e(n)-e(n-1) \]
所以:
\]
增量化:
令 \(\Delta u(n) = u(n) - u(n-1)\) 可得:
\Delta u(n) &=
\{K_pe(n) + K_i\sum_{i=0}^n e(i) + K_d[e(n)-e(n-1)]\} \\\\
&~~~~ - \{K_pe(n-1) + K_i\sum_{i=0}^{n-1} e(i) + K_d[e(n-1)-e(n-2)]\} \\\\
&= (K_p + K_i + K_d)e(n) - (K_p + 2K_d)e(n-1) + K_de(n-2)
\end{aligned} \]
所以:
u(n) &= u(n-1) + \Delta u(n) \\\\
\Delta u(n) &= a_0e(n) + a_1e(n-1) + a_2e(n-2) \\\\
a_0 &= K_p + K_i + K_d \\\\
a_1 &= -(K_p + 2K_d) \\\\
a_2 &= K_d
\end{aligned} \]
C语言实现
dpid.h:
#ifndef __DPID_H__
#define __DPID_H__
typedef struct
{
float Kp, Ki, Kd;
float a[3];
float e[3];
}dpid_t;
void dpid_init(dpid_t *pid, float Kp, float Ki, float Kd);
float dpid(dpid_t *pid, float e);
#endif
dpid.c:
#include "dpid.h"
void dpid_init(dpid_t *pid, float Kp, float Ki, float Kd)
{
pid->Kp = Kp;
pid->Ki = Ki;
pid->Kd = Kd;
pid->a[0] = Kp + Ki + Kd;
pid->a[1] = -(Kp + 2*Kd);
pid->a[2] = Kd;
pid->e[0] = pid->e[1] = pid->e[2] = 0;
}
float dpid(dpid_t *pid, float e)
{
//! 更新误差
pid->e[2] = pid->e[1];
pid->e[1] = pid->e[0];
pid->e[0] = e;
return pid->a[0]*pid->e[0]
+ pid->a[1]*pid->e[1]
+ pid->a[2]*pid->e[2];
}
增量式PID推导及C语言实现的更多相关文章
- 【转】位置式、增量式PID算法C语言实现
位置式.增量式PID算法C语言实现 芯片:STM32F107VC 编译器:KEIL4 作者:SY 日期:2017-9-21 15:29:19 概述 PID 算法是一种工控领域常见的控制算法,用于闭环反 ...
- C 语言实现增量式PID
一直以来,pid都是控制领域的经典算法,之前尝试理解了很久,但还是一知半解,总是不得要领,昨天模仿着别人的代码写了一个增量式pid的代码. 我的理解就是pid其实就是对你设置的预定参数进行跟踪.在控制 ...
- 外置式与增量式PID模板程序(51单片机c语言)
外置式PID模板 #define MuBiaoCS 0 //目标常数 #define CHang_aCS 0 //比例常数 #define CHang_bCS 0 //积分常数 #define CHa ...
- 增量式PID计算公式4个疑问与理解
一开始见到PID计算公式时总是疑问为什么是那样子?为了理解那几道公式,当时将其未简化前的公式“活生生”地算了一遍,现在想来,这样的演算过程固然有助于理解,但假如一开始就带着对疑问的答案已有一定看法后再 ...
- 增量式PID简单翻板角度控制
1.研究背景 随着电子技术.信息技术和自动控制理论技术的完善与发展,近来微型处理器在控制方面的应用也越来越多.随之逐渐渗透到我们生活的各个领域.如导弹导航装置,飞机上仪表的控制,网络通讯与数据传输,工 ...
- 位置式PID与增量式PID算法
位置式PID与增量式PID算法 PID控制是一个二阶线性控制器 定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能. 优点 ...
- 增量式PID的stm32实现(转)
源:增量式PID的stm32实现,整定过程 首先说说增量式PID的公式,这个关系到MCU算法公式的书写,实际上两个公式的写法是同一个公式变换来得,不同的是系数的差异. 资料上比较多的是: 还有一种是: ...
- 位置式PID与增量式PID
//位置式PID float Kp; float Ki; float Kd; float eSum,e0,e1; float pid_control(float now,float target) { ...
- 增量式pid和位置式PID参数整定过程对比
//增量式PID float IncPIDCalc(PID_Typedef* PIDx,float SetValue,float MeaValue)//err»ý·Ö·ÖÀë³£Êý { PIDx-& ...
随机推荐
- JavaMail和James
JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.我们可以基于JavaMail开发出类似于Micr ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- [LeetCode] Total Hamming Distance 全部汉明距离
The Hamming distance between two integers is the number of positions at which the corresponding bits ...
- [LeetCode] Ones and Zeroes 一和零
In the computer world, use restricted resource you have to generate maximum benefit is what we alway ...
- [LeetCode] Minimum Unique Word Abbreviation 最短的独一无二的单词缩写
A string such as "word" contains the following abbreviations: ["word", "1or ...
- [LeetCode] Minimum Path Sum 最小路径和
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- 攻城记:Thinkphp框架的项目规划总结和踩坑经验
一.项目模块规划 1.项目分为PC端.移动端.和PC管理端,分为对应目录为 /Application/Home,/Application/Mobile,/Application/Admin: 对应入口 ...
- 【VS】vs修改大小写快捷键
选中一段英文 改成小写:Ctrl+U 改成大写:Ctrl+Shift+U
- PPS传奇生死
地址 :http://game.pps.tv/events/cqss_sign 调用encryptedString('password') RSA加密,通过function(a) 定义 window= ...
- JavaEE学习文章汇总-并发,集群,分布式
以下文章来自博客 http://blog.csdn.net/FX_SKY/article/category/6203839 其中包括 集群Zookeeper 环境搭建 http://blog.csdn ...