pid控制器数字实现及c语法讲解

上传人:第*** 文档编号:56103833 上传时间:2018-10-09 格式:PDF 页数:13 大小:704.14KB
返回 下载 相关 举报
pid控制器数字实现及c语法讲解_第1页
第1页 / 共13页
pid控制器数字实现及c语法讲解_第2页
第2页 / 共13页
pid控制器数字实现及c语法讲解_第3页
第3页 / 共13页
pid控制器数字实现及c语法讲解_第4页
第4页 / 共13页
pid控制器数字实现及c语法讲解_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《pid控制器数字实现及c语法讲解》由会员分享,可在线阅读,更多相关《pid控制器数字实现及c语法讲解(13页珍藏版)》请在金锄头文库上搜索。

1、 1 PID 控制器的数字实现控制器的数字实现及及 C 语法讲解语法讲解 free_稀饭 2016/2/9 为方便学习与交流,根据自己的理解与经验自己的理解与经验写了这份教程,有错误之处请各位童鞋予以 指出;具体包含以下三部分内容: (1) PID 数字化的推导过程(实质实质:微积分的近似计算); (2) 程序风格介绍(程序风格来源于 TI 官方案例) ; (3) C 有关语法简述(语法会结合实例进行讲解) 。 PIDPID 控制器的数字化控制器的数字化 PID 控制器是工业过程控制中广泛采用的一种控制器,其中,P、I、D 分别为比例 (Proportion) 、积分(Integral) 、微

2、分(Differential)的简写;将偏差的比例、积分和微分通 过线性组合构成控制量,用该控制量对受控对象进行控制,称为 PID 算法算法。 为了用软件实现 PID 算法,需将 PID 控制器离散化。 1. 整体思路整体思路 2. 方框图方框图 PID 控制器的方框图方框图如图所示: IKPKDK3. 拉氏域的表达式拉氏域的表达式 根据方框图,可写出 PID 控制器对应的传递函数传递函数: ( )( )( )I cPDKU sG sKKsE ss (1) 其中,PIDKKK 比例系数积分系数微分系数4. 时域的表达式时域的表达式 在分析时,通常借助于拉氏空间,例如判断系统的稳定性与相对稳定性

3、;而现在我们关 心的是时域里的问题,因此对式(1)进行拉普拉斯逆变换,得到时域里的表达式时域里的表达式: 0( )( )( )( )tPIDde tu tK e tKe t dtKdt(2) 2 其对应的结构框图结构框图如图所示: IKPKDK0tdtd dt5. 差分方程差分方程 该时域里的表达式不便于计算机编程处理,因此要对式(2)进行离散化处理离散化处理,从而得 到可编程实现的差分方程,分析过程分析过程如下: (a) 比例环节的离散化比例环节的离散化: 令( )( )pPutK e t 当 t=kT(第 k 次采样)时,()()pPukTK e kT (3) 其中, T 采样周期(步长)

4、k-正整数,k=1,2,3,. (说明说明:步长步长 T 通过微控制器的定时器通过微控制器的定时器实现实现) (b) 积分环节的离散化积分环节的离散化: 令 0( )( )tiIu tKe t dt当 t=kT(第 k 次采样)时, 0()( )kTiIu kTKe t dt根据定积分的几何意义,可得定积分 0( )kTe t dt的数值计算公式: (1)00( )=( )()kTkTe t dte t dtTe kT由此可得,(1)0()=( )()kTiIu kTKe t dtTe kT(4) (c) 微分环节的离散化微分环节的离散化: 令( )( )dDde tutKdt 当 t=kT(

5、第 k 次采样)时,( )()|dDt kTde tukTKdt 根据导数的定义,可得函数在某一点的导数( )|t kTde t dt的数值计算公式: ( )1|= ()(1) )t kTde te kTe kTdtT 3 由此可得,()= ()(1) )D dKukTe kTe kTT (5) 由式(2) ,可得: ( )( )( )( )()()()()pidpidu tutu tu tu kTukTu kTukT(6) 将式(3) 、 (4) 、 (5)代入式(6) ,可得数字数字 PID 控制器的位置式算法控制器的位置式算法: (1)0()()+( )()+ ()(1) )kTD PI

