Analog Design

Kevin Aylward B.Sc.

XSpice Cores


Back to Contents

 

Abstract

 

This paper addresses how to construct arbitrary XSpice cored transformers and inductors. The approach used here is one of engineering functionality rather then a detailed explanation of the XSpice core implementation method.


Component Descriptions

 

1 There are two components that are used to build up XSpice transformers and inductors. All are XSpice specific and require an "a" as the first letter of their spice reference designator names.


"CORE" component.

 

This component is used to set up a tabulated transfer function of magnetic flux density B verses magnetic field strength H. The core component has two symmetrical terminals, much like a resistor. Indeed, it can be used to construct a piece wise nonlinear resistor. The core model can also be used to construct a v(out) = F(vin), where the function is specified by a table. This makes conversion of the PSpice TABLE construct possible.

 

The current through the core component is the applied voltage divided by the values set by the core specification table, modified by core length and area scale factors.

 

A typical core specification is shown here:

 

.model FerriteCore core area=1e-4 length=1e-2

+ H_array = [-250 -100 -50 -37.5 -25 -12.5 0 12.5 25 37.5 50 100 250]

+ B_array = [-0.375 -0.36 -0.32 -0.29 -0.24 -0.15 0 0.15 0.24 0.29 0.32 0.36 0.375]

 

The key spice words are "h_array" "b_array" "length" "area"

 

This table is formed by examining a standard B/H curve of the core. Hysteresis is not supported in this model so data point might need to be extrapolated from the midpoint of the B/H positive and negative going graphs.

 

For each data point in the h_array (x-axis), there is a corresponding data point in the b_array (y-axis). H is in A/M and B is in Tesla. For example, the table above shows that at a H of 100 a B of 0.36 will be produced.

 

It would be called in a spice line in the following format:

 

Acore_id node1 node2 FerriteCore


Nonlinear Resistor

 

To construct a nonlinear resistor set length and area to 1, and set the h_array data points to the input voltage and the b_array to the current value that that voltage produces.

 

e.g.

 

a_nonliner_resistor node1 node2 NonLinResModel

 

.model NonLinResModel

+h_array [-4 -3 -2 -1 0 1 2 3 4]

+b_array [-16 -9 -4 -1 0 1 4 9 16]

 

Note, the resistor does not have to be symmetrical.

 

The above will produce a current of 16A for an input of 4 volts. Other values in-between the table data points will be interpolated by a straight line.

 

1.1                          The "LCOUPLE" component

 

This component forms the inductor of the transformer, and an interface to the core component. It has 4 terminals. The first two terminals are the terminals of the inductor that is being modeled. The third terminal connects to one end of the core component and the other, in most cases can be connected to ground. Terminals can be swapped for polarity reasons, if required, i.e. 1 with 2 and 3 with 4.

 

The lcouple has a number of turns parameter num_turns.


2 Constructing the core model

 

2.1 Use one lcouple model in place of every inductor in a transformer, treating all transformer taps as stops and start of separate windings. That is, connect the inductor terminals 1 and 2 to terminals 1 and 2 of the lcouple.

 

2.2 Connect each 3rd terminal of the lcouple through a core component to every other 3rd terminal of the lcoples described in 2.1. Connect all 4th terminals of the lcouples to ground.

 

Specify the number of turns on the windings.


Example primary and secondary center tapped transformer.

 

.subckt CenterTappedTransformer P1 PCT P2 S1 SCT S2

*

a_LP1 P1 PC1 1 0 lcouple_primary

a_LP2 PCT P2 2 0 lcouple_primary

a_LS1 S1 SCT 3 0 lcouple_secondary

a_LS2 SCT S2 4 0 lcouple_secondary

*

a_core_12 1 2 FerriteCore

a_core_13 1 3 FerriteCore

a_core_14 1 4 FerriteCore

a_core_23 2 3 FerriteCore

a_core_24 2 4 FerriteCore

a_core_34 3 4 FerriteCore

*

.model FerriteCore core area=1e-4 length=.01

+ H_array = [-250 -100 -50 -37.5 -25 -12.5 0 12.5 25 37.5 50 100 250]

+ B_array = [-0.375 -0.36 -0.32 -0.29 -0.24 -0.15 0 0.15 0.24 0.29 0.32 0.36 0.375]

.model inductor_lcouple_prim num_turns=50

.model lcouple_secondary num_turns=100

.ends

 

Note, due to the conventions used in the models, the above example will result in an inverted output on the primary. This can be corrected by swapping the subckt input line's S1 and S2


Example Inductor

 

.subckt CoredInductor 1 2

a1 1 2 3 0 inductor_lcouple

a2 3 0 inductor_core

*

.model inductor_lcouple num_turns=50

.model inductor_core area=1e-4 length=.01

+ H_array = [-250 -100 -50 -37.5 -25 -12.5 0 12.5 25 37.5 50 100 250]

+ B_array = [-0.375 -0.36 -0.32 -0.29 -0.24 -0.15 0 0.15 0.24 0.29 0.32 0.36 0.375]

*

.ends


3 Example V(out)=F(vin) Table

 

Vi in is on 1 and 2, vout is at nodes 3 and 4

 

.SUBCKT GenericTable 1 2 3 4

*

e1 5 0 1 2 1

atable 5 6 table

v1 6 0 0

h1 4 3 v1 1k

.model table core area=1m length=1

+ H_array=[-4 -3 -2 -1 0 1 2 3 4]

+ B_array=[-16 -9 -4 -1 0 1 4 9 16]

.ends

 

e1 performs a high impedance transfer of the input voltage to a nonlinear cored resistor.

h1 measures the current in this resistor and outputs a voltage dependent on this current.

H_array is the input voltage, b_array is the corresponding output voltage.

The scale factors 1k and 1m are arbitrary and could both be unity, without changing the results. They are used to avoid possible numerical issues by keeping currents in the lower ranges.

 

This model can be copied, with only the tables changed to support other transfer functions.


Kevin Aylward 2013

All rights reserved

The information on the page may be reproduced

providing that this source is acknowledged.

Website last modified 30th August 2013

www.kevinaylward.co.uk