Electric vehicles are using electric machines for propulsion and energy recuperation. An electric machine can be of two types: motor and generator. An electric motor converts electric energy into mechanical energy, while an electric generator converts mechanical (kinetic) energy into electrical energy.
Compared to an internal combustion engine, an electric motor has several advantages. Some of them are described in the table below.
Characteristic  Internal combustion engine (ICE)  Electric Machine (EM) 
Number of moving parts  Very high  Low 
Reliability  Moderate  High 
Efficiency [%]  Low (less than 45)  High (more than 90) 
Bidirectional  No (can not rotate and generate torque in reverse)  Yes (can rotate and generate torque also in reverse) 
Energy recupperation  No  Yes 
Power density [kW/kg]  Low (e.g approx. 0.7 Chevrolet V8 Turbo Diesel)  High (e.g. approx. 1.4 Toyota Prius BLDC*) 
Torque output at standstill  No  Yes 
Noise, vibrations  Moderate  Low 
Exhaust gas pollutants  High (CO, HC, NOx, PM)  None 
*Brushless DC electric motor
When designing from scratch an electric vehicle or when doing a conversion (internal combustion engine to electric machine) there are two options for the powertrain:
 design an build the electric machine
 integrate already existing electric machines
The first option only makes sense for high volume, mass production of electric vehicle. Designing and manufacturing an electric machine requires a lot of funding, knowledge and time. For electric vehicles OEMs (e.g. Tesla, RenaultNissan, etc.) it makes sense to design and manufacture the electric machines since the overall cost is lower and they have control on the technical specification.
For prototypes, conversions or low volume production electric vehicles, integrating an existing electric machine is more efficient.
For our EV design example we are going to choose two already available electric machines. After searching a suitable pair of electric machines for our application we came up with these solutions [1]:
 front axle: BorgWarner HVH250090SOM electric motor
 rear axle: BorgWarner HVH410075DOM electric motor
Both motors are developed by BorgWarner and are used on several automotive and heavyduty applications. The motors can be configured in terms of rotor type:
 for maximum torque, power and efficiency: IPM (permanent magnets) rotor
 for simpler controls and cost advantage: AC induction rotor
Since our battery electric vehicle will be designed for high dynamic performance, we’ll choose the IPM rotor type motors. The technical details for both motors are provided in the figures below.
Operating conditions:
Motor mass data:

Motor efficiency is up to 94% and around 90% above 2000 rpm. The motor is liquid cooled and can hold peak torque up to 60 seconds.
For the rear axle we are going to fit another motor, with higher maximum peak torque. The reason is that it should provide a good amount of torque to meet the 0 – 100 kph acceleration time. Also, the powertrain is configured to work with only one reduction gear so the motor should output a very high torque.
Operating conditions:
Motor mass data:

