基于C++的PID控制设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《面向对象的Visual C++程序设计》
课程设计报告
学号:
姓名:
专业年级:
河南大学物理与电子学院
测控技术与仪器教研室
PID控制器的面向对象方法实现
1. 面向对象的程序设计方法
面对对象编程(Object-oriented Programming,OOP)
C++是由AT&T Bell(贝尔)实验室的Bjarne Stroustrup 博士及其同事与20世纪80年代在C语言的基础上开发成功的。C++保留了C语言原有的所有优点,增加了面向对象的机制。
出发点是为了能更直接的描述客观世界中存在的事物(即对象),以及它们之间的关系。面对对象编程语言将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特性)和行为(动态特性)形成类。通过类的继承与多态可以很方便的实现代码的重用。
抽象
抽象是忽略与与所处理问题无关或非本质的信息,以充分的注意与当前目标有关的特征。封装性,类,对象:将数据及对数据的操作方法放在一起,作为一个相互依存、不可分割的整体——对象。对同类型的对象抽象出其共性,形成类。
继承性
基类,派生类:继承是一种连接类的层次模型,提供了一种表述共性的方法。新的类可以从现有的类中派生,派生的类可以继承现有类的属性和操作,也可以修改和增加新的操作。
多态性
重载,动态联编:类中具有相似功能的不同函数使用同一个名字来使用,允许不同类的对象对同一个消息作出不同的响应。允许派生类的的对象当作基类的来使用。多态性提高了代码的重用性和可扩展性。
2. PID基本原理
PID代表Proportonal-Integral-Differential,即比例积分微分,指的是一项流行的线性控制策略。
P控制器实质上是一个可调增益的放大器。其控制器的输出与输入误差信号成比例关系。
I控制器可以提高系统的性别(无差度),I应发生在系统频率特性的低频段以提高系统的稳态性能。
D能反应输入信号的变化趋势,产生早期的修正信号,增加系统的阻尼程度,从而改善系统的稳定性。应使D发生在频率特性的中频段,以改善系统的动态性能。
3. C++实现PID 的程序设计
PID 控制器程序流程图:
4. PID 试验结果
采样周期:Ts=0.002; 设定值:Setpoint=100;
1)当只有P 控制器时,响应速度快,波形会出现一定的振荡。
Kp=0.8; //比例增益
Ti=0.0; //积分时间
Td=0.0; //微分时间 开始 PID 控制
初始化PID 控制器参数 FeedBack SetPoint
偏差ek 被控对象
PidOut
2)适当调节积分时间Ti后波形如下:
Kp=6; //比例增益
Ti=0.001; //积分时间
Td=0.0; //微分时间
增加了积分调节后波形变的平滑了
3)最后增加微分调节,以提高动态性能。 Kp=30; //比例增益
Ti=0.0005; //积分时间
Td=0.004; //微分时间
由以上分析知,经过PID综合调节后达到稳定的时间提前了,响应速度快,静态误差变小了,抗干扰能力大大增强。
5. 总结
通过这次课程设计让我巩固了所学的知识,学以致用,对所学的课程有了更深一步的认识。不仅练习了本门课程C++高级语言,而且理解了PID控制的原理和掌握了其是如何实现的。
参考文献
[1]Stanley B.Lippman, Josee Lajoie, Barbara E.Moo著.李诗贤等译.C++ Primer中文版,第四
版.北京:人民邮电出版社,2006.3.
[2] 张福祥,面对对象程序设计基础.北京:高等教育出版社,2004.12.
[3] 胡寿松,自动控制原理简明教程。北京:科学出版社,2008
[4] 百度文库,/view/6a84c522bcd126fff7050b0e.html?from=ec&pos= 3&weight=4&lastweight=3&count=5
附录
PID部分源代码:
//_________头文件pid.h 实现类的定义_________________________
class PID
{
public:
double Ts,Kp,Ti,Td,Setpoint;
double ek,ek_1,ek_2;
PID();
PID (double ts,double kp,double ti,double td,double setpoint);
double pid_out (double pid_in);
~PID (){} //析构函数
};
/****************************************************************主文件pid.cpp主要实现:
*对PID类的成员变量初始化(构造函数重载)
*PID::PID()
*PID::PID(double ts,double kp,double ti,double td,double setpoint)
*成员函数函数double PID::pid_out(double pid_in) //增量式 PID
****************************************************************/ #include "pid.h"
//-------无参的---------------------------------------
PID::PID()
{
Ts=0.002; //采样周期
Kp=30; //比例增益
Ti=0.0005; //积分时间
Td=0.004; //微分时间
Setpoint=100; //设置位置
ek=0; //当前偏差
ek_1=0; //上次偏差
ek_2=0; //前次偏差
}
//-------有参的----------------------------------------------
PID::PID(double ts,double kp,double ti,double td,double setpoint) {
Ts=ts;
Kp=kp;
Ti=ti;
Td=td;
Setpoint=setpoint;
ek=0;