Main Content

Equivalent Consumption Minimization Strategy

Energy management controller for P0–P4 hybrid electric vehicles

Since R2020b

Libraries:
Powertrain Blockset / Propulsion / Supervisory Controllers

Description

Use the Equivalent Consumption Minimization Strategy (ECMS) block to control the energy management of hybrid electric vehicles (HEVs). The block optimizes the torque split between the engine and motor to minimize energy consumption while maintaining the battery state of charge (SOC).

The HEV P0, P1, P2, P3, and P4 reference applications use the Equivalent Consumption Minimization Strategy block for hybrid control.

Use the Motor location parameter to specify the HEV motor location.

Use the ECMS method parameter to implement either an adaptive or non-adaptive ECMS method. The HEV architectures are charge-sustaining, meaning the battery SOC must remain in a specified range because there is no plugin capability to recharge the battery. The battery is an energy buffer, and all energy comes from the fuel if the change in SOC is minimized over a drive cycle. To sustain the charge over a specified drive cycle, the block implements either of these ECMS methods.

ECMS MethodDescription

Non-adaptive (default)

The block uses a constant ECMS equivalence factor.

  • Use this method to determine the best fuel economy over a drive cycle.

    • If you change the drive cycle or HEV architecture, retune the ECMS weighting factor to maintain the ending SOC.

  • By default, the block uses a single constant.

Adaptive

The block adjusts an ECMS equivalence factor by using the output of a PI controller.

  • Use this method to maintain the SOC and minimize the delta SOC over many drive cycles. The block:

    • Tunes the PI controller gains.

    • Sustains the SOC.

  • The PI controller minimizes the error between the target SOC and current SOC.

ECMS Control Algorithm

The block implements a dynamic supervisory controller that determines the engine torque, motor torque, starter, clutch, and brake pressure commands. Specifically, the block:

  • Converts the driver accelerator pedal signal to a wheel torque request. To calculate the total powertrain torque at the wheels, the algorithm uses the maximum engine torque and motor torque curves and the transmission and differential gear ratios.

  • Converts the driver brake pedal signal to a brake pressure request. The algorithm multiplies the brake pedal signal by a maximum brake pressure.

  • Implements a regenerative braking algorithm for the traction motor to recover the maximum amount of kinetic energy from the vehicle.

    The block implements an ECMS algorithm[2] that optimizes the torque split between the engine and motor to minimize energy consumption while maintaining the battery SOC. Specifically, the ECMS:

    • Assigns a cost to electrical energy, so that using stored electrical energy is equal to consuming fuel energy.

      Battery ModeEquivalent Electrical EnergyDescription

      Discharging

      Positive

      Battery discharges stored electrical energy when the electric machine is in use.

      Charging

      Negative

      Battery stores electrical energy from either the:

      • Engine and electric machine acting as a generator

      • Electric machine acting as a generator during regenerative braking

    • Is an instantaneous minimization method that the software solves at every controller time step. To implement the strategy, the ECMS selects the optimal motor and engine torque in the optimization strategy to minimize the equivalent energy consumption.

    • Implements either an adaptive or non-adaptive ECMS method.

Examples

Ports

Input

expand all

Wheel torque command.

Data Types: double

Battery state of charge.

Data Types: double

Battery voltage.

Data Types: double

Transmission gear.

Data Types: double

Motor speed.

Data Types: double

Vehicle speed, in m/s.

Data Types: double

Transmission temperature, in K.

Data Types: double

Output

expand all

Block data, returned as a bus signal that contains these block values.

Signal DescriptionUnits

EngTrqCmd

Engine torque command

N·m

MtrTrqCmd

Motor torque command

N·m

EquivFctr

Equivalence factor

NA

MinHamil

Minimum Hamiltonian

kW

Engine torque command, in N·m.

Data Types: double

Motor torque command, in N·m.

Data Types: double

Parameters

expand all

Block Options

Specify the HEV motor location.

Use the ECMS method parameter to implement either an adaptive or non-adaptive ECMS method. The HEV architectures are charge-sustaining, meaning the battery SOC must remain in a specified range because there is no plugin capability to recharge the battery. The battery is an energy buffer, and all energy comes from the fuel if the change in SOC is minimized over a drive cycle. To sustain the charge over a specified drive cycle, the block implements either of these ECMS methods.

ECMS MethodDescription

Non-adaptive (default)

The block uses a constant ECMS equivalence factor.

  • Use this method to determine the best fuel economy over a drive cycle.

    • If you change the drive cycle or HEV architecture, retune the ECMS weighting factor to maintain the ending SOC.

  • By default, the block uses a single constant.

Adaptive

The block adjusts an ECMS equivalence factor by using the output of a PI controller.

  • Use this method to maintain the SOC and minimize the delta SOC over many drive cycles. The block:

    • Tunes the PI controller gains.

    • Sustains the SOC.

  • The PI controller minimizes the error between the target SOC and current SOC.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: EcmsMethod
Values: Non-adaptive (default) | Adaptive
Data Types: character vector

Differential

Differential gear ratio. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: N_diff
Values: 3.32 (default) | scalar
Data Types: double

Differential efficiency factor. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: eta_diff
Values: 0.98 (default) | scalar
Data Types: double

Loaded wheel radius, in m.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: Re
Values: 0.327 (default) | scalar
Data Types: double

Transmission

Transmission efficiency factors.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: TransEffFactors
Values: Gear, input torque, input speed, and temperature (default) | Gear only
Data Types: character vector

Transmission gear number vector. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: G_trans
Values: [0 1 2 3 4 5 6] (default) | vector
Data Types: double

Transmission gear ratio vector. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: N_trans
Values: [1 4.212 2.637 1.8 1.386 1 0.772] (default) | vector
Data Types: double

