PID控制器的数字实现及C语法讲解

上传人:豆浆 文档编号:35241420 上传时间:2018-03-12 格式:PDF 页数:13 大小:704.13KB
返回 下载 相关 举报
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 有关 语法 简述( 语法会 结合 实例 进行讲解) 。 PID 控制器的数字化 PID 控 制 器 是 工 业 过 程 控 制 中 广 泛 采 用 的 一 种 控 制 器 , 其 中 ,P 、I 、D 分 别

2、 为 比 例 (Proportion ) 、 积分 (Integral ) 、 微分 (Differential ) 的简写 ; 将 偏差 的比 例 、 积分 和微分通 过线性组合 构成控制 量 , 用该 控制量对 受控对象 进行 控制 , 称为 PID算法 。 为了用软件 实现 PID 算法 , 需 将 PID 控制器离 散化 。 1. 整体思路 2. 方框图 PID 控制器的方框图 如图 所示 : I K P K D K3. 拉氏域的表达式 根据方框图 , 可写出 PID 控制 器对应的传递函数 : ( ) ( ) ( ) I c P D K U s G s K K s E s s (1

3、) 其中 , P I D K K K 比 例 系 数 积 分 系 数 微 分 系 数4. 时域的表达式 在分析时 , 通常借 助于拉氏 空间 , 例如判 断系统的 稳 定性与相对 稳定性 ; 而现在 我们关 心的是时域 里的问题 , 因此对 式 (1 ) 进 行拉普 拉斯 逆 变换 , 得 到时域里的表达式 : 0 ( ) ( ) ( ) ( ) t P I D de t u t K e t K e t dt K dt (2 ) 2 其对应的结构框图 如图所示 : I K P K D K 0 t d t d d t5. 差分方程 该时域里的表达式不便于计 算机编程处理 , 因 此要对 式 (2

4、 ) 进行离散化处理 , 从而得 到可编程实 现的差分 方程 ,分析过程 如下 : (a) 比例环节的离散化: 令 ( ) ( ) p P u t K e t 当 t=kT ( 第 k 次采样 ) 时 , ( ) ( ) p P u k T K e k T (3 ) 其中 , T 采 样 周 期 ( 步 长 ) k- 正 整 数 , k=1,2,3 , .(说明:步长 T通过微控制器的定时器实现 ) (b) 积分环节的离散化: 令 0 ( ) ( ) t i I u t K e t d t 当 t=kT ( 第 k 次采样 ) 时 , 0 ( ) ( ) k T i I u k T K e t

5、 d t 根据定积分 的几何意 义 , 可得 定积分 0 ( ) k T e t d t 的数值计算 公式 : ( 1) 0 0 ( ) = ( ) ( ) k T k T e t d t e t d t T e k T 由此可得 , ( 1) 0 ( )= ( ) ( ) k T i I u k T K e t d t T e k T (4 ) (c) 微分环节的离散化: 令 ( ) ( ) d D de t u t K dt 当 t=kT ( 第 k 次采样 ) 时 , ( ) ( ) | d D t k T de t u k T K dt 根据导数的 定义 , 可 得函数在 某一点的 导

6、数 ( ) | t k T de t dt 的数值计 算公式 : ( ) 1 | = ( ) ( 1) ) t k T de t e k T e k T dt T 3 由此可得 , ( )= ( ) ( 1) ) D d K u k T e k T e k T T (5 ) 由 式 (2 ) , 可得 : ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) p i d p i d u t u t u t u t u k T u k T u k T u k T (6 ) 将 式 (3 ) 、 (4 ) 、 (5 ) 代入 式 (6 ) , 可得数字 PID控制器的位置式算法 : (

7、1) 0 ( ) ( )+ ( ) ( )+ ( ) ( 1) ) k T D P I K u k T K e k T K e t d t T e k T e k T e k T T (7 ) 从 表达式可 见 , 由于 表达式中 含有 积分 项 ( 1) 0 ( ) k T e t d t , 不便于软 件 实现 , 因 此 , 我们下一步的任务 就 是想办法 消去积分 项 ( 1) 0 ( ) k T e t d t 。 设 PID 控制器第 (k-1 ) 步 的输出为 ( 1) ) u k T , 则根据 式 (7 ) 很容易得到 : ( 1) 0 ( 1) ) ( 1) )+ ( )

