一文读懂pid控制器

PID控制器

1. 控制器

在研究PID控制器前,必须先想一个问题,控制器的作用到底是什么?相信不少同学在学习自动控制原理的时候,接触最多的是:直接对传递函数进行分析,比如研究某个传函的阶跃响应?幅频特性?稳态误差?根据劳斯判据,根轨迹研究根的分布以判断系统的稳定型?

那么控制器又是哪里冒出来的?自控中的开环系统或者闭环系统不能解决问题么?其实这是我们认识狭隘了,这句话本身就是不对的,往下看。

举两个实例:

1.1 电机速度控制系统

电机速度

  1. 当出现扰动而使得电机的转速偏离设定值时,测速电动机充当检测变送环节的角色,而它的输出和设定值之间就会出现一个偏差信号(电压信号)
  2. 这个偏差信号通常是比较小的,所以需要放大器对其进行放大
  3. 而这个放大后的电压信号则是触发器的控制电压,控制晶闸管的关断时间,进而调节电动机的电枢电压,从而调节转速直到等于设定值

在这个控制系统中,电动机显然是被控对象,而它的转速变化规律是可以抽象为一个数学模型的,也就是传递函数;而其他的环节,则是为了共同产生一个控制信号来作为电动机的输入。

我们可以把比较器称为本文中的调节器,或者将比较器+放大器称为调节器,这不是重点,无伤大雅。

值得注意的是:这个系统中的所有环节,其控制规律都可以抽象为若干个传递函数

电机调速

  • Un*为设定值,Un为测量变送的反馈值
  • 两者偏差去调节触发器控制电压Uct,控制规律为Kp
  • 通过晶闸管控制电动机回路总电压Ud0,控制规律为Ks
  • Ud0 - 电枢总电阻电压即为电动机电动势E
  • E = Ceφn,得到输出转速;测速发电机根据转速反馈电压信号,控制规律α

1.2 温度或水位控制系统

水位控制

这个应该是比较简单的过程控制,实际水位低于设定水位时,控制器则作用于执行机构去增大调节阀开度,增加进水流量。

1.3 小小总结

不要总是孤立控制器,它们是控制被控对象的必要环节。

这里给出一般的闭环控制系统框图

闭环控制框图

不要单纯的认为只有被控对象才有传递函数,每一个环节都有其相应的控制规律,都可以抽象为一个数学模型,用对应的传递函数来表达。就像最小拍控制器设计中,我们根据输入信号选择整个系统的闭环传函,进而确定控制器的脉冲传递函数。

总结:对于闭环系统来说,控制器的输入是偏差信号,输出则是控制信号,去控制执行机构,进而调节被控对象

而闭环控制系统,设计目的就是系统输出对输入的跟随能力

2. PID

  • P:比例控制器,对系统产生的偏差能够迅速做出反应;但是比例控制器不能消除余差,不过随着比例系数的增大,余差会减小,同时系统输出振荡次数增加,稳定性也会下降,调节时间加长

关于不能消除余差这一点,从数学角度是可以解释的,求一下余差即可。当然直想也是可以理解的:对于一个速度控制系统,某时刻负载减小,导致转速上升,比例控制器作用于执行机构使得转速下降,假如转速可以下降到设定转速,那么此时负载依然是小于额定负载的,转速依然会上升;所以反证得,最后余差是肯定会存在的。

  • I:积分控制器,积分控制是可以消除余差的,体现于偏差消失后,积分控制器的输出是可以保持前时刻的输出;但是积分控制器的控制动作比较缓慢,一般不单独使用;随着积分系数的增大(时间常数的减小),系统的稳定性下降。

  • D:微分控制器,够体现出当前误差的变化趋势,在偏差出现或变化的瞬间,立即产生强烈的调节作用,从而加快系统的动作速度,减少调节时间;但是由于微分对静态偏差毫无控制能力(偏差存在,但是不变化,控制器输出为0),所以一般不单独使用。并且在纯比例作用的基础上增加微分作用可以提高系统稳定性。

总结:讲比例,积分,微分三种控制规律结合在一起,只要三项控制作用的强度配合得当,就既能快速调节,又能消除余差,从而得到满意的控制效果。

3. 模拟式PID

一般pid框图

模拟pid控制器的算法:

模拟pid算法

  • u(t) 为控制器输出,e(t) 为控制器输入,即偏差信号:e(t) = r(t) - y(t)
  • Kp 为比例系数,Ti 为积分时间常数,Td 为微分时间常数

给出一个简单的matlab模拟pid仿真:
模拟pid仿真

参数设置:Kp = 0.5, Ki = 0.2, Kd = 1;输出结果:

模拟pid仿真结果

模拟pid局限性

  • 功能单一,灵活性差
  • 信息分散,所用仪表多,且监视不方便
  • 接线过多,系统维护难度大

随着计算机等技术的发展,数字控制器日益成为工业生产中占据主导地位的控制器。

4. 数字式PID

对模拟pid控制器进行离散化处理,用后向差分代替微分得:(具体细节不细说)

离散化pid算法

4.1 位置式PID算法