6、Ku kTK e kTKe t dtTe kTe kTe kTT(7) 从表达式可见,由于表达式中含有积分项(1)0( )kTe t dt,不便于软件实现,因此,我们下一步的任务下一步的任务就是想办法消去积分项(1)0( )kTe t dt。 设 PID 控制器第(k-1)步的输出为(1) )u kT,则根据式(7)很容易得到: (1)0(1) )(1) )+( )+ (1) )(2) )kTD PIKu kTK e kTKe t dte kTe kTT(8) 将式(7)与式(8)相减,可得 PID 控制器输出的增量()u kT : ()()(1) )2() ()() (1) )(2) )DD

7、D PIPu kTu kTu kTKKKKK Te kTKe kTe kTTTT移项,便得数字数字 PID 控制器的增量式控制器的增量式算法算法: ()(1) )()2(1) )() ()() (1) )(2) )DDD PIPu kTu kTu kTKKKu kTKK Te kTKe kTe kTTTT记()( )u kTu k ,就得到 PID 控制器增量式算法的差分方程控制器增量式算法的差分方程: 2( )(1)() ( )() (1)(2)DDD PIPKKKu ku kKK Te kKe ke kTTT 这样就可编程实现了 (或许有人会问, 为什么差分方程就可编程实现呢?这是因为解差

8、分方 程的一般解法就是迭代法迭代法,而迭代法只需初值跟通项公式,这在计算机编程中很容易实现) 为使编程方便,可引入中间变量,定义如下: 4 0122D PID PDKaKK TT KaKT KaT 则,PID 控制器增量式算法的差分方程控制器增量式算法的差分方程变为: 012( )(1)( )(1)(2)u ku ka e ka e ka e k 说明说明: (1)在 PID 增量式算法中只需对输出 u(t)作限幅处理; (2)当增益0DK时,PID 控制器就成了 PI 控制器; (在编写 PID 程序时默认使其为 PI 调节器) ; 当增益0IK 时,PID 控制器就成了 PD 控制器。 基

9、于微控制器的算法基于微控制器的算法实现实现 我写的数字 PID 程序如图所示(在最后的附件部分在最后的附件部分) ,有两套代码,一套是直接函数调直接函数调 用用(C/C+通用通用) ,另一套是使用函数指针进行函数调用使用函数指针进行函数调用(仅适用于仅适用于 C) ,现从两个方面对该 程序做讲解: (一一) 程序风格程序风格 程序采用了模块化编程模块化编程的思想,这样做的目的目的是增强代码的可移植性及程序的可读性增强代码的可移植性及程序的可读性。 程序被拆分拆分成三个模块, 一个是 PID 的头文件PID.h:主要是定义算法实现有关的数据类型; 一个是 PID 的源文件PID.c:主要是定义算

10、法实现的函数; 一个是主函数文件amain.c: PID 程序的使用方法, 即在主程序中做相应的初始化工作, 在中断服务程序中进行 PID 的计算。 说明说明:读这个程序时可读这个程序时可能有点困难能有点困难,不过这属情理之中的事不过这属情理之中的事,毕竟刚接触这种风格的童鞋毕竟刚接触这种风格的童鞋 不太能理解不太能理解这种风格的这种风格的产生产生(为什么这么做为什么这么做)及及用意用意(这么做的好这么做的好处处) ;) ;我的我的建议建议是是:在理在理 解算法的原理后解算法的原理后,根据自己的编程风格尝试着写一下根据自己的编程风格尝试着写一下,然后再跟这套程序对比着来理解然后再跟这套程序对比

