两变频调速电机系统的神经网络逆同步控制
近年来,随着工业生产自动化技术的不断发展,过去针对一台电机的控制在很多场合已经不能满足时代的需求。更多的情况是通过控制多台电机去达到指标,那么这就产生了一个新的问题,如何更好地协调运行多电机同步系统是现代工业生产中应用比较广泛探讨的问题。
通过多年的发展,多电机同步系统是现代工业生产中应用比较广泛的电控系统,在工业生产、军事及航空等行业有广阔的应用领域。高性能的电机同步协调控制可提高纺织、冶金、机械、造纸等行业产品的质量和成品率。我国目前的张力设备绝大多数仍沿用模拟量张力型直流传动方式,但直流电机存在着性价比差、维护费用高、转速低和容量小等诸多难以克服的缺点,因此使用交流电机来替代直流电机驱动系统已经成为必然。但是交流电机是高阶、强祸合、非线性的复杂控制对象,这使传统的线性定参数PID控制常常顾此失彼,无法达到满意的控制效果,同时工业生产要求实现张力与速度的解耦控制,这就更增加了控制的难度。
而神经网络阶逆系统方法是近些年来提出的一种新的控制方法。它将逆系统的控制思想与神经网络结合起来,使用神经网络构建逆系统模型,再将逆系统与原系统串联构成复合伪线性系统。此方法不但克服了精确数学模型构建的困难,而且结构简单易于工程实现。因此采用神经网络阶逆系统来实现两电机的同步控制具有十分重要的现实意义。
1.2 多电机同步控制技术的发展概述
自从1980年Koren提出交叉耦合控制以后,许多科学工作者围绕“多电轴协调控制”展开了进一步研究。到了90年代,Guo等把双线性理论应用到多电机的控制上,之后Tomizuka等又把自适应前馈控制策略应用到交叉藕合控制器中,以提高瞬间响应和抗干扰能力。采用交叉耦合控制能有效地解决各轴之间动态性能不匹配的问题,把最优控制、自适应控制、前馈控制等控制方法应用于线性跟踪取得了一些效果,但遇到非线性跟踪就暴露其局限性。于是人们采用时变交叉藕合控制器、变增益交叉藕合控制器等来实现这种非线性跟踪控制,取得了一定的控制效果。
在多电机的速度和张力解耦控制中,除了传统的反馈控制以外,主要有如下控制方式:
·前馈控制策略
1999年,Seok和Seung-Ho等根据实际平均转子速度和参考张力设计前馈补偿器,实现解祸控制,2000年他们又提出了带张力观测的控制器。
·交叉耦合控制
2000年,张殿华等用伪对角化方法来设计交叉耦合控制器,使补偿后的系统具有对角占优的特性,实现活套和张力的解祸控制。
·现代控制理论方法
1991年Yoshiro等采用最优调节理论实现多变量的活套控制,根据不同的权矩阵计算不同的控制增益。
·分散、子空间方法
1997年,Tetsuzo等把分散控制的方法应用到张力控制系统中,设计具有PI结构的自适应控制器来补偿邻近子系统的影响。
·神经网络控制
1998年,Luo应用多层神经网络使速度环和张力环隔离,实现速度和张力的半独立控制。
但是以上多种方式都是基于直流电机的,具有很大的局限性。近年来提出的神经网络a阶逆系统是由我国学者独创的理论和方法,它与自动控制、人工智能、神经网络理论、计算机科学、模式识别等有密切的关系,是相关学科相互结合与渗透的产物,具有广阔的应用前景。神经网络a阶逆系统这一先进的控制理论和方法不但在交流调速系统中得到应用,神经网络a阶逆系统不但推动了多电机同步控制技术的发展,而且在其他领域也将这一理论成果转化成经济效益,提高了企业的竞争力。
通常情况下,两电机的基本物理结构如下所示:
当变频器工作在矢量控制方式下,系统的数学模型可以表示为:
本系统主要是在MATLAB中实现两电机同步控制的仿真,因此本章不涉及到具体的硬件,涉及到硬件的部分均用数学模块表示。在本系统,我们将速度采样值及其一阶导数、张力采样值及其一阶、二阶导数作为神经网络训练时的输入样本,把对应时刻速度PID控制器输出到变频器的频率给定作为神经网络的一个期望输出,由于张力本质上是由两台电机间速度差所决定的,因此把速度PID控制器与张力PID控制器输出到变频器的频率给定差作为神经网络的另一个期望输出。因此,两电机同步系统试验平台的完整的神经网络逆系统控制结构图如图4.1所示。
图4.1 神经网络逆系统控制结构图
此系统是神经网络逆系统与两电机同步系统相串联构成的复合被控系统,此时被控系统已经是一个线性且己经解耦的特殊系统。
图4.1中已经给出了整个系统的基本原理框图,本节将重点研究并实现两电机的仿真模型。根据虎克定理,通过两个变频调速电机系统的速度和张力作为被控制量,两台变频器的给定作为输入,根据张力公式:
根据虎克定律,考虑前滑量,张力具有以下的形式:
这里通过一个仿真循环,模拟电机在开环状态下的工作情况,其仿真图如下所示:
图4.2 在输入没有跳变的情况下两电机工作仿真图
在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。
比例(P)控制 :其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差。
积分(I)控制 :在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。
微分(D)控制 :在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。
本文我们不重点介绍PID控制器相关理论知识,这里仅给出PID控制下的两电机的仿真效果,用于与神经网络逆系统控制算法的性能对比。下面是几组张力恒定情况下,改变速度的仿真图,注意这里仅通过了PID控制器,未加入逆系统。
输入速度为方波:
图4.3 输入为方波的速度响应图
速度突然改变:
图4.4 速度突然改变的速度响应图
输入速度为三角波:
图4.5 速度为三角波的速度响应图
这里暂时先讨论速度响应图,在后面将介绍基于神经网络逆系统的两电机控制系统,我将同时对比速度,张力及速度张力同时作用的仿真。
clc;
clear;
%电机仿真参数
%电机仿真参数
%两电机模型的具体参数可以更改,假设两个电机除了转速,其余变量是相同的
times = 2000; %仿真时间;
np1 = 2; %极对数
np2 = 2; %极对数
J1 = 0.5; %转动惯量
J2 = 0.5; %转动惯量
Tr1 = 0.5; %电磁时间常数
Tr2 = 0.5; %电磁时间常数
fair1 = 0.23; %转子磁链
fair2 = 0.23; %转子磁链
Lr1 = 0.5; %转子自感
Lr2 = 0.5; %转子自感
TL1 = 0; %负载转矩
TL2 = 0; %负载转矩
r1 = 0.8; %电机轴半径
r2 = 0.8; %电机轴半径
k1 = 1/20; %电机速比常数
k2 = 1/20; %电机速比常数
T = 5 ; %皮带张力变化常数
K = 17.2; %传递常数;
wr1 = zeros(times,1);
wr2 = zeros(times,1);
F = zeros(times,1);
dt = 0.01;
%产生信号输入
% select = 1:速度突然突然变大,张力不变
% select = 2:速度突然突然变小,张力不变
% select = 3:速度为方波,张力不变
% select = 4:速度为三角波,张力不变
% select = 5:张力突然突然变大,速度不变
% select = 6:张力突然突然变小,速度不变
% select = 7:张力为方波,速度不变
select = 1;
[w,F2] = func_signal(times,select);
Error1 = zeros(times,1);
Error2 = zeros(times,1);
x1=zeros(times,1);
x2=zeros(times,1);
x3=zeros(times,1);
x4=zeros(times,1);
x5=zeros(times,1);
output1 = zeros(times,1);
output2 = zeros(times,1);
PlantOut1 = zeros(times,1);
PlantOut2 = zeros(times,1);
load net.mat
for i = 5:times-4
disp('循环次数');
i
%速度PID
%速度PID
Proportion1 = 9.8269;
Integral1 = 4.0806;
Derivative1 = 1.899;
input1(i) = (w(i) - wr1(i));
output1(i) = PlantOut1(i);
Error1(i) = input1(i) - output1(i);
CumulateError1(i) = Error1(i)^2*dt;
ErrorArea1(i) = Error1(i)*dt;
if i == 1
dError1 = Error1(i);
else
dError1 = Error1(i) - Error1(i-1);
end
PIDout1(i) = Proportion1 * Error1(i) + Integral1 * sum(ErrorArea1) + Derivative1 * dError1;
%输出计算
gs1(i) = 0.5/5*exp(-1/5*i*dt)*dt;
PlantOut1(i+1) = PIDout1*fliplr(gs1)';
speed(i) = output1(i);
%张力PID
%张力PID
Proportion2 = 9.2269;
Integral2 = 4.0806;
Derivative2 = 0.399;
input2(i) = 0.77*(w(i) - (F2(i) - F(i)));
output2(i) = PlantOut2(i);
Error2(i) = input2(i) - output2(i);
CumulateError2(i) = Error2(i)^2*dt;
ErrorArea2(i) = Error2(i)*dt;
if i == 1
dError2 = Error2(i);
else
dError2 = Error2(i) - Error2(i-1);
end
PIDout2(i) = Proportion2 * Error2(i) + Integral2 * sum(ErrorArea2) + Derivative2 * dError2;
%输出计算
gs2(i) = 0.5/5*exp(-1/5*i*dt)*dt;
PlantOut2(i+1) = PIDout2*fliplr(gs2)';
power(i) = output2(i);
%五个输入量,通过神经网络
x1(i) = w(i);
x2(i) = (x1(i-2) - 8*x1(i-1) + 8*x1(i+1) -x1(i+2))/12;
x3(i) = F2(i);
x4(i) = (x3(i-2) - 8*x3(i-1) + 8*x3(i+1) -x3(i+2))/12;
x5(i) = (x4(i-2) - 8*x4(i-1) + 8*x4(i+1) -x4(i+2))/12;
%直接PID控制
E1(i) = speed(i);
E2(i) = power(i);
%神经网络输出控制电机
wr1(i+1) = ((np1/J1)*((E1(i)-wr1(i))*(np1*Tr1*fair1*fair1/Lr1)-(TL1+r1*F(i))));
wr2(i+1) = ((np2/J2)*((E2(i)-wr2(i))*(np2*Tr2*fair2*fair2/Lr2)-(TL2-r2*F(i))));
F(i+1) = (K/T) *(r1*k1*wr1(i)/np1 - r2*k2*wr2(i)/np2) -F(i)/T;
end
%效果显示
subplot(121);
plot(4.5*(wr1(1:times-100)),'b','LineWidth',2);%乘以固定系数4.5
title('响应速度');grid on
subplot(122);
plot(90*abs(F(1:times-100)),'r','LineWidth',2);%乘以固定系数90
title('响应张力');grid on
·motor_by_NN2.m :神经网络逆系统控制两电机仿真(通过NN控制)
clc;
clear;
close all;
%电机仿真参数
%电机仿真参数
%两电机模型的具体参数可以更改,假设两个电机除了转速,其余变量是相同的
times = 12000; %仿真时间;
np1 = 2; %极对数
np2 = 2; %极对数
J1 = 0.5; %转动惯量
J2 = 0.5; %转动惯量
Tr1 = 0.5; %电磁时间常数
Tr2 = 0.5; %电磁时间常数
fair1 = 0.23; %转子磁链
fair2 = 0.23; %转子磁链
Lr1 = 0.5; %转子自感
Lr2 = 0.5; %转子自感
TL1 = 0; %负载转矩
TL2 = 0; %负载转矩
r1 = 0.8; %电机轴半径
r2 = 0.8; %电机轴半径
k1 = 1/20; %电机速比常数
k2 = 1/20; %电机速比常数
T = 5 ; %皮带张力变化常数
K = 17.2; %传递常数;
wr1 = zeros(times,1);
wr2 = zeros(times,1);
F = zeros(times,1);
dt = 0.01;
[w,F2] = func_signal(times,3);
w=w/abs(max(w));
F2=F2/abs(max(F2));
Error1 = zeros(times,1);
Error2 = zeros(times,1);
x1=zeros(times,1);
x2=zeros(times,1);
x3=zeros(times,1);
x4=zeros(times,1);
x5=zeros(times,1);
output1 = zeros(times,1);
output2 = zeros(times,1);
PlantOut1 = zeros(times,1);
PlantOut2 = zeros(times,1);
load net.mat
for i = 5:times-4
disp('循环次数');
i
%速度PID
%速度PID
Proportion1 = 7.8269;
Integral1 = 4.5806;
Derivative1 = 1.899;
input1(i) = (w(i) - wr1(i));
output1(i) = PlantOut1(i);
Error1(i) = input1(i) - output1(i);
CumulateError1(i) = Error1(i)^2*dt;
ErrorArea1(i) = Error1(i)*dt;
if i == 1
dError1 = Error1(i);
else
dError1 = Error1(i) - Error1(i-1);
end
PIDout1(i) = Proportion1 * Error1(i) + Integral1 * sum(ErrorArea1) + Derivative1 * dError1;
%输出计算
gs1(i) = 0.5/5*exp(-1/5*i*dt)*dt;
PlantOut1(i+1) = PIDout1*fliplr(gs1)';
speed(i) = output1(i);
%张力PID
%张力PID
Proportion2 = 9.2269;
Integral2 = 6.0806;
Derivative2 = 0.399;
input2(i) = 0.18*(w(i) - (F2(i) - F(i)));
output2(i) = PlantOut2(i);
Error2(i) = input2(i) - output2(i);
CumulateError2(i) = Error2(i)^2*dt;
ErrorArea2(i) = Error2(i)*dt;
if i == 1
dError2 = Error2(i);
else
dError2 = Error2(i) - Error2(i-1);
end
PIDout2(i) = Proportion2 * Error2(i) + Integral2 * sum(ErrorArea2) + Derivative2 * dError2;
%输出计算
gs2(i) = 0.5/5*exp(-1/5*i*dt)*dt;
PlantOut2(i+1) = PIDout2*fliplr(gs2)';
power(i) = output2(i);
%五个输入量,通过神经网络
x1(i) = speed(i);
x2(i) = (x1(i-2) - 8*x1(i-1) + 8*x1(i+1) -x1(i+2))/12;
x3(i) = power(i);
x4(i) = (x3(i-2) - 8*x3(i-1) + 8*x3(i+1) -x3(i+2))/12;
x5(i) = (x4(i-2) - 8*x4(i-1) + 8*x4(i+1) -x4(i+2))/12;
x(1:5,i) = [x1(i),x2(i),x3(i),x4(i),x5(i)];
%整神经网络
temp=sim(net,x);
y1(i)=temp(1,i);
y2(i)=temp(2,i);
%神经网络输出控制电机
wr1(i+1) = ((np1/J1)*((y1(i)-wr1(i))*(np1*Tr1*fair1*fair1/Lr1)-(TL1+r1*F(i))));
wr2(i+1) = ((np2/J2)*((y2(i)-wr2(i))*(np2*Tr2*fair2*fair2/Lr2)-(TL2-r2*F(i))));
F(i+1) = (K/T) *(r1*k1*wr1(i)/np1 - r2*k2*wr2(i)/np2) -F(i)/T;
end
%效果显示
subplot(121);
plot(4.35*abs(max(w))*wr1(1:times-100),'b','LineWidth',2);
title('响应速度');grid on
subplot(122);
plot(90*abs(max(F2))*F(1:times-100),'r','LineWidth',2);
title('响应张力');grid on
figure
plot(w,'b','LineWidth',2);hold on
plot(4.35*(wr1(1:times-100))+0.78,'r','LineWidth',2);hold off
title('PID跟踪效果');
legend('给定速度','响应速度');