PID控制器表达式为:

\[u(t) = K_pe(t) + K_i\int_0^t e(\tau)d\tau + K_d\frac{de(t)}{dt}
\]


离散化:

令 $ t = nT,~T$为采样周期。可得:

\[e(t) = e(nT) \\\\
\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,可简化为:

\[e(t) = e(n) \\\\
\int_0^t e(\tau)d\tau = \sum_{i=0}^n e(i) \\\\
\frac{de(t)}{dt} = e(n)-e(n-1) \]

所以:

\[u(n) = K_pe(n) + K_i\sum_{i=0}^n e(i) + K_d[e(n)-e(n-1)]
\]


增量化:

令 \(\Delta u(n) = u(n) - u(n-1)\) 可得:

\[ \begin{aligned}
\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} \]

所以:

\[ \begin{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语言实现的更多相关文章

  1. 【转】位置式、增量式PID算法C语言实现

    位置式.增量式PID算法C语言实现 芯片:STM32F107VC 编译器:KEIL4 作者:SY 日期:2017-9-21 15:29:19 概述 PID 算法是一种工控领域常见的控制算法,用于闭环反 ...

  2. C 语言实现增量式PID

    一直以来,pid都是控制领域的经典算法,之前尝试理解了很久,但还是一知半解,总是不得要领,昨天模仿着别人的代码写了一个增量式pid的代码. 我的理解就是pid其实就是对你设置的预定参数进行跟踪.在控制 ...

  3. 外置式与增量式PID模板程序(51单片机c语言)

    外置式PID模板 #define MuBiaoCS 0 //目标常数 #define CHang_aCS 0 //比例常数 #define CHang_bCS 0 //积分常数 #define CHa ...

  4. 增量式PID计算公式4个疑问与理解

    一开始见到PID计算公式时总是疑问为什么是那样子?为了理解那几道公式,当时将其未简化前的公式“活生生”地算了一遍,现在想来,这样的演算过程固然有助于理解,但假如一开始就带着对疑问的答案已有一定看法后再 ...

  5. 增量式PID简单翻板角度控制

    1.研究背景 随着电子技术.信息技术和自动控制理论技术的完善与发展,近来微型处理器在控制方面的应用也越来越多.随之逐渐渗透到我们生活的各个领域.如导弹导航装置,飞机上仪表的控制,网络通讯与数据传输,工 ...

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

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

  7. 增量式PID的stm32实现(转)

    源:增量式PID的stm32实现,整定过程 首先说说增量式PID的公式,这个关系到MCU算法公式的书写,实际上两个公式的写法是同一个公式变换来得,不同的是系数的差异. 资料上比较多的是: 还有一种是: ...

  8. 位置式PID与增量式PID

    //位置式PID float Kp; float Ki; float Kd; float eSum,e0,e1; float pid_control(float now,float target) { ...

  9. 增量式pid和位置式PID参数整定过程对比

    //增量式PID float IncPIDCalc(PID_Typedef* PIDx,float SetValue,float MeaValue)//err»ý·Ö·ÖÀë³£Êý { PIDx-& ...

随机推荐

  1. ubuntu-Linux系统读取USB摄像头数据(uvc)

    这几天在做小车的过程中,需要用到图像采集.我想现在用的摄像头是UVC免驱的.根据国嵌的教程中有一个gspca摄像头的程序.我发现把gspca的采集程序用到uvc上时,在显示图像的时候提示没有huffm ...

  2. BZOJ 3944 Sum

    题目链接:Sum 嗯--不要在意--我发这篇博客只是为了保存一下杜教筛的板子的-- 你说你不会杜教筛?有一篇博客写的很好,看完应该就会了-- 这道题就是杜教筛板子题,也没什么好讲的-- 下面贴代码(不 ...

  3. css一些进入条

    http://www.jq22.com/jquery-info5309 http://www.jq22.com/jquery-info10964 http://www.jq22.com/jquery- ...

  4. sublimetext3中保存代码片段

    在日常的开发工作中,不断重复上一次敲过的代码,有时确实感到伐木累."蓝瘦"(难受)."香菇"(想哭),大概表达的也是这样的心境吧!:grinning: 所以,在 ...

  5. windows批处理运行java程序

    明确需求 今天你编了一个java swing版照片查看器,想让计算机上的所有照片默认打开方式都改成你的照片查看器. 使用工具软件 很多工具软件都是不把jre打包到exe中的,这就是说打包之后的exe只 ...

  6. C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用

    类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...

  7. Objective-c快速入门

    对象(Class)的声明和定义 和其他的语言不同,OC的对象创建分为两个部分.声明部分(@interface)和实现部分(@implementation),且它们都必须使用@end结束. 对象的声明( ...

  8. iOS 读取大文件时候的注意点

    转: 使用NSData读取数据,采用NSData的dataWithContentsOfFile:方法.不少人反馈说如果直接使用,将会耗尽iOS的内存. 其实这个是可以改善的. NSData还有一个AP ...

  9. c# String.Join 和 Distinct 方法 去除字符串中重复字符

    1.在写程序中经常操作字符串,需要去重,以前我的用方式利用List集合和 contains去重复数据代码如下: string test="123,123,32,125,68,9565,432 ...

  10. Python Numpy,Pandas基础笔记

    Numpy Numpy是python的一个库.支持维度数组与矩阵计算并提供大量的数学函数库. arr = np.array([[1.2,1.3,1.4],[1.5,1.6,1.7]])#创建ndarr ...