You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.4 KiB
132 lines
3.4 KiB
clc |
|
clear |
|
close all |
|
|
|
% ArduCopter SITL example vehicle |
|
% This sets up the vehicle properties that are used in the simulation |
|
% simple 450 size x quad based on Hexsoon |
|
|
|
% setup the motors |
|
|
|
% locations (xyz) in m |
|
motor(1).location = [[sind(45),cosd(45)]*450*0.5,0] * 0.001; % front right |
|
motor(2).location = [[sind(135),cosd(135)]*450*0.5,0] * 0.001; % rear right |
|
motor(3).location = [[sind(225),cosd(225)]*450*0.5,0] * 0.001; % rear left |
|
motor(4).location = [[sind(315),cosd(315)]*450*0.5,0] * 0.001; % front left |
|
|
|
% PWM output to use |
|
motor(1).channel = 1; |
|
motor(2).channel = 4; |
|
motor(3).channel = 2; |
|
motor(4).channel = 3; |
|
|
|
% rotation direction: 1 = cw, -1 = ccw |
|
motor(1).direction = -1; |
|
motor(2).direction = 1; |
|
motor(3).direction = -1; |
|
motor(4).direction = 1; |
|
|
|
% motor properties |
|
electrical.kv = 880; % (rpm/volt) |
|
electrical.no_load_current = [0.7,10]; % (A) @ (V) |
|
electrical.resistance = 0.115; % (ohms) |
|
|
|
% ESC properties |
|
esc.resistance = 0.01; % (ohms) |
|
|
|
% Propeller properties |
|
prop.diameter = 245 * 0.001; % (m) |
|
prop.pitch = 114.3 * 0.001; % (m) |
|
prop.num_blades = 2; |
|
prop.PConst = 1.13; |
|
prop.TConst = 1; |
|
prop.mass = 12.5*0.001; % (kg) (only used for inertia) |
|
prop.inertia = (1/12)*prop.mass*prop.diameter^2; % rotational inertia (kgm^2) (rod about center) |
|
|
|
% assign properties to motors |
|
for i = 1:4 |
|
motor(i).electrical = electrical; |
|
motor(i).esc = esc; |
|
motor(i).prop = prop; |
|
end |
|
|
|
% Setup battery |
|
battery.voltage = 4*4.2; % (volts) |
|
battery.resistance = 0.0034; % (ohms) |
|
battery.capacity = 5.2; % (ah) |
|
|
|
% Add all to vehicle |
|
copter.motors = motor; |
|
copter.battery = battery; |
|
copter.mass = 2; % (kg) |
|
inertia = (2/5) * copter.mass * (0.45*0.2)^2; % (sphere) |
|
copter.inertia = diag(ones(3,1)*inertia); % rotational inertia matrix (kgm^2) |
|
copter.cd = [0.5;0.5;0.5]; |
|
copter.cd_ref_area = [1;1;1] * pi * (0.45*0.5)^2; |
|
|
|
save('Hexsoon','copter') |
|
|
|
% Plot motor curves |
|
% http://www.bavaria-direct.co.za/constants/ |
|
% http://www.stefanv.com/rcstuff/qf200204.html |
|
% Some calculators estimate heat and increase resistance with temp |
|
% But then we have to estimate the power dissipation |
|
% Max power for plot only |
|
max_power = 260; |
|
battery.voltage = battery.voltage * 0.50; |
|
|
|
Kt = 1/(electrical.kv * ((2*pi)/60) ); % Convert Kv to rads/second |
|
|
|
% plot the current from 0 to max power |
|
amps = 0:0.1:max_power/battery.voltage; |
|
power_in = amps * battery.voltage; |
|
|
|
% voltage drop due to copper and esc |
|
copper_drop = amps * electrical.resistance; |
|
esc_drop = amps * esc.resistance; |
|
|
|
ideal_voltage = battery.voltage - copper_drop - esc_drop; |
|
power_out = ideal_voltage .* (amps - electrical.no_load_current(1)); |
|
efficiency = power_out ./ power_in; |
|
|
|
torque = Kt * amps; |
|
rpm = ideal_voltage * electrical.kv; |
|
|
|
% Plot motor characteristics |
|
figure('name',sprintf('motor characteristics at %0.2f volts',battery.voltage)) |
|
subplot(2,2,1) |
|
hold all |
|
title('RPM') |
|
plot(amps,rpm) |
|
xlabel('Current (A)') |
|
ylabel('RPM') |
|
xlim([0,amps(end)]) |
|
|
|
|
|
subplot(2,2,2) |
|
hold all |
|
title('torque') |
|
plot(amps,torque) |
|
xlabel('Current (A)') |
|
ylabel('torque (NM)') |
|
xlim([0,amps(end)]) |
|
|
|
subplot(2,2,3) |
|
hold all |
|
title('power') |
|
plot(amps,power_in) |
|
plot(amps,power_out) |
|
xlabel('Current (A)') |
|
ylabel('power (W)') |
|
ylim([0,inf]) |
|
xlim([0,amps(end)]) |
|
legend('Power in','Power out','location','northwest') |
|
|
|
subplot(2,2,4) |
|
hold all |
|
title('efficiency') |
|
plot(amps,efficiency) |
|
xlabel('Current (A)') |
|
ylabel('efficiency (%)') |
|
ylim([0,inf]) |
|
xlim([0,amps(end)])
|
|
|