参考Simulink编写锁相环程序,在数据处理中不需要运行sim函数调用Simulink,以此来提高数据处理的效率。
下面相关代码,此处未考虑0轴分量
function [ud_filt,uq_filt] = PLL(data,kp,ki)
%%kp = 1; %ki = 10; 锁相环参数
size_data = size(data);
Ts = ceil(1e10*(data(1,2) - data(1,1)))/1e10;%计算采样时间
time = 0:Ts:6-Ts;
ua = data(2,:);% 三相电流数据
ub = data(3,:);
uc = data(4,:);
wt(1) = 0;% 初始角度
for i=1:1:size_data(2)
[ud(i),uq(i)] = a3s_2r (ua(i),ub(i),uc(i),wt(i));%% abc-dq 坐标变换
time_for = time(1:i); %% 循环时间
if i==1
yq(i) = uq+uq*time_for; % 首次循环采用数值计算
yyq(i) = yq*time_for;
else
sys_PI = tf([kp ki],[1 0]);
yq = lsim(sys_PI,uq,time_for);%
sys_s = tf(1,[1 0]);
yyq = lsim(sys_s,yq,time_for);
end
wt(i+1) = mod(yyq(i),2*pi);% 循环角度
f(i) = yq(i)/2/50/pi;% 输出频率
end
%% 滤波环节
fc = 100;%截止频率
fs = 1/Ts;%采样频率
[b,a] = butter(6,fc/(fs/2));
% freqz(b,a)
ud_filt = filter(b,a,ud); %b为分子,a为分母 第三项为输入数据
uq_filt = filter(b,a,uq);
end
坐标变换函数如下,此处未考虑0轴分量
function [udi,uqi] = a3s_2r(ua,ub,uc,theta)
for i=1:1:max(size(ua))
Martx = [cos(theta(i)) cos(theta(i)-2*pi/3) cos(theta(i)+2*pi/3);...
-sin(theta(i)) -sin(theta(i)-2*pi/3) -sin(theta(i)+2*pi/3)];%坐标变换矩阵
udq(i,:) = (2/3)*Martx*[ua(i);ub(i);uc(i)];%abc-dq变换 此处采用等幅值变换公式
end
udi = udq(:,1);
uqi = udq(:,2);
end
若不需要相角,建议直接给定相角,进行3s-2r变换,提高运行速度;
主函数如下:
clear
data = load("YStator_3020.mat");
data = data.YStator_3020;
% data = load("YTotal_3060.mat");
% data = data.YTotal_3060;
datau = [data(1,:);data(2,:);data(3,:);data(4,:)];%电压
time = data(1,:);
ua = data(2,:);% 三相电流数据
ub = data(3,:);
uc = data(4,:);
ia = data(5,:);% 三相电流数据
ib = data(6,:);
ic = data(7,:);
wt = time.*2*pi*50;
[ud,uq] = a3s_2r (ua,ub,uc,wt);%坐标变换函数
ud = ud/ud(1);
uq = uq/uq(1);
[id,iq] = a3s_2r (ia,ib,ic,wt);
id = id/id(1);
iq = iq/iq(1);
结果展示
d轴分量和q轴分量