电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

pid算法原理及代码结束

2017-06-13 09:30分类:电子技术 阅读:

 

在工业运用中PID及其衍生算法是运用最广泛的算法之一,是名副正本的全能算法,假定能够娴熟把握PID算法的计划与结束进程,关于通常的研制人员来讲,应当是满意应对通常研制疑问了,而难能可贵的是,在我所触摸的操控算法傍边,PID操控算法又是最简略,最能表现反响思维的操控算法,可谓经典中的经典。经典的未必是凌乱的,经典的东西常常是简略的,并且是最简略的,想想牛顿的力学三大规矩吧,想想爱因斯坦的质能方程吧,多么的简略!简略的不是初始的,简略的也不是落后的,简略到了美的程度。先看看PID算法的通常办法:

PID的流程简略到了不能再简略的程度,经过差错期号操控被控量,而操控器自身便是份额、积分、微分三个环节的加和。这儿咱们规矩(在t时刻):
1.输入量为rin(t);
2.输出量为rout(t);
3.差错量为err(t)=rin(t)-rout(t);
pid的操控规矩为

了解一下这个公式,首要从下面几个疑问着手,为了便于了解,把操控环境具体一下:
1.规矩这个流程是用来为直流电机调速的;
2.输入量rin(t)为电机转速预订值;
3.输出量rout(t)为电机转速实习值;
4.施行器为直流电机;
5.传感器为光电码盘,假定码盘为10线;
6.直流电机选用PWM调速转速用单位 转/min 标明;
不丑恶出以下定论:
1.输入量rin(t)为电机转速预订值(转/min);
2. 输出量rout(t)为电机转速实习值(转/min);
3.差错量为预订值和实习值之差(转/min);
那么以下几个疑问需求弄了解:
1.经过PID环节往后的U(t)是啥值呢?
2.操控施行器(直流电机)翻滚转速应当为电压值(也便是PWM占空比)。
3.那么U(t)与PWM之间存在如何的联络呢?
即,每个电压对应一个转速,电压和转速之间呈现线性联络。可是我思考这种办法的条件是吧直流电机的特性了解为线性了,而实习情况下,直流电机的特性必定不是线性的,或许说在有些上是趋于线性的,这便是为何说PID调速有个计划的疑问。具体看一下
所以在正式进行调速计划之前,需求现有开环体系,查验电机和转速之间的特性曲线(或许查阅电机的材料阐明),然后再进行闭环参数整定。这篇先写到这,下一篇阐明接连体系的离散化疑问。并依据离散化后的特征叙说方位型PID和增量型PID的用法和C言语结束进程。
PID操控算法的C言语结束二 PID算法的离散化
上一节中,我论说了PID算法的根柢办法,并对其操控进程的结束有了一个简明的阐明,经过上一节的总结,根柢现已能够了解PID操控的进程。这一节中先持续上一节内容赔偿阐明一下。
1.阐明一下反响操控的原理,经过上一节的框图不丑恶出,PID操控正本是对差错的操控进程;
2.假定差错为0,则份额环节不起效果,只需存在差错时,份额环节才起效果。
3.积分环节首要是用来消除静差,所谓静差,便是体系安稳后输出值和设定值之间的差值,积分环节实习上便是差错累计的进程,把累计的差错加到原有体系上以抵消体系构成的静差。
4.而微分信号则反响了差错期号的改动规矩,或许说是改动趋势,依据差错期息的改动趋势来进行调度,然后添加了体系的活络性。
好了,关于PID的根柢阐明就赔偿到这儿,下面将对PID接连体系离散化,然后便利在处理器上结束。下面把接连情况的公式再贴一下:

假定采样距离为T,则在第KT时刻:
err(K)=rin(K)-rout(K);
积分环节用加和的办法标明,即err(K)+err(K+1)+……;
微分环节用斜率的办法标明,即[err(K)-err(K-1)]/T;
然后构成如下PID离散标明办法:

则u(K)可标明变成:

至于说Kp、Ki、Kd三个参数的具体表达式,我想能够轻松的推出了,这儿节省时刻,不再具体标了解。
正本到这儿接连,PID的根柢离散标明办法现已出来了。如今的这种表述办法归于方位型PID,别的一种表述办法为增量式PID,由U上述表达式能够简略得到:

那么:

