Main Content

Replace Piecewise-Constant Resistor with Switched Linear Components

This example shows how to convert a Simscape™ model that has a Piecewise-Constant Resistor (nonlinear component) into a switched linear model, making it compatible with Simscape Hardware-in-the-Loop (HIL) workflow.

Introduction

Simscape HIL workflow supports conversion of Simscape models to functionally equivalent Simulink® models that are compatible for HDL code generation. In this example, the model uses a Piecewise-Constant Resistor that is event based. Events are not supported by the Simscape HIL workflow. You can convert such Simscape models to a switched linear model and make it compatible for HDL code generation. For more information, see Generate HDL Code for Simscape Models.

Open the Simscape model from the MATLAB® command prompt.

NonlinearModel = 'sschdlexVariableResistorExample';
open_system(NonlinearModel)
set_param(NonlinearModel, 'SimulationCommand', 'update');

Open the Simscape subsystem.

open_system([NonlinearModel,'/Simscape Subsystem'])

This model is an RLC circuit with a Piecewise-Constant Resistor acting as a "Load" resistance. For the Piecewise-Constant Resistor, the relationship between voltage $V$ and current $I$ is $V=I*R$, where $R$ is the numerical value presented at the physical signal port $R$.

To ensure a positive value for the resistance, any value below 1e-6 is replaced by 1e-6. This resistor is piecewise-constant because the resistance only changes when the input value differs from the current resistance value by more than the set tolerance. Thus, a continuously changing input is converted to a discrete set of resistances.

In this model, the signal going into the Piecewise-Constant Resistor is a step function that changes from 2 to 3 at t = 0.1 thus changing the load resistance from 2 Ω to 3 Ω.

Open the Simscape HDL Workflow Advisor using sschdladvisor function.

sschdladvisor(NonlinearModel)

In the Simscape HDL Workflow Advisor, right-click the Code generation compatibility > Check model compatibility task and select Run to Selected Task. This task fails because of the presence of the Piecewise-Constant Resistor.

Replace Piecewise-Constant Resistor with Switches and Constant Resistors

To convert this model to an equivalent switched linear model, replace the Piecewise-Constant Resistor with a set of switches and resistors for each desired value. Open the switched linear version of the model.

SwitchedLinearModel = 'sschdlexVariableResistorSwitchedLinearExample';
open_system(SwitchedLinearModel)
set_param(SwitchedLinearModel, 'SimulationCommand', 'update');

Instead of a Piecewise-Constant Resistor, the model uses a resistor and a switch for each desired resistance. In particular, it uses a resistance of 2 Ω and the other with a resistance of 3 Ω. By closing and opening the switches at t = 0.1, the model changes the load resistance from 2 Ω to 3 Ω.

open_system([SwitchedLinearModel,'/Simscape Subsystem'])

Controlling the Switches

Open the control signals for the switches.

open_system([SwitchedLinearModel,'/Input'])

The input signal V_switch contains two step functions, one that opens the switch in series with the 2 Ω resistor at t = 0.1 and one that closes the switch in series with the 3 Ω resistor at the same time.

Generate HDL Implementation Model

Use the default Solver Configuration settings for the switched linear model:

  • Solver type: Backward Euler

  • Sample time: 1e-3

In the model window, you can view the model statistics. Select the Debug tab and click Simscape > Statistics Viewer. This opens the Simscape Statistics window for sschdlexVariableResistorExample model.

Open the Simscape HDL Workflow Advisor for the switched linear model.

sschdladvisor(SwitchedLinearModel)

To generate the HDL implementation model, right-click the Implementation model generation > Generate implementation model task, and then select Run to Selected Task.

After the last task passes, it creates a link to the HDL implementation model gmStateSpaceHDL_sschdlexVariableResistorSwi.

Click on this link to open the generated implementation model.

In the right pane, the Extract discrete equations task output displays the number of states, inputs, outputs, modes, differential variables, and state-space representation for the Simscape network.

Generate HDL Code

To set up model parameters for HDL code generation, run the hdlsetup function.

hdlsetup('gmStateSpaceHDL_sschdlexVariableResistorSwi')

Save the parameters for the HDL implementation model.

hdlsaveparams('gmStateSpaceHDL_sschdlexVariableResistorSwi')

Enable generation of the resource utilization report.

hdlset_param('gmStateSpaceHDL_sschdlexVariableResistorSwi', 'ResourceReport', 'on')
hdlset_param('gmStateSpaceHDL_sschdlexVariableResistorSwi', 'MaskParameterAsGeneric', 'off');

Generate HDL code for the implementation model.

makehdl('gmStateSpaceHDL_sschdlexVariableResistorSwi/Simscape Subsystem/HDL Subsystem');

When you generate code, HDL Coder creates a code generation report. The resource utilization report in the High-level Resource Report indicates the number of adders, multipliers, and registers that might be consumed on the target FPGA device.

By changing the Piecewise-Constant Resistor to resistors that switch on and off, you change the model to a form that is compatible with the Simscape to HDL workflow.

See Also

Functions

Related Topics