The HVH410 motor is delivering a peak torque of 860 Nm from 0 to 1700 rpm, for a 400 V supply voltage. The maximum efficiency is 95% and covers a broad range of speed and torque. The continuous torque is delivered starting from 840 Nm and for speeds above 2000 rpm is only 5% less than peak torque. The maximum speed of the HVH410 motor is only 6000 rpm but the power is compensated by the very high value of the torque.
Electric motors torque and efficiency
The torque curves for both motors, at 400 V nominal voltage, are extracted from the pictures provided by the supplier (BorgWarner).
The motor efficiency η_{m} [] is the ratio between output power P_{out} [W] and input power P_{in} [W]:
\[\eta_{m} = \frac{P_{out}}{P_{in}} \tag{1}\]The input power is the sum between the output power and the power losses P_{loss} [W]:
\[P_{in} = P_{out} + P_{loss} \tag{2}\]The power losses are going to be approximated by a mathematical equation [2].
\[P_{loss} = k_{c} \cdot T^{2} + k_{i} \cdot \omega + k_{w} \cdot \omega^{3} + C \tag{3}\]where:
k_{c} [] – copper losses coefficient
k_{i} [] – iron losses coefficient
k_{w} [] – windage losses coefficient
C [W] – constant power losses
T [Nm] – motor torque
ω [rad/s] – motor speed
Equation (3) applies to DC motors but, by fine tuning the coefficients, we can get an efficiency map similar with the one published by the electric machine manufacturer (BorgWarner).
Using Scilab we can calculate and plot the efficiency map for HVH250 electric motor.
// xengineer.org clear clc clf() // Motor data from specification raw_peak=[0 330;2620 324;2840 319;2950 311;3110 296;.. 3290 279;3490 262;3690 243;3910 225;.. 4130 208;4440 187;4650 175;5020 157;.. 5310 145;5600 134;5980 122;6360 112;.. 6960 99;7440 90;8040 80;8750 73;.. 9180 68;9650 63;10200 59;10600 56]; // [rpm Nm] raw_cont=[0 271;873 270;1840 265;2490 260;2960 256;.. 3130 247;3380 231;3560 220;3800 205;.. 4070 190;4380 175;4580 165;4820 155;.. 5090 144;5470 131;5840 121;6290 109;.. 6840 97;7360 87;7800 80;8400 73;.. 8960 67;9870 58;10600 51]; // [rpm Nm] N=linspace(0,10600,60); // [rpm] Tq=linspace(0,350, 50); // [Nm] N_p_rpm_X=raw_peak(:,1); // [rpm] Tq_p_Nm_Y=raw_peak(:,2); // [Nm] N_c_rpm_X=raw_cont(:,1); // [rpm] Tq_c_Nm_Y=raw_cont(:,2); // [Nm] kc=0.1; // [W/Nm^2] ki=0.0; // [W/(rad/s)] kw=1.0e5; // [W/(rad/s)^3] C=500; // [W] effMin=0.74; // [] omega=N*%pi/30; // [rad/s] for i=1:length(omega) for j=1:length(Tq) Pout(i,j)=(omega(i)*Tq(j)); // [W] Ploss(i,j)=kc*Tq(j)^2+ki*omega(i)+kw*omega(i)^3+C; // [W] end end eff=max(effMin,Pout./(Pout+Ploss))*100; // [] V=[70,85,90,91,92,93,94,95,96,97,98,99]; contour(N,Tq,eff,V); plot(N_p_rpm_X,Tq_p_Nm_Y,'b','LineWidth', 2) plot(N_c_rpm_X,Tq_c_Nm_Y,'r','LineWidth', 2) hf=gcf(); ha=gca(); ha.data_bounds=[0,0;max(N),max(Tq)] xgrid(); xlabel('Motor Speed [rpm]'); ylabel('Motor Torque [Nm] & Motor efficiency [%]'); title('HVH250 400V') xs2png(hf,'HVH250 motor efficiency and maximum torque.png')
By running the Scilab instructions above into a script file (*.sce
) we get the following plot.
The same principles we can apply to the HVH410 motor. The differences are in the torque characteristics and power losses coefficients. The Scilab script for motor efficiency calculation are presented below.
// xengineer.org clear clc clf() // Motor data from specification raw_peak=[0 860;871 850;1310 846;1620 846;1730 835;.. 1830 810;1940 768;2280 642;2470 577;.. 2690 516;2920 466;3190 415;3570 359;.. 3840 327;4110 300;4410 275;4830 246;.. 5160 225;5650 203;6000 187]; // [rpm Nm] raw_cont=[0 840;430 833;798 818;1210 797;1610 772; 1750 762;1840 738;1970 694;2100 650;2240 606; 2380 562;2570 512;2800 461;3120 403; 3460 352;3690 323;4050 287;4330 264; 4820 227;5220 203;5610 182;6000 168]; // [rpm Nm] N=linspace(0,6000,60); // [rpm] Tq=linspace(0,900, 50); // [Nm] N_p_rpm_X=raw_peak(:,1); // [rpm] Tq_p_Nm_Y=raw_peak(:,2); // [Nm] N_c_rpm_X=raw_cont(:,1); // [rpm] Tq_c_Nm_Y=raw_cont(:,2); // [Nm] kc=0.01; // [W/Nm^2] ki=3; // [W/(rad/s)] kw=1.5e5; // [W/(rad/s)^3] C=2200; // [W] effMin=0.74; // [] omega=N*%pi/30; // [rad/s] for i=1:length(omega) for j=1:length(Tq) Pout(i,j)=(omega(i)*Tq(j)); // [W] Ploss(i,j)=kc*Tq(j)^2+ki*omega(i)+kw*omega(i)^3+C; // [W] end end eff=max(effMin,Pout./(Pout+Ploss))*100; // [] V=[50,70,80,85,90,92,93,94,95,97,98]; contour(N,Tq,eff,V); plot(N_p_rpm_X,Tq_p_Nm_Y,'b','LineWidth', 2) plot(N_c_rpm_X,Tq_c_Nm_Y,'r','LineWidth', 2) hf=gcf(); ha=gca(); ha.data_bounds=[0,0;max(N),max(Tq)] xgrid(); xlabel('Motor Speed [rpm]'); ylabel('Motor Torque [Nm] & Motor efficiency [%]'); title('HVH410 400V') xs2png(hf,'HVH410 motor efficiency and maximum torque.png')
By running the Scilab instructions above into a script file (*.sce
) we get the following plot.
Electric motor modeling and simulation
For our application we are going to consider a very simple mechanical model of the HVH250 electric motor, which consists only of a lumped inertia and a load torque.
where:
T_{m} [Nm] – electric motor torque
ω_{m} [rad/s] – electric motor speed
J_{m} [kg·m^{2}] – rotor inertia
T_{load} [Nm] – load torque
The equation of equilibrium for out motor model is:
\[T_{m} – T_{load} – J_{m} \cdot \frac{d \omega_{m}}{dt} = 0 \tag{4}\]From (4) we can calculate the value of the motor speed as:
\[\omega_{m} = \frac{1}{J_{m}} \cdot \int \left ( T_{m} – T_{load} \right ) dt \tag{5}\]Using Xcos we are going to build 3 block diagrams, starting from a simple model and ending with a motor and battery model:
 simple motor (speed control, no load)
 simple motor (speed control, with load)
 simple motor and battery (speed control, with load)
