没有合适的资源?快使用搜索试试~ 我知道了~
PID控制算法的C语言实现(完整版).doc
需积分: 50 24 下载量 50 浏览量
2020-03-29
17:17:57
上传
评论
收藏 500KB DOC 举报
温馨提示


试读
61页
入门教材,适合广泛应用,对于初学者可以进行体系建立,了解当前时代更新知识。紧跟时代变化知识体系。快来看一看。
资源推荐
资源详情
资源评论





PID 控制算法的 C 语言实现一 PID 算法原理
最近两天在考虑一般控制算法的 语言实现问题,发现网络上尚没有一套完
整的比较体系的讲解。于是总结了几天,整理一套思路分享给大家。
在工业应用中 及其衍生算法是应用最广泛的算法之一,是当之无愧的万
能算法,如果能够熟练掌握 算法的设计与实现过程,对于一般的研发人员
来讲,应该是足够应对一般研发问题了,而难能可贵的是,在我所接触的控制
算法当中, 控制算法又是最简单,最能体现反馈思想的控制算法,可谓经
典中的经典。经典的未必是复杂的,经典的东西常常是简单的,而且是最简单
的,想想牛顿的力学三大定律吧,想想爱因斯坦的质能方程吧,何等的简单!
简单的不是原始的,简单的也不是落后的,简单到了美的程度。先看看 算
法的一般形式:
的流程简单到了不能再简单的程度,通过误差信号控制被控量,而控制
器本身就是比例、积分、微分三个环节的加和。这里我们规定(在 时刻):
输入量为
输出量为
偏差量为
的控制规律为

理解一下这个公式,主要从下面几个问题着手,为了便于理解,把控制环境
具体一下:
规定这个流程是用来为直流电机调速的
输入量 为电机转速预定值
输出量 为电机转速实际值
执行器为直流电机
传感器为光电码盘,假设码盘为 线
直流电机采用 调速 转速用单位 转/min表示
不难看出以下结论:
输入量 ()为电机转速预定值(转 )
输出量 为电机转速实际值(转 )
偏差量为预定值和实际值之差(转 )
那么以下几个问题需要弄清楚:
通过 环节之后的 !是什么值呢?
控制执行器(直流电机)转动转速应该为电压值(也就是 占空比)。
那么 !与 之间存在怎样的联系呢?
"#$%&'' ()*'"+(" %(见附录
)这篇文章上给出了一种方法,即,每个电压对应一个转速,电压和转速之
间呈现线性关系。但是我考虑这种方法的前提是把直流电机的特性理解为线性
了,而实际情况下,直流电机的特性绝对不是线性的,或者说在局部上是趋于
线性的,这就是为什么说 调速有个范围的问题。具体看一下 "#
*'%(,-('' *'%.." (见附录 )这篇
文章就可以了解了。所以在正式进行调速设计之前,需要现有开环系统,测试
电机和转速之间的特性曲线(或者查阅电机的资料说明),然后再进行闭环参
数整定。这篇先写到这,下一篇说明连续系统的离散化问题。并根据离散化后
的特点讲述位置型 和增量型 的用法和 语言实现过程。

PID 控制算法的 C 语言实现二 PID 算法的离散化
上一节中,我论述了 算法的基本形式,并对其控制过程的实现有了一个
简要的说明,通过上一节的总结,基本已经可以明白 控制的过程。这一节
中先继续上一节内容补充说明一下。
说明一下反馈控制的原理,通过上一节的框图不难看出, 控制其实是
对偏差的控制过程
如果偏差为 /则比例环节不起作用,只有存在偏差时,比例环节才起作用。
积分环节主要是用来消除静差,所谓静差,就是系统稳定后输出值和设定
值之间的差值,积分环节实际上就是偏差累计的过程,把累计的误差加到原有
系统上以抵消系统造成的静差。
而微分信号则反应了偏差信号的变化规律,或者说是变化趋势,根据偏差
信号的变化趋势来进行超前调节,从而增加了系统的快速性。
好了,关于 的基本说明就补充到这里,下面将对 连续系统离散化,
从而方便在处理器上实现。下面把连续状态的公式再贴一下:
假设采样间隔为 0,则在第 10 时刻:
偏差 111
积分环节用加和的形式表示,即 1212233
微分环节用斜率的形式表示,即41150
从而形成如下 离散表示形式:

则 1可表示成为:
至于说 1、1、1 三个参数的具体表达式,我想可以轻松的推出了,这里节
省时间,不再详细表示了。
其实到这里为止, 的基本离散表示形式已经出来了。目前的这种表述形式
属于位置型 ,另外一种表述方式为增量式 ,由 ! 上述表达式可以轻易
得到:
那么:
这就是离散化 的增量式表示方式,由公式可以看出,增量式的表达结果和
最近三次的偏差有关,这样就大大提高了系统的稳定性。需要注意的是最终的
输出结果应该为
12增量调节值
的离散化过程基本思路就是这样,下面是将离散化的公式转换成为 语言,
从而实现微控制器的控制作用。

PID 控制算法的 C 语言实现三 位置型 PID 的 C 语言
实现
上一节中已经抽象出了位置性 和增量型 的数学表达式,这一节,重
点讲解 语言代码的实现过程,算法的 语言实现过程具有一般性,通过
算法的 语言实现,可以以此类推,设计其它算法的 语言实现。
第一步:定义 变量结构体,代码如下:
('67
8*99定义设定值
8*:'*%9定义实际值
8*定义偏差值
8*6%*(定义上一个偏差值
8*1/1/1定义比例、积分、微分系数
8*+%*&定义电压值(控制执行器的变量)
8*&*%定义积分值
;
控制算法中所需要用到的参数在一个结构体中统一定义,方便后面的使用。
第二部:初始化变量,代码如下:
+67
<=6$&>=
99
剩余60页未读,继续阅读
资源评论


w201628062
- 粉丝: 12
- 资源: 339
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