这便是离散化PID的增量式标明办法,由公式能够看出,增量式的表达效果只和近期三次的差错差有关,这么就大大行进了体系的安稳性。需求留神的是终究的输出效果应当为
u(K)+增量调度值;
PID的离散化进程根柢思路便是这么,下面是将离散化的公式改换变成C言语,然后结束微操控器的操控效果
PID操控算法的C言语结束三 方位型PID的C言语结束
上一节中现已笼统出了方位性PID和增量型PID的数学表达式,这一节,要害阐明C言语代码的结束进程,算法的C言语结束进程具有通常性,经过PID算法的C言语结束,能够以此类比,计划其它算法的C言语结束。
榜首步:界说PID变量构造体,代码如下:
struct _pid{
float SetSpeed; //界说设定值
float ActualSpeed; //界说实习值
float err; //界说差错值
float err_last; //界说上一个差错值
float Kp,Ki,Kd; //界说份额、积分、微分系数
float voltage; //界说电压值(操控施行器的变量)
float integral; //界说积分值
}pid;
操控算法中所需求用到的参数在一个构造体中统必界说,便利后边的运用。
第二部:初始化变量,代码如下:
void PID_init(){
printf("PID_init begin \n");
pid.SetSpeed=0.0;
pid.ActualSpeed=0.0;
pid.err=0.0;
pid.err_last=0.0;
pid.voltage=0.0;
pid.integral=0.0;
pid.Kp=0.2;
pid.Ki=0.015;
pid.Kd=0.2;
printf("PID_init end \n");
}
一同初始化变量,分外是Kp,Ki,Kd三个参数,调试进程傍边,关于央求的操控效果,能够经过调度这三个量直接进行调度。
第三步:编写操控算法,代码如下:
float PID_realize(float speed){
pid.SetSpeed=speed;
pid.err=pid.SetSpeed-pid.ActualSpeed;
pid.integral+=pid.err;
pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
pid.err_last=pid.err;
pid.ActualSpeed=pid.voltage*1.0;
return pid.ActualSpeed;
}
留神:这儿用了最根柢的算法结束办法,没有思考死区疑问,没有设定上下限,仅仅对公式的一种直接的结束,后边的介绍傍边还会逐步的对此改进。
到此接连,PID的根柢结束有些就开端结束了。下面是查验代码:
int main(){
printf("System begin \n");
PID_init();
int count=0;
while(count
下面是经过1000次的调度后输出的1000个数据(具体的参数整定进程就不阐了解,网上这种阐明十分多):
PID操控算法的C言语结束四 增量型PID的C言语结束
上一节中介绍了最简略的方位型PID的结束办法,这一节首要阐明增量式PID的结束办法,方位型和增量型PID的数学公式请拜见我的系列文《PID操控算法的C言语结束二》中的阐明。结束进程依然是分为界说变量、初始化变量、结束操控算法函数、算法查验四个有些,具体分类请参与《PID操控算法的C言语结束三》中的阐明,这儿直接给出代码了。
/*
* PID.c
*
* Created on: 2011-11-7
* Author: wang
*/
#include<stdio.h>
#include<stdlib.h>
struct _pid{
float SetSpeed; //界说设定值
float ActualSpeed; //界说实习值
float err; //界说差错值
float err_next; //界说上一个差错值
float err_last; //界说最上前的差错值
float Kp,Ki,Kd; //界说份额、积分、微分系数
}pid;
void PID_init(){
pid.SetSpeed=0.0;
pid.ActualSpeed=0.0;
pid.err=0.0;
pid.err_last=0.0;
pid.err_next=0.0;
pid.Kp=0.2;
pid.Ki=0.015;
pid.Kd=0.2;
}
float PID_realize(float speed){
pid.SetSpeed=speed;
pid.err=pid.SetSpeed-pid.ActualSpeed;
float incrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);
pid.ActualSpeed+=incrementSpeed;
pid.err_last=pid.err_next;
pid.err_next=pid.err;
return pid.ActualSpeed;
}
int main(){
PID_init();
int count=0;
while(count<1000)
{
float speed=PID_realize(200.0);
printf("%f\n",speed);
count++;
}
return 0;
}

上一篇:PCB前处理制程疑问剖析

下一篇:AD软件原理图改换到PCB进程图解

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部