PID代码及注释
2015-07-26 23:00
239 查看
/<span style="font-family: Arial, Helvetica, sans-serif;">****************************************所谓PID即为P(比例)+I(积分)+D(微分)*******************************************</span>
**(1)P控制(比例控制): e(t) = SP - y(t); SP--设定值 e(t)--误差值(设定的值和当前的误差) y(t)--反馈值(当前值) **适用于滞后性不大的系统 u(t) = e(t) * P; u(t)--输出值(需要输出的) P--比例系数 ** **(2)PI控制(比例+积分): u(t) = Kp*e(t) + Ki∑e(t) + u0 **可使系统进入稳态无稳态误差u(t)--输出 Kp--比例放大系数 ki--积分放大系数 e(t)--误差 u0--控制量基准值(基础偏差) ** **(3)PD控制(微分控制): **微分项解决响应速度问题 积分项解决稳定性 **(4)PID控制(比例积分微分控制): **微分项解决响应速度问题 u(t) = Kp*e(t) + Ki∑e(t)+ Kd[e(t) – e(t-1)] + u0 **采样周期(即反馈值的采样周期) **控制周期(就是每隔多长时间进行一次PID运算,并将结果输出) ****************************小结:P(比例)--即时性 I(积分)--响应速度 D(微分)--稳定性************************************ */ #include<stdio.h> #include<string.h> #include"StandardPID.h" //#include<stdib.h> //对变量的声明 typedef struct PID{ double SetPoint; //设定值 double Kp; //比例系数 double Ki; //积分系数 double Kd; //微分系数 double LastError; //最后一次误差数Er[-1] double PrevError; //最后第二次误差数er[-2] double SumError; //误差积分 }PID; /* **PID计算部分 */ double PIDCalc(PID *pp, double NextPoint) { double dError, //当前微分 Error; //偏差 Error = pp->SetPoint - NextPoint; //偏差值=设定值-输入值(当前值) pp->SumError += Error; //积分=积分+偏差 --偏差的累加 dError = pp->LastError - pp->PrevError; //当前微分 = 最后误差 - 之前误差 pp->PrevError = pp->LastError; //更新“之前误差” pp->LastError = Error; //更新“最后误差” return (pp->Kp * Error //比例项 = 比例常数 * 偏差 + pp->Ki * pp->SumError //积分项 = 积分常数 * 误差积分 + pp->Kd * dError //微分项 = 微分常数 * 当前微分 ); } //为PID变量申请内存,范围指向pp的指针 void PIDInit (PID *pp) { //memset是计算机中C / C++语言函数。将s所指向的某一块内存中的前n个 memset(pp, 0, sizeof(PID)); //字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定, } //这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。 double sensor(void) //输入 { double shuru; scanf("%lf", &shuru); return shuru; } void actuator(double rDelta) //输出 { printf("%lf\n", rDelta); } int main() { PID sPID; //PID结构体 double rOut; //输出变量 double rIn; //输入变量 PIDInit(&sPID); //初始化结构体 sPID.Kp = 0.5; sPID.Ki = 0.5; sPID.Kd = 0.5; sPID.SetPoint = 100.0; for (;;){ rIn = sensor(); //取输入值 rOut = PIDCalc(&sPID, rIn); //PID运算 actuator(rOut); //输出 } }
</pre><pre name="code" class="cpp">#ifndef __StandardPID_H #define __StandardPID_H double PIDCalc(PID *pp, double NextPoint); void PIDInit (PID *pp); double sensor(void); void actuator(double rDelta); #endif
相关文章推荐
- 解决DreamWeaver代码视图中文不能精确选中的问题
- C++调用c# dll
- yii 进行事务操作是不可以在一条sql里边放多条sql
- JAVA基础数据类型浅析
- Java语言基础1——基本数据类型
- (三)PHP面向对象理论3---接口与反射
- Java Dao模式
- [Python] Python中的一些特殊函数
- 直返图均衡化代码详解
- Greedy --- HNU 13320 Please, go first
- Java设计模式——工厂设计模式
- 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析及其在Spark中的应用源码解析学习笔记
- Java并发编程从入门到精通 张振华.Jack --我的书
- Java 解决FileInputStream读取中文时乱码的问题
- Java开发中的23种设计模式详解(转)
- Java中的构造器
- php传值赋值与引用赋值
- myeclipse连接数据库遇到的几个问题
- Python 字典的使用
- Python 字典的使用