Repository navigation
Expand file tree
/
Copy pathrun_closedloop_initial.m
More file actions
111 lines (85 loc) · 4.32 KB
/
Copy pathrun_closedloop_initial.m
File metadata and controls
111 lines (85 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
% run_closedloop_initial.m
addpath('../scripts');
params;
modelName = 'bldc_cl_model';
if exist(modelName, 'file') == 4
close_system(modelName, 0);
end
new_system(modelName);
open_system(modelName);
% Reference speed step (say 100 rad/s)
add_block('simulink/Sources/Step', [modelName, '/w_ref']);
set_param([modelName, '/w_ref'], 'Time', '0.05', 'Before', '0', 'After', '100');
% Disturbance
add_block('simulink/Sources/Step', [modelName, '/TL']);
set_param([modelName, '/TL'], 'Time', '10', 'Before', '0', 'After', '0'); % No disturbance for now
% Sum error
add_block('simulink/Math Operations/Sum', [modelName, '/Sum_Err']);
set_param([modelName, '/Sum_Err'], 'Inputs', '+-');
% PID with clamping anti-windup
% In Simulink, the PID block has built-in clamping.
add_block('simulink/Continuous/PID Controller', [modelName, '/PID']);
set_param([modelName, '/PID'], 'P', '0.1', 'I', '1', 'D', '0');
set_param([modelName, '/PID'], 'LimitOutput', 'on', 'UpperSaturationLimit', num2str(Vmax), 'LowerSaturationLimit', ['-' num2str(Vmax)]);
set_param([modelName, '/PID'], 'AntiWindupMode', 'clamping');
% Motor Plant
add_block('simulink/Math Operations/Sum', [modelName, '/Sum_Elec']);
set_param([modelName, '/Sum_Elec'], 'Inputs', '+--');
add_block('simulink/Math Operations/Gain', [modelName, '/Gain_1_L']);
set_param([modelName, '/Gain_1_L'], 'Gain', '1/L');
add_block('simulink/Continuous/Integrator', [modelName, '/Int_Elec']);
add_block('simulink/Math Operations/Gain', [modelName, '/Gain_R']);
set_param([modelName, '/Gain_R'], 'Gain', 'R');
add_block('simulink/Math Operations/Gain', [modelName, '/Gain_Ke']);
set_param([modelName, '/Gain_Ke'], 'Gain', 'Ke');
add_block('simulink/Math Operations/Gain', [modelName, '/Gain_Kt']);
set_param([modelName, '/Gain_Kt'], 'Gain', 'Kt');
add_block('simulink/Math Operations/Sum', [modelName, '/Sum_Mech']);
set_param([modelName, '/Sum_Mech'], 'Inputs', '+--');
add_block('simulink/Math Operations/Gain', [modelName, '/Gain_1_J']);
set_param([modelName, '/Gain_1_J'], 'Gain', '1/J');
add_block('simulink/Continuous/Integrator', [modelName, '/Int_Mech']);
add_block('simulink/Math Operations/Gain', [modelName, '/Gain_B']);
set_param([modelName, '/Gain_B'], 'Gain', 'B');
% Sinks
add_block('simulink/Sinks/To Workspace', [modelName, '/ToWs_w']);
set_param([modelName, '/ToWs_w'], 'VariableName', 'w_sim', 'SaveFormat', 'Array');
% Connections
add_line(modelName, 'w_ref/1', 'Sum_Err/1', 'autorouting', 'on');
add_line(modelName, 'Int_Mech/1', 'Sum_Err/2', 'autorouting', 'on'); % Feedback
add_line(modelName, 'Sum_Err/1', 'PID/1', 'autorouting', 'on');
add_line(modelName, 'PID/1', 'Sum_Elec/1', 'autorouting', 'on');
add_line(modelName, 'Sum_Elec/1', 'Gain_1_L/1', 'autorouting', 'on');
add_line(modelName, 'Gain_1_L/1', 'Int_Elec/1', 'autorouting', 'on');
add_line(modelName, 'Int_Elec/1', 'Gain_R/1', 'autorouting', 'on');
add_line(modelName, 'Gain_R/1', 'Sum_Elec/2', 'autorouting', 'on');
add_line(modelName, 'Int_Elec/1', 'Gain_Kt/1', 'autorouting', 'on');
add_line(modelName, 'Gain_Kt/1', 'Sum_Mech/1', 'autorouting', 'on');
add_line(modelName, 'TL/1', 'Sum_Mech/2', 'autorouting', 'on');
add_line(modelName, 'Sum_Mech/1', 'Gain_1_J/1', 'autorouting', 'on');
add_line(modelName, 'Gain_1_J/1', 'Int_Mech/1', 'autorouting', 'on');
add_line(modelName, 'Int_Mech/1', 'Gain_B/1', 'autorouting', 'on');
add_line(modelName, 'Gain_B/1', 'Sum_Mech/3', 'autorouting', 'on');
add_line(modelName, 'Int_Mech/1', 'Gain_Ke/1', 'autorouting', 'on');
add_line(modelName, 'Gain_Ke/1', 'Sum_Elec/3', 'autorouting', 'on');
add_line(modelName, 'Int_Mech/1', 'ToWs_w/1', 'autorouting', 'on');
set_param(modelName, 'Solver', 'ode45', 'StopTime', '0.5');
save_system(modelName, fullfile('..', 'models', 'bldc_cl_model.slx'));
simOut = sim(modelName);
w_sim_data = simOut.w_sim;
t_sim = simOut.tout;
fid = fopen('../results/phase3_log.txt', 'w');
fprintf(fid, 'Phase 3 - Closed Loop Initial Validation\n');
fprintf(fid, 'Max Speed Reached: %f rad/s\n', max(w_sim_data));
fprintf(fid, 'Final Speed Reached: %f rad/s\n', w_sim_data(end));
fclose(fid);
fig = figure('Visible', 'off');
plot(t_sim, w_sim_data, 'b-', 'LineWidth', 1.5);
hold on;
yline(100, 'r--', 'Reference', 'LineWidth', 1.5);
xlabel('Time (s)');
ylabel('Speed (rad/s)');
title('Closed-Loop Step Response (Kp=0.1, Ki=1)');
grid on;
saveas(fig, '../results/phase3_cl_response.png');
disp('Phase 3 completed.');