位置式pid

  • Kp,Ki,Kd为比例,积分,微分的三个重要参数
  • k是采样序列号,k=0,1,2,3…
  • Uk第k次采样时刻控制器输出值
  • ek第k次采样时刻偏差,e(k-1)第k-1次采样偏差值,e(k-2)第k-2次采样偏差值
  • 位置式pid控制器的输入为系统的偏差值,输出为uk,即偏差的组合
4.1.2 位置式pid算法的缺点
  • 控制器输出与过去的各个状态有关,运算量大
  • 计算机出现故障,u(k)的大幅度变化会引起执行机构位置的大幅度变化

4.2 增量式PID算法

由位置式pid第k次输出 - 第k-1次输出 得到增量式pid算法:

增量式pid算法

增量式pid算法表示的是控制机构(阀门,步进电机等)的调节增量,即k时刻相对于k-1时刻的调节增量。

值得注意的是:采用增量式pid算法的控制器输出值为调节增量

从这里也可以得出位置式pid算法的另一种表示形式:
u(k) = u(k - 1) + Δu

可以说,位置式pid算法和增量式pid算法是pid算法的两种表现形式,从本质上讲二者是一致的。

4.2.2 增量式pid的优点
  • 算式中不需要累加;控制增量Δu(k)的确定仅与最近3次的采样值有关
  • 计算机每次只输出控制增量,对应执行机构位置的变化量,不易引起过程的异常操作
  • 手动—自动切换时冲击小。当控制从手动向自动切换时,
    可以作到无扰动切换

4.3 位置式pid和增量式pid的抉择

在实际使用中应该使用位置式还是增量式,关键看执行机构的特性:

  • 如果执行机构具有积分特性(如步进电机,具有齿轮传递特性的位置执行机构等),应该使用增量式pid算法
  • 如果执行机构没有积分特性,则应该使用位置式pid算法

4.4 位置式pid和增量式pid仿真

function [] = my_simulink_pid()
% 离散模型
ts = 0.001;						    % 采样时间
sys = tf(400, [1, 50, 0]);		    % 传递函数
d_sys = c2d(sys, ts, 'z');		    % 传递函数离散化
[num, den] = tfdata(d_sys, 'v');	% 提取分子分母

% pid参数
kp = 10; ki = 2; kd = 15;

% 初始化信号值
y_feed = 0;	    % 当前反馈值
y_prev1 = 0;    % 前一次输出值
y_prev2 = 0;    % 前前一次输出值

u_prev1 = 0;    % 前一次控制器输出值
u_prev2 = 0;    % 前前一次控制器输出值

e_prev1 = 0;    % 前一次偏差
e_prev2 = 0;    % 前前一次偏差

x = [0, 0, 0];  % p i d 分别的输出

for k = 1:1:3000
	time(k) = k*ts;         % 时间序列,用于画图
	r_in(k) = 1;            % 输入序列,单位阶跃
	e(k) = r_in(k) - y_feed;    % 当前时刻偏差

	delta_u = kp*x(1) + ki*x(2) + kd*x(3);
	% 位置式 PID算法
	% u(k) = u_prev1 + delta_u;
	% 增量式 PID算法
	u(k) = delta_u;

	% 对输出限幅
	if u(k) >= 10
		u(k) = 10
	end

	if u(k) <= -10
		u(k) = -10
	end
	
	% 值得注意得是,这是输出序列的差分方程;得到他的步骤:
	% 1. z变换得到脉冲传递函数
	% 2. 分子分母乘上z的最高次幂的导数,本例中就是z^-2
	% 3. 交叉相乘,整理
	% 4. z反变换
	y_out(k) = -den(2)*y_prev1- den(3)*y_prev2 + num(2)*u_prev1 + num(3)*u_prev2;  % 系统输出序列
	y_feed = y_out(k);	    % 反馈值

	u_prev2 = u_prev1;      % 更新控制器输出
	u_prev1 = u(k);
	y_prev2 = y_prev1;      % 更新系统输出
	y_prev1 = y_out(k);

	x(1) = e(k) - e_prev1;
	x(2) = e(k);
	x(3) = e(k) - 2*e_prev1 + e_prev2;
	e_prev2 = e_prev1;      % 更新偏差
	e_prev1 = e(k);
end

% 画图
figure(1);
plot(time, r_in, 'b', time, y_out, 'r'); 
axis([0, 3, 0, 1.5]);                           % 确定坐标轴范围
xlabel('time(s)'),ylabel('r_in, y_out');   		% 系统输出和系统输入的曲线

figure(2);
plot(time, r_in, 'b', time, u, '--k'); 
axis([0, 3, -0.2, 2.5]);                        % 确定坐标轴范围
xlabel('time(s)'),ylabel('r_in, u_out');   		% 控制器输出和系统输入的曲线		

仿真结果:

增量式pid——系统食输出和系统输入曲线图

r&y

增量式pid——控制器输出和系统输入曲线图

r&u

关于位置式pid算法,在代码中也有标注,只需要加前一时刻控制器输出即可,至于参数的整定,在这里不详细说明。

欢迎指出不足,共同进步,谢谢~

  • 10
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值