11、着来理解, 推敲一下别人为什么要这么做推敲一下别人为什么要这么做;当熟悉了当熟悉了整个整个流程后流程后,你才你才能体会这种程序风格的优势能体会这种程序风格的优势, 再将这种编程再将这种编程风格慢慢转化为自己的风格慢慢转化为自己的编程编程风格风格。 (二二) 程序中涉及程序中涉及的的 C 语法语法讲解讲解 这里,我只讲述为什么要采用这些语法为什么要采用这些语法以及采用这些语法所带来的好处采用这些语法所带来的好处,至于细枝末节 的问题, 就请各位童鞋自行查阅有关资料, 顺带给大家推荐一本不错的C语言教材: C Primer Plus。 1. 条件编译条件编译指令指令 第一处:#ifndef PID

12、_H 语句 使用该语句的目的目的是避免造成把重复定义语句(如,结构体类型定义)添加到工程中, 而使得编译出错 说明说明:其实也可不用#ifndef 语句,因为每个定义的变量都具有特定的物理含义,不会造成5 重复定义现象。 第二处:#if (PID_DEBUG) 语句 使用该语句的目的目的是实现功能切换实现功能切换(注意了注意了:是在校正 PID 参数后手动切换,通过改变 宏定义语句#define PID_DEBUG 1 中的宏体实现) ,具体请看程序清单。 2. 结构体及结构体指针结构体及结构体指针 使用结构体类型的好处好处:可为实现某一功能的各变量进行“打包”处理 使用结构体指针的好处好处:

13、通过传址调用,对方便对结构体变量本身进行操作 3. typedef 数据类型定义数据类型定义 使用 typedef 数据类型定义的好处好处是方便跨平台进行代码移植跨平台进行代码移植操作; 但由于教材的缘故, 造成很多童鞋都停留在表面层次上的理解(typedef 数据类型数据类型 别名别名),因而此处作重点讲解。 我理解我理解为为: 任何一个任何一个 typedef 声明中的标识符不再是一个变量声明中的标识符不再是一个变量, 而是代表一个数据类型而是代表一个数据类型, 其表示的数据类型为正常变量声明其表示的数据类型为正常变量声明(去掉去掉 typedef)的那个标识符的数据类型的那个标识符的数据

14、类型。 理解起来可能有点困难,现结合实例来讲解: 例例 1 typedef int Myint; 分析分析: 第一步第一步:正常变正常变量声明量声明(去掉去掉 typedef) int Myint; 该语句表示定义一个 int 型变量 Myint(这里,Myint 为变量名) ; 第二步第二步:整体分析整体分析 typedef int Myint; 该语句表示定义一个 Myint 类型(此时,Myint 为数据类型标识符) ,其具体 所表示的类型为:int 型; 应用应用: Myint a; /声明整型变量 a 例例 2 typedef struct /省略成员 PID; 分析分析: 第一步第

15、一步:正常变量声明正常变量声明(去掉去掉 typedef) struct /省略成员 PID; 该语句表示定义一个结构体变量 PID(这里,PID 为变量名) ; 第二步第二步:整体分析整体分析 typedef struct /省略成员 PID; 该语句表示定义一个 PID 类型(此时,PID 为数据类型标识符) ,其具体所表 6 示的类型为:结构体类型,且其具有的成员同结构体变量 PID(这里,PID 为变量 名) ; 应用应用: PID ASR; /定义结构体变量 ASR 例例 3 typedef void (*PFun)(int ); 分析分析: 第一步第一步:正常变量声明正常变量声明(去去掉掉 typedef) void (*PFun)(int ); 该语句表示定义一个函数指针 PFun(这里,PFun 为变量名) ; 第二步第二步:整体分析整体分析 typedef void (*PFun)(int ); 该语句表示定义一个 PFun 类型(此时,PFun 为数据类型标识符) ,其具体 所表示的类型为:函数

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号