Our first example is a closed loop speed control model which contains a PID
controller and the integration of equation (5), with the load torque equal to 0 Nm
. We setup a target speed of 5000 rpm
. The difference between the target speed actual motor speed is the speed error, which is fed to the PID controller. The PID controller (Kp = 20
, Ki = 1
, Kd = 0
) will output the motor torque Tm
which will be limited by the maximum continuous torque of the motor.
The Interp
block (continuous torque limitation) has the following parameters: X = N_c_rpm_X
, Y = Tq_c_Nm_Y
, defined in the Scilab script above.
The Integrator
block will compute the motor speed ω_{m} [rad/s]. The motor speed Nm
in [rpm] is computed as:
The motor efficiency etam
is extracted from a 2D lookup table Interp 2
which has the following parameters:
 X coord =
Tq
 Y coord =
N
 Z values =
eff
These parameters need to be loaded in the Scilab workspace before the simulation is run. All of them, except the motor inertia, are defined in the Scilab script above. The motor inertia is defined as Jm=0.067
kg·m^{2}.
The simulation output variables are the motor speed, torque and efficiency. All of them are sampled with the Clock
block at 0.01
s and saved in the Scilab workspace as sOut
structure. After the simulation is run for 1
s, the saved variables sOut
are plotted in the below:
The closed loop controller brings the motor speed at 5000 rpm before 0.2 s. The motor torque starts from maximum and decreases toward zero when motor speed reaches target speed. The motor efficiency peaks 95 % and stabilises at 74 % where the motor torque is zero. In reality however, the motor torque can not be zero when the rotor is spinning. Since there are losses in the bearings the PID controller will have to output a certain amount of torque to keep the motor speed at target speed.
In our second example we are going to use the same mode but also with a constant load torque of 100
Nm.
We can also calculate the mechanical power P_{m} [W] as the product between the motor torque T_{m} [Nm] and motor angular speed ω_{m} [rad/s].
\[P_{m} = T_{m} \cdot \omega_{m} \tag{6}\]In our simulation model the power is calculated in kW and saved in the Scilab workspace. After the simulation is run for 1
s, the motor speed, torque, efficiency and power are plotted in the figure below.
Since there is an external load connected to the motor it takes a longer time to accelerate up to the target speed. Also, in order to maintain constant target speed, the motor torque (PID) outputs 100 Nm (equal with the load). The motor efficiency stays at a high value (approx. 95 %) since the motor operates at 5000 rpm and 100 Nm. (check the contour plot of the efficiency).
In out third example we keep the same motor model with speed controller and load and we add a battery model.
The motor load is set to 250
Nm and the target speed to 2000
rpm. The purpose of this simulation is to run the model until the battery depletes. The battery parameters are defined in a Scilab script which has to be run before the simulation of the model.
// xengineer.org bp.C_Ah = 93.6; // battery capacity bp.SOC_x_pct = [10 12 15 20 25 85 92 95 98 100]; // battery state of charge axis bp.U_y_V = [350 370 385 393 395 405 409 415 430 450]; // battery voltage map bp.UDC_V = 400; // battery nominal voltage bp.SOC0_pct = 100; // battery initial state of charge Jm=0.067; // [kg/m^2]
The battery model is described in the article EV design – battery simulation.
The input power from equation (1) is the electrical power of the battery. From equation (1) we can calculate the electrical power P_{e} [W] as:
\[P_{e} = \frac{P_{m}}{\eta_{m}} \tag{7}\]where:
P_{m} [W] – motor (mechanical) power
η_{m} [] – motor efficiency
Also, the electrical power is the product between voltage and current:
\[P_{e} = U \cdot I \tag{8}\]where:
U [V] – battery voltage
I [A] – battery current
From (8) we can calculate the battery current which is fed to the battery model which in turn computes the battery voltage and state of charge.
The model is run for 200000
s, which is around 55.55 hours. The results are sampled at 10
s and saved in sOut
variable. The results are plotted in the figures below.
The motor speed, torque, efficiency and power will be constant throughout the simulation, with the following values: 2000
rpm, 250
Nm, 88.44
% and 52.36
kW.
As the motor is operated, the voltage continues to drop from peak 450 V down to 375 V. As the voltage of the battery drops, in order to maintain the same output power, the current drawn from the battery is increased from 1.3 A to 1.6 A.
After more than 55 h of motor operation at 2000 rpm and 250 Nm, the battery state of charge drops from 100 % to 13 %.
This example can be used to understand the dynamics of the electric motor and also the influence of its efficiency on the battery state of charge.
References:
[1] https://cdn.borgwarner.com/technologies/electricdrivemotors/hvhserieselectricmotor
[2] J. Larminie, J. Lowry, Electric Vehicle Technology Explained, John Wiley & Sons, 2003
Disha
Thank you so much for such a useful calculation.
hien nguyen
Hi everyone,
I have an question. I would like assume that in calculate I use internal combustion engine and electric motor. But when run experiment I can use 2 electric motor with 1 electric motor is equivalent with original internal combustion engine. so can it occur or not? If it maybe accept then What do I need to do next. Thanks in advance. Regards
Chandraprakash
Hello Anthony,
The motor inertia value mentioned in the beginning of the article is 0.067 kgm2, 1/ Jm should have been 15, but instead in the PID, a gain of 20 given, can you explain this part ?
Anthony Stark
Hi Chandraprakash,
The parameters of the PID are not function of motor inertia. The PID is calibrated manually to give a satisfactory response. You might apply different parameters of the PID function of the motor characteristics but that’s up to you.
Guy Payeur
Hello,
Nice demonstration. Would it be possible to share the Scilab files?
Best regards
Anthony Stark
Hi,
All the source files can be found on Patreon:
https://www.patreon.com/xengineer
steve schuller
Hello i;m interested in building a large diameter {approx. 22 inch ] PM outrunner style DC motor to use within a hubless style wheel for EV app . I own a machine shop and can make all the mechanicals but would like some assistance in the design .
Bob.
I steve, I have an original design for an electric motor, would you like to make it with me?
Mudit Verma
How to use Look up table in simulink ?? i have getting these error.
Invalid setting in ‘Motor/2D Lookup Table’ for parameter ‘Table’.
Caused by:
Error evaluating parameter ‘Table’ in ‘Motor/2D Lookup Table’
Dimensions of arrays being concatenated are not consistent.
Component:Simulink  Category:Model error
In block ‘Motor/Max. continous Torque(Nm)’, the number of dimensions specified by the ‘Table data’ parameter (2) must match the ‘Number of table dimensions’ parameter value (1).
Sadeep
Hi,
How to design a switched reluctance motor for EV application?