微积分快速入门
S—路程 V—速度 a—加速度
其中的边长为v和t的长方形的面积为s
积分的结果是一个函数所围成的面积
进阶
积分
s = v * t v = a * t
微分
S = f(t) = v * t f '(t) = v
v = f(t) = a * t f '(t) = a
a = v' = s‘’
over
2.积分控制
PID控制器中的积分对应于图1中误差曲线 与坐标轴包围的面积(图中的灰色部分)。PID控制程序是周期性执行的,执行的周期称为采样周期。计算机的程序用图1中各矩形面积之和来近似精确的积分,图中的TS就是采样周期。
图1 积分运算示意图
每次PID运算时,在原来的积分值的基础上,增加一个与当前的误差值ev(n)成正比的微小部分。误差为负值时,积分的增量为负。 手动调节温度时,积分控制相当于根据当时的误差值,周期性地微调电位器的角度,每次调节的角度增量值与当时的误差值成正比。温度低于设定值时误差为正,积分项增大,使加热电流逐渐增大,反之积分项减小。因此只要误差不为零,控制器的输出就会因为积分作用而不断变化。积分调节的“大方向”是正确的,积分项有减小误差的作用。一直要到系统处于稳定状态,这时误差恒为零,比例部分和微分部分均为零,积分部分才不再变化,并且刚好等于稳态时需要的控制器的输出值,对应于上述温度控制系统中电位器转角的位置L。因此积分部分的作用是消除稳态误差,提高控制精度,积分作用一般是必须的。 PID控制器输出中的积分部分与误差的积分成正比。因为积分时间TI在积分项的分母中,TI越小,积分项变化的速度越快,积分作用越强。PID控制是一个二阶线性控制器
定义:通过调整比例、积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能。
优点
a. 技术成熟
b. 易被人们熟悉和掌握
c. 不需要建立数学模型
d. 控制效果好
e. 鲁棒性
通常依据控制器输出与执行机构的对应关系,将基本数字PID算法分为位置式PID和增量式PID两种。
基本PID控制器的理想算式为
(1)
式中
u(t)——控制器(也称调节器)的输出;
e(t)——控制器的输入(常常是设定值与被控量之差,即e(t)=r(t)-c(t));
Kp——控制器的比例放大系数;
Ti ——控制器的积分时间;
Td——控制器的微分时间。
设u(k)为第k次采样时刻控制器的输出值,可得离散的PID算式
(2)
式中 ,
。
由于计算机的输出u(k)直接控制执行机构(如阀门),u(k)的值与执行机构的位置(如阀门开
度)一一对应,所以通常称式(2)为位置式PID控制算法。
位置式PID控制算法的缺点:当前采样时刻的输出与过去的各个状态有关,计算时要对e(k)进
行累加,运算量大;而且控制器的输出u(k)对应的是执行机构的实际位置,如果计算机出现故
增量式PID是指数字控制器的输出只是控制量的增量Δu(k)。采用增量式算法时,计算机输出的控制量Δu(k)对应的是本次执行机构位置的增量,而不是对应执行机构的实际位置,因此要求执行机构必须具有对控制量增量的累积功能,才能完成对被控对象的控制操作。执行机构的累积功能可以采用硬件的方法实现;也可以采用软件来实现,如利用算式 u(k)=u(k-1)+Δu(k)程序化来完成。
由式(2)可得增量式PID控制算式
(3)
式中 Δe(k)=e(k)-e(k-1)
进一步可以改写成
(4)
式中 、
、
一般计算机控制系统的采样周期T在选定后就不再改变,所以,一旦确定了Kp、Ti、Td,只要使用前后3次测量的偏差值即可由式(3)或式(4)求出控制增量。
增量式算法优点:①算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果;②计算机每次只输出控制增量,即对应执行机构位置的变化量,故机器发生故障时影响范围小、不会严重影响生产过程;③手动—自动切换时冲击小。当控制从手动向自动切换时,可以作到无扰动切换。
我的工作是做一个温控系统(不带冷却装置),加热装置就是一般的热水壶。通过采集所得的温度误差,经PID算法得出控制量,再利用控制量去改变由单片机输出的PWM波的占空比。最后将PWM波送到继电器以控制热水壶加热和不加热。
我个人理解是必须用位置式PID。因为单片机输出的PWM波的占空比不带记忆性,你算一次PID意味着占空比就完全改变,也就是一个全新的值,不带记忆性。而像在执行机构为步进电机的控制系统里,你给一次控制量到步进电机,它就保持在那里。当你下一次再输入控制量到步进电机,它就将这一次的控制量叠加上去,也就是说有记忆性。
float rol = rol_tar + rol_now; //维持平衡 _tar设为0
float pit = pit_tar + pit_now; //_now 为采集到的数值
float yaw = yaw_tar + yaw_now;
PID_ROL.pout = PID_ROL.P * rol;
PID_PIT.pout = PID_PIT.P * pit;
PID_ROL.iout += PID_ROL.I * rol;
PID_PIT.iout += PID_PIT.I * pit;
// 每次PID运算时,增加一个与当前的误差值ev(n)成正比的微小部分
PID_ROL.dout = PID_ROL.D * MPU6050_GYRO_LAST.X;
PID_PIT.dout = PID_PIT.D * MPU6050_GYRO_LAST.Y;
//MPU6050_GYRO_LAST.X;上一次加速度计的数值,此为匿名的处理方式
标准的
PID_ROL.dout = PID_ROL.D * (rol - rol_last);
PID_PIT.dout = PID_PIT.D * (pit - pit_last);