8、+ ( 1) ) ( 2) ) k T D P I K u k T K e k T K e t dt e k T e k T T (8 ) 将 式 (7 ) 与 式 (8 ) 相减 , 可 得 PID 控制器输 出的增 量 ( ) u k T : ( ) ( ) ( 1) ) 2 ( ) ( ) ( ) ( 1) ) ( 2) ) D D D P I P u k T u k T u k T K K K K K T e k T K e k T e k T T T T 移项 , 便 得数字 PID控制器的增量式算法 : ( ) ( 1) ) ( ) 2 ( 1) ) ( ) ( ) ( ) ( 1

9、) ) ( 2) ) D D D P I P u k T u k T u k T K K K u k T K K T e k T K e k T e k T T T T 记 ( ) ( ) u k T u k , 就 得到 PID控制器增量式算法的差分方程 : 2 ( ) ( 1) ( ) ( ) ( ) ( 1) ( 2) D D D P I P K K K u k u k K K T e k K e k e k T T T 这样就可编 程实现了( 或许有人 会问 , 为什 么差分方 程就可 编程 实 现呢 ? 这是因为 解差分方 程的一般解 法就是迭代法 , 而 迭代 法只需初 值跟通项

10、公式 , 这 在 计算机编 程中 很容 易实现) 为使 编程方 便 , 可引 入 中间变 量 , 定义 如下 : 4 0 1 2 2 D P I D P D K a K K T T K a K T K a T 则 ,PID 控制器增量式算法的差分方程 变 为 : 0 1 2 ( ) ( 1) ( ) ( 1) ( 2) u k u k a e k a e k a e k 说明: (1 ) 在 PID 增量式 算法中 只 需对输出 u(t) 作限幅处 理 ; (2 ) 当增益 0 D K 时 ,PID 控制器 就成了 PI 控制器 ; ( 在 编写 PID 程序 时 默认 使其 为 PI 调节器

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

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

13、个 流程 后 , 你才 能 体会 这种程 序风格 的优 势 , 再将这种编程 风格慢慢转化为自己的 编 程 风格 。 (二) 程序中涉及的 C语法讲解 这里 , 我 只讲述为什么要采用这些语法 以 及采用这些语法所带来的好处 , 至于细枝 末节 的问题 , 就请 各位童鞋 自行查阅 有关资料 , 顺带 给 大家 推荐一本不 错的 C 语言教材 : C Primer Plus 。 1. 条件编译指令 第一处 :#ifndef PID_H 语句 使用该语句 的目的 是避免 造成 把 重复定义 语句 ( 如 , 结构体类型 定义 ) 添 加到工程 中 , 而 使得编译 出错 说明: 其实也可 不用#

14、ifndef 语句 , 因为每个定义的 变量都具有特定的物理含义 , 不会造成 5 重复定义 现 象 。 第二处 :#if (PID_DEBUG) 语句 使用该语句 的目的 是实现功能切换 (注意了 :是在校正 PID 参数后手动切换,通过改变 宏定义语句#define PID_DEBUG 1中的宏体实现 ) , 具 体 请看 程序 清单 。 2. 结构体及结构体指针 使用结构体 类型的好处 : 可为实 现某 一功 能的各变 量 进行 “ 打包 ” 处理 使用结构体 指针的好处 : 通过传 址调用 , 对 方便对 结 构 体 变量本 身进行操 作 3. typedef数据类型定义 使用 typ

15、edef 数据类型定义的好处 是方便跨平台进行代码移植 操作 ; 但 由于教材 的缘故 , 造成很多 童 鞋都停留 在表面层 次上的理 解(typedef 数据类型 别名) , 因 而此处作 重点讲解 。 我理解为: 任何一个 typedef声明中的标识符不再是一个变量, 而是代表一个数据类型, 其表示的数据类型为正常变量声明(去掉 typedef)的那个标识符的数据类型。 理解起来可 能有点困 难 , 现结 合实例来 讲解 : 例 1 typedef int Myint; 分析: 第一步:正常变量声明(去掉 typedef) int Myint; 该语句表示 定义一个 int 型变量 Myint( 这里 ,Myint 为变量 名) ; 第二步:整体分析 typedef int Myint; 该语句 表示 定义一个 Myint 类型( 此 时 ,Myint 为数 据类型标识 符) , 其 具 体 所表示的类 型为 :int 型 ; 应用: Myin

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

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