Transmission efficiency vector. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: eta_trans
Values: [1 1 1 1 1 1 1] (default) | vector
Data Types: double

Dependencies

To enable this parameter, set Transmission efficiency factors to Gear only.

Transmission efficiency torque breakpoints, in N·m.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: Trq_trans_bpts
Values: [25 50 75 100 150 200 250] (default) | vector
Data Types: double

Dependencies

To enable this parameter, set Transmission efficiency factors to Gear, input torque, input speed, and temperature.

Transmission efficiency speed breakpoints, in rad/s.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: omega_trans_bpts
Values: vector
Data Types: double

Dependencies

To enable this parameter, set Transmission efficiency factors to Gear, input torque, input speed, and temperature.

Transmission efficiency temperature breakpoints, in K.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: Temp_trans_bpts
Values: [313 358] (default) | vector
Data Types: double

Dependencies

To enable this parameter, set Transmission efficiency factors to Gear, input torque, input speed, and temperature.

Transmission efficiency vector. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: eta_trans_tbl
Values: array
Data Types: double

Dependencies

To enable this parameter, set Transmission efficiency factors to Gear, input torque, input speed, and temperature.

Engine

Speed breakpoints, in rpm.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: f_tbrake_n_bpt
Values: vector
Data Types: double

Commanded torque breakpoints, in N·m.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: f_tbrake_t_bpt
Values: vector
Data Types: double

Brake torque map, in N·m.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: f_tbrake
Values: array
Data Types: double

Minimum engine torque command table, in N·m.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: f_tbrake_min
Values: vector
Data Types: double

Fuel flow map, in kg/s.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: f_fuel
Values: array
Data Types: double

Minimum engine torque command, in N·m.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: HEVEngTrq_min
Values: 16.18610438796213 (default) | scalar
Data Types: double

Fuel lower heating value, in J/kg.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: LHV
Values: 46000000 (default) | scalar
Data Types: double

Engine idle speed, in rpm.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: N_idle
Values: 750 (default) | scalar
Data Types: double

Battery

Battery state-of-charge breakpoints. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: SOC_bpt
Values: [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1] (default) | vector
Data Types: double

Battery charge limit table. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: ChrgLmt
Values: [1 1 1 1 1 1 1 0.9 0.7 0.5 0] (default) | vector
Data Types: double

Battery discharge limit table. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: DischrgLmt
Values: [0 0.5 0.7 0.9 1 1 1 1 1 1 1] (default) | vector
Data Types: double

Maximum battery current, in A.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: BattCurrMax
Values: 150 (default) | scalar
Data Types: double

DC/DC converter efficiency. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: eta_dcdc
Values: 1 (default) | scalar
Data Types: double

Maximum battery charge power, in W.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: BattChrgPwrMax
Values: -30000 (default) | scalar
Data Types: double

Maximum battery discharge power, in W.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: BattDischrgPwrMax
Values: 46000 (default) | scalar
Data Types: double

Motor

Motor maximum torque table, in N·m.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: f_tmtr_max
Values: vector
Data Types: double

Motor speed breakpoints, in rpm.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: f_mtr_w_bpt
Values: vector
Data Types: double

Motor torque breakpoints, in N·m.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: f_mtr_t_bpt
Values: vector
Data Types: double

Motor efficiency map. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: f_mtr_eta
Values: array
Data Types: double

Number of motor torque calculation points. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: Ngrid
Values: 200 (default) | scalar
Data Types: double

P0 belt ratio. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: N_P0
Values: 3 (default) | scalar
Data Types: double

Dependencies

To enable this parameter, set Motor location to P0.

Energy Management

ECMS weighting factor. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: ECMS_s
Values: 3.385 (default) | scalar
Data Types: double

Penalty factor power. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: PenaltyFctrPwr
Values: array
Data Types: double

Adaptive ECMS proportional gain. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: ECMS_Kp
Values: 0 (default) | scalar
Data Types: double

Dependencies

To enable this parameter, set ECMS method to Adaptive.

Adaptive ECMS integral gain. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: ECMS_Ki
Values: 0 (default) | scalar
Data Types: double

Dependencies

To enable this parameter, set ECMS method to Adaptive.

Constraint penalty factor. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: PenaltyFctr
Values: 10000000 (default) | scalar
Data Types: double

Target battery state-of-charge. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: SOCTrgt
Values: 60 (default) | scalar
Data Types: double

Minimum battery state-of-charge. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: SOCmin
Values: 40 (default) | scalar
Data Types: double

Maximum battery state-of-charge. No dimension.

Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Parameter: SOCmax
Values: 80 (default) | scalar
Data Types: double

Acknowledgments

MathWorks® would like to acknowledge the contribution of Dr. Simona Onori to the ECMS optimal control algorithm implemented in this block. Dr. Onori is a Professor of Energy Resources Engineering at Stanford University. Her research interests include electrochemical modeling, estimation and optimization of energy storage devices for automotive and grid-level applications, hybrid and electric vehicles modeling and control, PDE modeling, and model-order reduction and estimation of emission mitigation systems. She is a senior member of IEEE®.

References

[1] Balazs, A., Morra, E., and Pischinger, S., Optimization of Electrified Powertrains for City Cars. SAE Technical Paper 2011-01-2451. Warrendale, PA: SAE International Journal of Alternative Powertrains, 2012.

[2] Onori, S., Serrao, L., and Rizzoni, G., Hybrid Electric Vehicles Energy Management Systems. New York: Springer, 2016.

Extended Capabilities

expand all

C/C++ Code Generation
Generate C and C++ code using Simulink® Coder™.

Version History

Introduced in R2020b