Documente Academic
Documente Profesional
Documente Cultură
Levin
OBSERVER BASED FAULT DETECTION IN DC-DC POWER
CONVERTERS
BY
KIERAN T. LEVIN
THESIS
Urbana, Illinois
Adviser:
Power electronics today are limited in their operational lifetimes, which can
have negative consequences for critical systems which depend on power elec-
tronic to stay functional. To help mitigate the effects of system failures due
to power electronics, a fault detection filter has been implemented to de-
tect both hard and soft faults in the power supply, while determining how
much load the supply can power while staying in specification in its reduced
operating state allowing reduced system operation or maintenance. In this
thesis, we study the effectiveness of such filters by testing them in a hardware
testbed. This testbed is comprised of a dc-dc buck converter. The detection
filters for monitoring the health of the components in this dc-dc converter,
as well as the converter controls, are implemented in a low-cost DSP. Us-
ing a lossy converter model which runs in real time on the DSP, the model
is continuously compared to the actual converter states generating an error
signal which can be used to characterize both the nature of the fault and
fault magnitude. A dc-dc converter is controlled by a TMS320F28335 DSP
which runs the fault detection filter. The fault detection filter uses an explicit
solver with a variable time step to compute the filter residuals, allowing for
accurate fault detection on low cost hardware.
ii
To my wife Elizabeth, who removed the distractions in my life, allowing me
to finish writing this thesis.
To my parents, for their love and support.
iii
ACKNOWLEDGMENTS
I thank Alejandro Domnguez-Garca for advising me, and for being patient
and helpful.
iv
TABLE OF CONTENTS
CHAPTER 1 INTRODUCTION . . . . . . . . . . . . . . . . . . . . 1
1.1 FDI in power electronics . . . . . . . . . . . . . . . . . . . . . 1
1.2 Current work using FDI in power electronics . . . . . . . . . . 2
1.3 Relevance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4 Our approach . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.5 Use of existing hardware . . . . . . . . . . . . . . . . . . . . . 4
1.6 Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
CHAPTER 4 RESULTS . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.1 Detectability of faults . . . . . . . . . . . . . . . . . . . . . . . 18
4.2 Raw measurements . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3 No fault static behavior . . . . . . . . . . . . . . . . . . . . . 27
4.4 Faulty output capacitor . . . . . . . . . . . . . . . . . . . . . 29
4.5 Faulty inductor . . . . . . . . . . . . . . . . . . . . . . . . . . 33
CHAPTER 5 CONCLUSIONS . . . . . . . . . . . . . . . . . . . . . 35
5.1 Successes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.2 Failures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
APPENDIX A SCHEMATICS . . . . . . . . . . . . . . . . . . . . . . 36
v
APPENDIX C SOURCE CODE . . . . . . . . . . . . . . . . . . . . . 39
C.1 Ezdsp28335SwitcherMain.c . . . . . . . . . . . . . . . . . . . . 39
C.2 Adc2VA.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
C.3 Adc2VA.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
C.4 Adclib.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
C.5 Adclib.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
C.6 Epwmlib.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
C.7 Epwmlib.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
C.8 LCD.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
C.9 LCD.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
C.10 Mathlib.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
C.11 Mathlib.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
C.12 Obsparams.h . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
C.13 Print.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
C.14 Print.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
C.15 Ring.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
C.16 Ring.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
C.17 Scilib.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
C.18 Scilib.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
C.19 switcherlibs.h . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
REFERENCES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
vi
CHAPTER 1
INTRODUCTION
Electrical systems today require higher levels of reliability and self diagnosis.
With the advent of long life electronics for biomedical and commercial appli-
cations, the need for fault diagnosis to help achieve higher levels of reliability
will become more important. Real time fault detection in dc-dc converters
is an important step to building higher reliability systems. If faults can be
detected early they can allow the converter to change its operating parame-
ters, or if it is operating with a smart system it may be able to communicate
its health to the load or supply, allowing other parts of the system to adjust
accordingly - allowing for longer operation - and prevent catastrophic failures
from occurring unexpectedly.
Fault-tolerance may be defined as the ability of a system to adapt and
compensate in a planned, systematic way to component faults and keep
delivering, completely or partially, the functionality for which it was de-
signed. Fault-tolerant electrical power supplies are paramount in many appli-
cations, ranging from safety- and mission-critical systems for aircraft, space-
craft and automobiles, to communication systems, computers supporting fi-
nancial markets, and industrial control equipment. In all these applications,
power electronics systems are the essential building blocks of the electric
power supply.
1
in real time. Many existing topologies have been proposed to detect faults,
such as the addition of thermal sensors to detect excessive power loss or failed
components, limits built into controller chips that can sense over-current or
over-voltage conditions or the addition of extra sensors to the power con-
verter.
In a power electronics system, key elements to achieving fault tolerance
are: component redundancy, a fault diagnosis system, and a reconfiguration
system that, upon information provided by the diagnosis system, removes
faulty components and usually substitutes them with redundant ones. A
fault diagnosis system executes three tasks [1]: i) detection makes a binary
decision whether or not a fault has occurred, ii) isolation determines the
location of the faulty component, and iii) a severity assessment determines
the extent of the fault.
In general, methods for fault diagnosis can be broadly classified into three
categories [1]: i) model-based, which includes observer-based detection filters
and fault knowledge-based methods that can point to specific faults by mea-
suring certain variables; ii) artificial intelligence, which uses neural networks
and fuzzy logic to develop expert systems that, once trained, can point to
specific faults; and iii) empirical and signal processing methods, which use
spectral analysis to identify specific signatures of a certain fault.
2
the detection filter differs from the true state of the system. For particu-
lar faults, by appropriately choosing the filter gain, the filter residuals have
certain geometrical characteristics that make the fault identifiable.
1.3 Relevance
Partly faulted components in power circuits can cause a multitude of prob-
lems, causing premature failure or a catastrophic failure in other components.
For a simple boost or buck converter, component failures such as soft capac-
itor faults or bad solder joints near high temperature components can slowly
degrade over time causing gradual degradation of performance. Loss of con-
verter functionality can cause catistrophic failures in componenets that are
powered by the converter.
3
1.3.2 Inductor failure
Inductor failures are usually due to heat or mechanical stresses on the wind-
ings, causing shorts or open circuits due to manufacturing flaws or electrical
overstresses. A common cause of inductor failures is corrosion [13] which can
cause failures in the winding insulation or where the inductor is soldered to
the board.
4
ware on a C2000 DSP. This DSP is often used in high performance power
electronics including motor drive controllers and multiphase inverters. In-
corporating the observer into an existing design can allow for an inexpensive
method for adding fault detection to existing power supply designs with little
modification.
1.6 Limitations
The piecewise linear observer needs to sample the system dynamics at a min-
imum of once each switch action. Furthermore the sampling window needs
to be small in comparison to the operating frequency of the converter so that
the initial conditions for the observer and final conditions of the converter
can be measured using a small enough time window so that the system does
not change appreciably during the measurement interval. Furthermore in the
current implementation there is a possibility that more instrumentation may
be required to determine the different states of the converter than what is
normally used by a conventional power supply, which can increase cost. The
hardware platform uses a minimum of four measurements for a buck, boost,
or flyback dc-dc converter, input voltage, output voltage, output current,
and inductor current. Many existing power supply designs use some com-
bination of these measurements, so it is not always necessary for additional
instrumentation to be added for the operation of the fault detection filter.
This implementation uses existing microprocessors such as digital signal
processors from Texas Instruments. This allows a low cost addition which
is adaptable to many existing solutions where the switching frequency is on
the order of tens of kilohertz. With our current hardware and a variable
time step solver we have found it easy to run our observer in real time with
switching frequencies up to 20 kHz using a DSP. While this is a low opera-
tional frequency for many power supplies in digital or personal electronics,
it is common for larger and more expensive dc-dc converters which have low
nominal operating frequencies such as those found in high power electronics
used in the automotive, industrial, and power distribution electronics; this
allows a solution to be implemented without costly or exotic hardware. Fur-
thermore, additional optimization of the filter may be possible, allowing the
observer to run on even lower cost hardware.
5
CHAPTER 2
Observers are well understood for control and estimation of linear systems,
and many previous works describe the use of averaged models for control of
switched power supplies. However these models cannot be used to detect
certain failures in switched systems. In this chapter we introduce the need
for piecewise linear observers.
In power electronics, it is common to use an averaged model of the sys-
tem to design the control. The use of averaged models together with the
Beard-Jones approach might look like a feasible solution for fault diagnosis
in power electronics systems. Careful analysis of certain types of faults, e.g.,
degradation in the output filter capacitor of a buck converter, shows that
this is not the case; i.e., a detection filter based on the averaged model of the
converter cannot capture this type of fault. To overcome the limitations of av-
eraged models for fault detection filter design, we use the converter switching
model and develop fault sensitive detection filters based on piecewise linear
observers [15].
2.1 Examples
An excellent example of a piecewise system is a buck power supply shown in
Fig. 2.1. The converter has two switches S1 and S2 of which during normal
operation, one or the other switch is on, allowing current to flow through the
inductor L. During normal operation switch S1 is kept on for some percentage
of the time which is related to the desired output voltage from the converter
as a percentage of the input voltage. When a switch action is implemented
the circuit is effectively reconfigured into a different circuit. For the model
of this circuit the matrix coefficients are changed to reflect the new physical
model. As the converter is switching rapidly the observer must change out
6
Rdson S1 RL L iL
S2 +
iin
RESR
vin
+
Rd vLoad
Load
+ + i
VDon VC Load
C
the matrix coefficients rapidly to reflect the actual circuit. Thus when the
converter is in state = 1 the observer will be in the corresponding state.
When the switches change, effectively reconfiguring the circuit into a different
topology, the observer needs to follow this change.
x(t)
= A x(t) + B u(t)
dt
where A and B are piecewise linear. When the configuration of the con-
verter changes, then the state matrices also change. We can define the num-
ber of configurations as P so that P . In the case of a simple buck or
boost converter operating in continuous mode the converter has two config-
urations. If we label these configurations [1, 2], then it can be said [1, 2].
To further understand the configurations of a switch mode power converter
take the example of a simple buck converter shown in Fig. 2.1.
When this converter is running in continuous mode it has two operating
conditions. For this example state = 1 is when S1 is on and S2 is off.
State = 2 is when S1 is off and S2 is on. The converter alternates between
these two states rapidly with a switching period of 10 kHz as defined by the
controller and the duty cycle. Whenever the switches change their configu-
ration the observer also switches its coefficients to represent the new state of
7
Rdson RL L iL
+
iin
RESR
vin
+ vLoad
Load
+ i
vC Load
C
the circuit. If we choose the states in the circuit to be Vc and IL , the state
equations can be written when = 1 as
1 1
iL = (iL Rdson iL RL ) + (vin vLoad ) (2.1)
L L
1 1
iL iLoad
vC = (2.2)
C C
In the other operating state when = 2 the state equations become
1 1
iL = (iL Rd iL RL ) + (VDon vLoad ) (2.3)
L L
1 1
iL iLoad
vC = (2.4)
C C
Writing these equations in matrix form we get
S1 on = 1
" # " #" # " #" #
Il Rdson +RL +Resr
L
1
L
IL 1 Resr
V input
= + L L
(2.5)
Vc 1
0 VC 0 C1
ILoad
C
S2 on = 2
" # " #" # " #" #
Il Rd +RL +Resr
L
1
L
IL 1 Resr
Vd
= + L L
(2.6)
Vc 1
0 VC 0 1
ILoad
C C
Looking at the equivalent circuit model for this system we can see the
configurations of the necessary components of each state are shown in Figures
2.2, and 2.3.
8
RL L iL
Rd RESR
vLoad
Load
+ + i
VDon vC Load
C
x(t)
= Ax(t) + Bu(t) (2.7)
dt
We can find the state of the system at some future t=T providing the input
u is known for all t0 < t < T ; this input can be gathered in real time by
measuring the inputs to the circuit. Using this approach we can sample
the system and compute the output of the observer many times each time
it switches on or off. This does work but is rather crude as it requires
a very small time step to get accurate results for a fixed time step solver.
Unfortunately dc-dc converters normally run at high frequencies. Most dc-dc
converters run above 20 kHz, so a small time step relative to the switching of
the converter would require at least 10 steps per switching cycle, leading to
a sampling frequency of at least 200 kHz. Even with this high sampling rate
the results from this method are not as accurate as we would hope. Taking
the system dynamics and moving to the frequency domain it can be shown
that if the state equations are expanded in a Taylor series they will have
to be truncated at the Nyquist rate. With a sample rate of 200 kHz, the
Nyquist rate starts at 100 kHz. Thus we can only expand out this series a
few terms until it gets truncated. Looking at the waveforms of the inductor
and capacitor current and voltage we see they are triangular and thus to
properly capture the dynamics would need many terms of the power series to
9
be present to approach a good approximation of the original. Thus using a
method of discrete time sampling to approximate the system running at the
speeds required for high performance dc-dc converters would be challenging
using low cost hardware.
This yields an exact solution of the system at time t provided we know the
exact state of the system at t(0), the input u(t) and the system dynamics.
Since the converter hardware is not changing between switch actions, the
matrices A and B are static while in states = 1 and = 2. If the start-
ing state, x(0), is measured, then the only time-varying parameter is u(t).
However for many power conversion systems the output slew rate is slow in
comparison to the switching frequency. Thus for converters that drive static
or slowly varying loads the input u(t) can be approximated as constant over
the timescale of each switching cycle. The explicit solver is used to solve for
the next state of the converter; then the coefficient matrices A and B are
switched and the state at x(t) is used for the next starting state
This is the method used with the addition of an observer to calculate the
estimated system parameters at each switch action. This method has more
advantages than the integrator method mentioned above as it requires only
one calculation per switch operation, and it preserves all the system dynamics
without having to sample at higher sample rates than once per switch action.
10
CHAPTER 3
HARDWARE PLATFORM
11
Figure 3.2: Hardware block diagram
3.1.2 Sensors
The power supply is monitored by current and voltage sensors on the input
and output. For this hardware testbed the input and output current, voltage,
12
L IL
T1
+
Iin CF aulty
+
Cin C1 VLoad
V in Load
T2 T3 I
Load
and current through the inductor are measured. The current measurements
are taken using an allegro ACS714 high precision Hall effect sensor [16].
This sensor has an isolated current path which allows it to be placed at any
potential in the circuit. Each current sensor is connected through a filter and
voltage divider to convert its 0-5 V output to a suitable 0 - 3.3 V range used
by the DSP input ADC. This sensor has added measurable additional noise
due to the fact that the internal gain amplifiers are chopper stabilized, thus
generating some external ripple on the output of the sensor.
Voltage measurements are performed by attaching the corresponding node
of the circuit through a 10 k variable resistor to divide the voltage down to a
range the DSP can handle. This voltage is also capped by reverse protection
diodes to ground and the 3.3 V rail to prevent any unexpected damage to the
DSP from voltage spikes above the or below the DSPs acceptable voltage
range.
Due to the design of the DSP analog-to-digital converter, the measure-
ments must be buffered to provide a low impedance source for the inputs.
This is done using two low-noise four-channel operational amplifiers con-
nected as voltage followers [17]. This buffering allows the DSP to sample the
inputs using small sampling windows to get an accurate state of the converter
at switch transitions.
13
3.1.3 Digital signal processor
The core of the hardware platform is the digital signal processor. This pro-
vides digital control to allow the converter to track output voltage and cur-
rent, and also hosts the observer and detection filter. The digital signal pro-
cessor is a TMS320F28335 DSP from Texas Instruments [18]. It is designed
for embedded control systems as well as motor and power supply control, and
is the only DSP in its product class to feature a hardware floating point unit
(FPU). Using the FPU to perform calculations greatly simplifies the soft-
ware design requirements. Furthermore this DSP includes a built-in sigma
delta analog-digital converter which is used to sample the state of the hard-
ware [19]. This allows customizable sample windows, as well as simultaneous
sampling of all measurement channels to occur. For the piecewise linear ob-
server, the sample windows must be small compared to the evolution of the
system state to provide almost instantaneous sampling of all measurements.
This allows the system state to be precisely measured at switch intervals to
provide an accurate snapshot of the system state. The DSP also supports
high resolution PWM output which is used to control the converter switches
as well as drive the timing for the sampling of the analog-digital converter
[20]. The PWM timer block generates a software interrupt whenever the
output state changes, thus allowing a software trigger for the analog-digital
converter, allowing the DSP to sample all measurements in time with switch
changes. This tight integration of measurements and control allows the DSP
to accurately measure the system state at the exact timing required for the
model to evolve using linear dynamics.
For measurement purposes the DSP has a high speed external memory
interface which allows recording of measured data as well as the evolution of
system states accurately and at full speed. To do this at each time step the
measurements and system states are written into the external memory until
the memory is full; then the capture is stopped and the capture is written out
through a serial link to the computer at non-real-time speed. This is similar
to having a trigger based digital storage oscilloscope built into the DSP, and
is very useful for highly accurate debugging and the gathering of results.
This high speed capturing of data can also be configured to trigger events
while the system is capturing data through the computer interface, which
allows the observation of system transitions from one operating condition
14
to another. For example if the system dynamics of a load transient are to
be captured, the DSP can capture data for several hundred cycles before
the transient, trigger the third FET causing the load resistance to change,
and continue to capture data in real time for several thousand cycles after
this event. This capability makes it an excellent way to capture all system
parameters and data during a transient.
3.2 Limitations
This test platform is built entirely with low cost hardware. For purposes of
experiments and due to processor speed, the switching frequency was chosen
to be 10 kHz. This was chosen to ensure that the ADCs on the DSP had
enough time to perform conversion over the widest possible duty cycle range
and also to allow the DSP enough time to solve for the filter residual during
each cycle. The level of noise as well as the maximum accuracy of the ADCs
on the DSP generate a lower bound on the level of fault that is detectable
in the observer. Furthermore this is highly dependent on the fundamental
requirements of the power supply.
For example, the ADC input on the DSP is 12 bits, with a range of 0 to
3.3 V. This gives an input voltage range that is scaled from 20 V down to
20
3.3 V of 4096 = 4.88 mV
bit
. If specification requires that the output voltage not
have a ripple higher than 50 mV, then there are only four usable bits that
will change between between a measurement of ripple. Detecting the change
in error with such a small number of differing states can prove futile however,
at high speeds the ADC has an even lower number of effective bits.
15
3.3 Algorithms
The central algorithm which the DSP solves is the explicit solution to the
equation x(t)
dt
= Ax(t) + Bu(t). To solve this equation the observer must
calculate eAt for each switching period. There are many ways to compute
matrix exponentials; however when time is critical, a computationally effi-
cient manner of computing the exponential is needed. The Pade squaring
and scaling algorithm was chosen as an adequate candidate [21].
To design the software to solve fixed size matrix exponentials, C code was
generated from the Matlab demo file expmdemo1 to test the effectiveness of
computing the solution using this method. However when this was done it
was found that for small embedded systems the C code generated by Matlab
was inefficient for many parts of the algorithm. For example, part of the al-
gorithm requires scaling the input and output values of the matrix by powers
of two, which is extremely easy to perform in software using the arithmetic
shift operation and takes 1 CPU cycle to perform. However in code generated
by Matlab the scaling was performed using division, which can be a timely
CPU operation. Repeated scaling and squaring is a key part of the algorithm
so the entire matrix exponential algorithm was written from scratch.
The observer has an upper bound on the time it can take to calculate the
next step in the simulation. However the real world measurements can have
samples that come in very short succession when the duty cycle is near 0 or
100%. To help mitigate the need to do each iteration before the subsequent
measurement, the measurements are pushed into a circular ring buffer and
removed when the filter has finished its calculation and requires another
measurement. This allows for the requirement that during each switching
period the algorithm needs to perform two iterations; however, it does not
matter how long each iteration takes as long as they finish with an average
time of less than the time it takes for the converter to complete one switching
cycle.
This method introduces some delay into the detection of faults. However
the worst case behavior will be if the output of the filter generates its result
halfway though the next switching cycle. Thus for this implementation it
would be impossible to detect a failure until partway through the subsequent
switching cycle.
16
3.3.1 Integration solver
The first approach that was used to solve the observer equations was an
integrator solver, with one integrator for each state. The solver ran at a
fixed frequency of 10 times the switching frequency, 10 kHz. The integration
based solver was first designed in Simulink and it was attempted to be ported
to the DSP. However the code generated from the Simulink code could not
run fast enough on the hardware used, so the algorithm was manually ported
to the DSP written in C using interrupt driven hardware. Using this method
the integration solver ran in real time on the hardware.
Voltage Controller
The DSP uses a PID controller implemented in software to regulate the out-
put voltage so it is set to a known value. This is implemented by measuring
the output voltage of the converter - and setting the reference voltage using
serial commands from a computer. Each iteration of the converter the error
is fed into the PID controller, allowing regulation of the supply.
17
CHAPTER 4
RESULTS
18
system model of an observer with noise added. For the purpose of these
experiments the level of noise input to the observer through the DSP was
measured using two methods.
4.1.5 Simulation
To test the ability of the system to detect faults, simulations were developed
to determine the minimum detectable faults in the presence of noise in the
sensors. To do this a model of the converter was built in Matlab using
19
Table 4.1: Buck Converter Parameters
Parameter Value
RESR 0.082
Rdson 0.022
Rd 0.10
RL 0.04
L 500.9 H
C 534.0 H
Vd 514 mV
Vin 12 V
Vload 5V
Iload 0.8 A
Capacitor faults
20
of the capacitor. A second form of wear-out that can happen is a decrease in
capacitance; for example, in ceramic capacitors the capacitance can decrease
over time due to oxide vacancy migration. We can model a capacitance fault
as C(t) = C + c (t), where c goes from zero to -C. If we substitute this into
Eqn. 2.5 and Eqn. 2.6 it is possible to factor out the error dynamics from the
nominal equations. This allows the error dynamics to become
" #" # " #" #
0 0 IL 0 0 Vd
e = 1 1
+ (4.1)
0 C+C (t)
C
C+1C (t) dtd C (t) VC 0 1
C+C (t) ILoad
for both matrices in the switched observer. In this case it is easy to see
the error dynamics point directly along the direction Vc and are symmetrical
around zero. The effectiveness of detecting this is quite low for our converter.
If we look at the output of the error filter it can easily be seen that the filter
only detects capacitor fault errors that are greater than 90% of its nominal
value as seen in Fig. 4.1
0.015
0.01
0.005
Vc Volts
0.005
0.01
0.015
0.04 0.03 0.02 0.01 0 0.01 0.02 0.03 0.04
Il Amps
21
vector becomes
" #" # " #" #
ESR
L
(t)
0 IL 0 ESR (t)
L
V d
e = + (4.2)
0 0 VC 0 0 ILoad
1.5
0.5
Vc Volts
0.5
1.5
2.5
0.04 0.03 0.02 0.01 0 0.01 0.02 0.03 0.04
Il Amps
Inductor fault
22
S1 is on and becomes Eqn. 4.4 when S2 is on.
"R d #" #
dson +RL +RESR + dt L (t) Rdson +RL +RESR 1 1
L+L (t)
L L+L (t)
L
IL
e =
0 0 VC
" #" # (4.3)
1 1 RESR RESR
L+L (t)
L L+L (t)
L Vin
+
0 0 ILoad
"R d #" #
d +RL +RESR + dt L (t) 1 1
L+L (t) L+L (t)
L
IL
e =
0 0 VC
" #" # (4.4)
1 1 RESR RESR
L+L (t)
L L+L (t)
L Vd
+
0 0 ILoad
Running simulations for the inductor fault shows that for the case of the
test converter it is easy to detect inductor faults. Furthermore most small
power inductors are built with fewer than 100 turns. And often due to
coil geometry, faults will happen either directly across adjacent windings or
between winding layers. Thus with such inductors even small failures such
as a shorted winding would be detectable with this system. To demonstrate
this, Fig. 4.3 shows a simulation of inductor faults ranging from an inductor
losing some inductance all the way to being replaced with a circuit element
with no inductance. The second type of failure commonly associated with
inductors is an increase of the series resistance of the inductor. This can
be caused by failures in the wire, manufacturing failures or manufacturing
defects in the inductor. This can be modeled by RL (t) = RL + RL (t). In
the case of a fault, RL (t) will increase. For purposes of this simulation RL
is varied from its nominal value up to several ohms. In this case the error
dynamics become " (t) # " #
RL
L
0 IL
e = (4.5)
0 0 VC
This fault vector is very similar to the inductor fault vector; however, for
both matrices this fault vector points along the same direction instead of
being symmetrical around zero as shown in Fig. 4.4.
23
Inductor fault Difference Equations
0.2
0.15
0.1
0.05
Vc Volts
0
0.05
0.1
0.15
0.2
0.25
5 0 5
Il Amps
If the diode or FET used to switch the inductor to ground fails it could short
to ground, causing no output and damaging the input transistor. A second
failure mode is failing open, this would cause a large negative voltage spike
on the input FET. Also increases in the device resistance could signify early
stage failures in the device such as lead separation. To model the failure of
S2 we can separate out the fault dynamics of the equivalent resistance Rd
and it can be shown that these fault dynamics only show up in one switched
matrix, = 2, and are present along the direction IL as
" #" #
Rd son (t)
L
0 IL
e = (4.6)
0 0 VC
The output of the error dynamics shows that detecting changes in the diode
resistance between its nominal value and 1 is accomplished as long as the
resistance is above 0.2 for this circuit and power level as shown in Fig. 4.5.
24
Rinductor fault Difference Equations
0.01
0.01
Vc Volts
0.02
0.03
0.04
0.05
0.25 0.2 0.15 0.1 0.05 0 0.05 0.1
Il Amps
0.005
0
Vc Volts
0.005
0.01
0.015
0.02
0.14 0.12 0.1 0.08 0.06 0.04 0.02 0 0.02 0.04
Il Amps
S1 Failure
25
for a switch stuck open are only present in the matrix = 1:
" #
VINLP U T
e = (4.7)
0
Finally if the FET has an increase in its resistance, then it can be detected
if its nominal resistance increases beyond a few hundred milliohms as shown
in Fig. 4.6.
Rdson fault Difference Equations
0.01
0.005
0.005
Vc Volts
0.01
0.015
0.02
0.025
0.03
0.035
0.25 0.2 0.15 0.1 0.05 0 0.05 0.1
Il Amps
26
is possible to detect specific levels of faults depending on the magnitude
of the fault as well as the operating parameters of the converter and the
accuracy of measurements taken by the converter. Not all levels of faults can
be detected, and for some components such as the capacitor, detecting any
fault but the largest can become difficult for the observer; however, for most
converter parameters, variations are at least as large as noise measurements
in the example system and are thus detected. Further work that could be
conducted in this research could include a study on the reliability of the
fault detection filter, studying measurement systems which are low cost, and
porting the filter to smaller and lower power computational resources to
reduce cost.
27
IL Error. Avg 0.062128 Vc Error. Avg 0.01053 System Configuration. Avg 1.5
0.2 0.2 2.5
2
0 V 0 1.5
0.2 0.2 1
0.4 0.5
0 1 2 0 1 2 0 1 2
t x 103 t x 103 t x 103
IInductor. Avg 2.259 V Capacitor. Avg 4.9319 Observer I. Avg 2.3204
2.5 5 3
2.5
V
I
I
2 4.8 2
0 1 2 0 1 2 0 1 2
t x 103 t x 103 t x 103
Observer Vc. Avg 4.9219 Voltage In. Avg 11.8588 Voltage Out. Avg 4.9246
5 12 5
V
2.4 5
I
2.2 4.9
0 1 2 0 1 2
t x 103 t x 103
28
Error dynamics in state 1 Error dynamics in state 2
0.14 0
0.01
0.12
0.02
0.1 0.03
Error Vc (A)
Error Vc (V)
0.04
0.08
0.05
0.06 0.06
0.07
0.04
0.08
0.02 0.09
0.2 0 0.2 0.8 0.6 0.4 0.2
Error IL (A) Error IL (A)
observer state was saved. This allows the observation of the state and mea-
surements over a significant period of time. Using the file in Appendix D.1
the load is controlled over GPIB and the measurements and output voltage
of the converter are set and gathered using a serial link to the DDSPSP.
Using the internal measurements of the converter, the no fault behavior was
measured over a subset of 250 samples from the converter while it was switch-
ing at several different load levels and output voltages. It was determined
that an approximate worst case of noise preset was less than 0.1 V for the
capacitor voltage and 0.3 for the inductor voltage as shown in Fig. 4.8.
29
Error dynamics in state 1 Error dynamics in state 2
0.08 0.04
0.07 0.03
0.06
0.02
0.05
0.01
0.04
Error Vc (A)
Error Vc (V)
0
0.03
0.01
0.02
0.02
0.01
0.03
0
0.01 0.04
0.02 0.05
0.2 0 0.2 0.5 0.4 0.3 0.2
Error IL (A) Error IL (A)
30
Error dynamics in state 1 Error dynamics in state 2
0.5 2.5
RESR=10
RESR=1
0 2
RESR=5
0.5 1.5
RESR=4
RESR=2
Error Vc (A)
Error Vc (V)
RESR=3
1 RESR=3 1
RESR=2
RESR=4
R =5
1.5 ESR 0.5
2 0 R =1
RESR=10 ESR
2.5 0.5
0.2 0 0.2 0.4 0.6 0.4 0.2 0 0.2 0.4
Error IL (A) Error IL (A)
mance. Since the simulations have shown above that reducing the output
capacitance does not have as appreciable an impact on circuit performance,
and that most common failure modes that include sudden or slow capaci-
tor degradation manifest themselves in the form of increased ESR, the test
setup only included the output capacitance to be varied. To test this setup
the output capacitor was wired in series with common resistors of varying
types, sweeping from 2 to 20 . Only a few of the results are shown here
in the interest of space, but the full set of measurements is available. It is
easy to see in the comparison from the no fault system behavior shown in
Fig. 4.8 and 4.9, that when the ESR increases in Fig. 4.10 the error residual
increases away from zero. This is exactly as we would hope based on Fig.
4.2. Also as the load to the converter is changed, as is the case in Fig. 4.11,
it is important to note that the level of fault is independent of the output
load.
31
Error dynamics in state 1 Error dynamics in state 2
0.5 2.5
0 R =1 RESR=10
ESR
2
0.5 R =5
ESR
1.5 R =4
Error Vc (A)
Error Vc (V)
ESR
R =2
ESR R =3
1 ESR
R =3
ESR
RESR=4 1 R =2
ESR
1.5 RESR=5
RESR=10 0.5
2
RESR=1
2.5 0
1 0.5 0 0.5 0.5 0 0.5 1
Error IL (A) Error IL (A)
32
Error dynamics in state 1
0
RL=1
RL=3 R =2
Error Vc (A) 0.05 RL=4 L
RL=5
0.1
0.15
0.2
0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0
Error IL (A)
Error dynamics in state 2
0.15
0.1
Error Vc (V)
RL=5 R =2 RL=1
RL=4
RL=3L
0.05
0.05
0.15 0.1 0.05 0 0.05 0.1 0.15 0.2 0.25 0.3
Error IL (A)
33
Error dynamics in state 1
0.05
R =2 R =1
L
RL=3 L
0 RL=4
RL=5
Error Vc (A)
0.05 RL=10
0.1
0.15
0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0
Error IL (A)
Error dynamics in state 2
0.1
0.05 RL=10
Error Vc (V)
R =3
RL=5 R =4 RL=1
L L R =2
L
0
0.05
0.1
0.1 0.05 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35
Error IL (A)
34
CHAPTER 5
CONCLUSIONS
5.1 Successes
This experiment proved that a software based observer can detect hardware
faults in real time from simple measurements taken from the hardware and
compared with the converter model. The experiments showed that it is possi-
ble to detect specific types of component failures during operation. However
not all component faults could be accurately detected. Furthermore the con-
verter interface is able to display converter health information in real time,
which is extremely helpful for both debugging problems and tuning. After
designing two separate observers, one using a course integrator based solver
and a second using an explicit solver, the clear winner in terms of accuracy
and performance is the explicit solver.
5.2 Failures
While the experiments proved that the technique was useful for detecting
certain faults, it was difficult to detect some faults which could manifest
in the system and to distinguish certain faults which generate very small
fault signature vectors due to noise. These challenges, in combination with
expected noise in the combined system, made the detection of capacitor
faults, and changes in the series resistances of switches, difficult. Thus faults
in certain components are sometimes harder to detect than other faults in
the system.
35
APPENDIX A
SCHEMATICS
36
1 2 3 4 5 6
U$8
GND 1
A GND A
P$3 P$21 2
DIS1
P$12
P$8
P$4
P$14
P$3
P$7
P$11
P$12
P$8
P$4
P$14
P$3
P$7
P$11
P$5 P$27 4
ADCIN2 RS RS
P$6 P$28 5
ADCIN3 RW R/W
P$7 P$12 6
ADCIN4 CLK E
V-
V-
P$8 P$13 7
IN4
IN3
IN4
IN3
ADCIN5 D0 D0
INV4
INV3
INV4
INV3
P$9 P$14 8
LMC6084 LMC6084 ADCIN6 D1 D1
P$10 P$15 9
ADCIN7 D2 D2
P$11 P$16 10
HD44780
A_GND D3 D3
LCD DISPLAY 20x2
OUT1 OUT4
INV1
IN1
V+
IN2
INV2
OUT2 OUT3
OUT1 OUT4
INV1
IN1
V+
IN2
INV2
OUT2 OUT3
P$17 11
D4 D4
P$25 P$18 12
EQPM1A D5 D5
P$23 P$19 13
EPWM2A D6 D6
P$24 P$20 14
P$9
P$5
P$1
P$2
P$6
P$9
P$5
P$1
P$2
P$6
EPWM3A D7 D7
P$13
P$10
P$13
P$10
P$22 15
DGND NC
P$30 16
S_GND NC
P$1 P$31
+5V TXD
B D8 D9 C16 D10 D11 C18 D12 P$26
GND RXD
P$29 B
1N4001 1N4001 1N4001 1N4001 1N4001
D3 D4 2.2u D5 D6 2.2uD7 GND ezDSPF28335
R5
GND GND GND GND GND
1k
1k
10K
10K_
10K__
10K___
10K____
IN OUT
C14 C13 R6
GND C12 C7 C11 C8 1u 1n
Q1
GND
2.2u IC1 2.2u GND GND GND
LM7805 1u 1n 1u 1n C9 C10
2N3907
P$6
P$2
P$5
P$1
P$6
P$2
P$5
P$1
P$6
P$2
P$5
C 2 1 P$1 C
GND
JP2
OUT
OUT
OUT
GND
GND
GND
IP+ VCC
IP- FILT
IP+ VCC
IP- FILT
IP+ VCC
IP- FILT
2 1
ACS714
ACS714
ACS714
JP1
Q2
NTP10N10
37
PAD1 570m OUT+
D2
P$3
P$4
P$3
P$4
P$3
P$4
IN+ L1 MUR1540
C2 C3 PAD3
PAD2 22u 560u
D1
MUR1540
OUT-
1
1
C4 C1
PAD5
IN- C15
Q3 FAULT Q4
JP3
JP4
R7
68
R4
68
GND GND GND GND GND GND GND GND GND
1N4001
MIC4424
P$1 P$8 C17 P$4 P$5
THEORETICAL NOISE OF
MEASUREMENTS
38
APPENDIX C
SOURCE CODE
C.1 Ezdsp28335SwitcherMain.c
/
E z d s p 2 8 3 3 5 S w i t c h e r M a i n . c Main Program t o p r o v i d e o b s e r v e r based fault detection
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
#d e f i n e STATESTOP 1
#d e f i n e STATERUN 2
#d e f i n e STATEDUMP 4
#d e f i n e STATERECORD 8
// i n t e r r u p t v o i d s i m u l a t i o n ( v o i d ) ;
i n t e r r u p t void c p u t i m e r 0 i s r ( void ) ;
i n t e r r u p t void a d c i s r ( void ) ;
i n t e r r u p t void p w m 3 i s r ( void ) ;
v o l a t i l e unsigned char dumpready ;
typedef s t r u c t s t o r a g e {
float internalstates [ 1 1 ] ;
}storage ;
// s t r u c t s t o r a g e b i g s t o r e ;
#pragma DATA SECTION( m y s t o r a g e , " Z O N E 7 D A T A " ) ;
struct s t o r a g e mystorage [ ( 0 x010000 /( s i z e o f ( s t o r a g e ) ) ) ] ;
int s t o r a g e c o u n t e r ;
// f l o a t temp1 ;
float vcError ;
float ilError ;
char pwm ;
39
char prevpwm ;
f l o a t pwmval ;
float Reff ;
// u n s i g n e d c h a r a v e r a g e c o u n t ;
// v o l a t i l e u n s i g n e d c h a r f a u l t t r i g g e r ;
F I R s t r u c t VcFIR ;
FIRstruct IlFIR ;
// l o n g p r e r o l l ;
unsigned char a d c c o n v e r t i n g ;
unsigned char m i s s e d s a m p l e ;
// C o n f i g u r e t h e t i m i n g p a r a m a t e r s f o r Zone 7 .
// N o t e s :
// T h i s f u n c t i o n s h o u l d n o t b e e x e c u t e d f r o m XINTF
// A d j u s t t h e t i m i n g b a s e d on t h e d a t a manual and
// external device requirements .
void i n i t z o n e 7 ( void )
{
/ // Make s u r e t h e XINTF c l o c k i s e n a b l e d
S y s C t r l R e g s . PCLKCR3 . b i t . XINTFENCLK = 1 ;
EALLOW;
// A l l Zones
// Timing f o r a l l z o n e s b a s e d on XTIMCLK = SYSCLKOUT
X i n t f R e g s . XINTCNF2 . b i t . XTIMCLK = 0 ;
// B u f f e r up t o 3 w r i t e s
X i n t f R e g s . XINTCNF2 . b i t .WRBUFF = 3 ;
// XCLKOUT i s e n a b l e d
X i n t f R e g s . XINTCNF2 . b i t . CLKOFF = 0 ;
// XCLKOUT = XTIMCLK
X i n t f R e g s . XINTCNF2 . b i t .CLKMODE = 0 ;
// Zone 7
// When u s i n g r e a d y , ACTIVE must b e 1 o r g r e a t e r
// Lead must a l w a y s b e 1 o r g r e a t e r
// Zone w r i t e t i m i n g
X i n t f R e g s . XTIMING7 . b i t .XWRLEAD = 1 ;
X i n t f R e g s . XTIMING7 . b i t .XWRACTIVE = 2 ;
X i n t f R e g s . XTIMING7 . b i t .XWRTRAIL = 1 ;
// Zone r e a d t i m i n g
X i n t f R e g s . XTIMING7 . b i t .XRDLEAD = 1 ;
X i n t f R e g s . XTIMING7 . b i t . XRDACTIVE = 3 ;
X i n t f R e g s . XTIMING7 . b i t . XRDTRAIL = 0 ;
// Zone w i l l n o t s a m p l e XREADY s i g n a l
X i n t f R e g s . XTIMING7 . b i t . USEREADY = 0 ;
X i n t f R e g s . XTIMING7 . b i t .READYMODE = 0 ;
// 1 , 1 = x 1 6 d a t a b u s
// 0 , 1 = x 3 2 d a t a b u s
// o t h e r v a l u e s a r e r e s e r v e d
X i n t f R e g s . XTIMING7 . b i t . XSIZE = 3 ;
EDIS ;
// F o r c e a p i p e l i n e f l u s h t o e n s u r e t h a t t h e w r i t e t o
// t h e l a s t r e g i s t e r c o n f i g u r e d o c c u r s b e f o r e r e t u r n i n g .
asm ( RPT #7 | | NOP ) ;
/
EALLOW;
/ P e r f o r m a d d i t i o n a l configuration o f t h e XTINF f o r s p e e d up /
X i n t f R e g s . XINTCNF2 . b i t . XTIMCLK = 0 ; // XTIMCLK=SYSCLKOUT/1
X i n t f R e g s . XINTCNF2 . b i t .CLKOFF = 0 ; // XCLKOUT i s e n a b l e d
X i n t f R e g s . XINTCNF2 . b i t .CLKMODE = 0 ; // XCLKOUT = XTIMCLK
40
// Make s u r e w r i t e b u f f e r i s empty b e f o r e c o n f i g u r i n g b u f f e r i n g d e p t h
while ( X i n t f R e g s . XINTCNF2 . b i t .WLEVEL != 0 ) ; // p o l l t h e WLEVEL b i t
X i n t f R e g s . XINTCNF2 . b i t .WRBUFF = 0 ; // No w r i t e b u f f e r i n g
/ Zone 0 C o n f i g u r a t i o n /
X i n t f R e g s . XTIMING0 . b i t . X2TIMING = 0 ; // Timing s c a l e f a c t o r = 1
X i n t f R e g s . XTIMING0 . b i t . XSIZE = 3 ; // A l w a y s w r i t e a s 11 b
X i n t f R e g s . XTIMING0 . b i t .READYMODE = 1 ; // XREADY i s a s y n c h r o n o u s
X i n t f R e g s . XTIMING0 . b i t .USEREADY = 0 ; // D i s a b l e XREADY
X i n t f R e g s . XTIMING0 . b i t .XRDLEAD = 1 ; // Read l e a d t i m e
X i n t f R e g s . XTIMING0 . b i t . XRDACTIVE = 2 ; // Read a c t i v e t i m e
X i n t f R e g s . XTIMING0 . b i t . XRDTRAIL = 1 ; // Read t r a i l t i m e
X i n t f R e g s . XTIMING0 . b i t .XWRLEAD = 1 ; // Write l e a d time
X i n t f R e g s . XTIMING0 . b i t .XWRACTIVE = 2 ; // Write a c t i v e time
X i n t f R e g s . XTIMING0 . b i t .XWRTRAIL = 1 ; // Write t r a i l time
/ Zone 6 C o n f i g u r a t i o n /
X i n t f R e g s . XTIMING6 . b i t . X2TIMING = 0 ; // Timing s c a l e f a c t o r = 1
X i n t f R e g s . XTIMING6 . b i t . XSIZE = 3 ; // A l w a y s w r i t e a s 11 b
X i n t f R e g s . XTIMING6 . b i t .READYMODE = 1 ; // XREADY i s a s y n c h r o n o u s
X i n t f R e g s . XTIMING6 . b i t .USEREADY = 0 ; // D i s a b l e XREADY
X i n t f R e g s . XTIMING6 . b i t .XRDLEAD = 1 ; // Read l e a d t i m e
X i n t f R e g s . XTIMING6 . b i t . XRDACTIVE = 2 ; // Read a c t i v e t i m e
X i n t f R e g s . XTIMING6 . b i t . XRDTRAIL = 1 ; // Read t r a i l t i m e
X i n t f R e g s . XTIMING6 . b i t .XWRLEAD = 1 ; // Write l e a d time
X i n t f R e g s . XTIMING6 . b i t .XWRACTIVE = 2 ; // Write a c t i v e time
X i n t f R e g s . XTIMING6 . b i t .XWRTRAIL = 1 ; // Write t r a i l time
/ Zone 7 C o n f i g u r a t i o n /
X i n t f R e g s . XTIMING7 . b i t . X2TIMING = 0 ; // Timing s c a l e f a c t o r = 1
X i n t f R e g s . XTIMING7 . b i t . XSIZE = 3 ; // A l w a y s w r i t e a s 11 b
X i n t f R e g s . XTIMING7 . b i t .READYMODE = 1 ; // XREADY i s a s y n c h r o n o u s
X i n t f R e g s . XTIMING7 . b i t .USEREADY = 0 ; // D i s a b l e XREADY
X i n t f R e g s . XTIMING7 . b i t .XRDLEAD = 1 ; // Read l e a d t i m e
X i n t f R e g s . XTIMING7 . b i t . XRDACTIVE = 2 ; // Read a c t i v e t i m e
X i n t f R e g s . XTIMING7 . b i t . XRDTRAIL = 1 ; // Read t r a i l t i m e
X i n t f R e g s . XTIMING7 . b i t .XWRLEAD = 1 ; // Write l e a d time
X i n t f R e g s . XTIMING7 . b i t .XWRACTIVE = 2 ; // Write a c t i v e time
X i n t f R e g s . XTIMING7 . b i t .XWRTRAIL = 1 ; // Write t r a i l time
EDIS ;
InitXintf16Gpio () ;
Istruct Vcontroller ;
I s t r u c t Vc ;
Istruct Il ;
Istruct Itest ;
r e a l T input [ 4 ] , output [ 4 ] ;
int i = 0 ;
f l o a t prevtime , currtime , d e l t a t i m e ;
volatile float setvoltage , f a i l ;
char s h o u l d f a i l = 0 ;
r e a l T Vinput , Voutput , V c a p a c i t o r , I i n d u c t o r , I i n p u t , Ioutput , Ilobserver , Vcobserver ,
Rload , cd , I i n d u c t o r o l d ;
r e a l T A1 [ 4 ] , A2 [ 4 ] , A1inv [ 4 ] , A2inv [ 4 ] , B1 [ 2 ] , B2 [ 2 ] , Result [ 2 ] , A c u r r e n t [ 4 ] , Atemp [ 4 ] ,
Estimates [ 2 ] ;
adcringsample sampleprocessing ;
char s b u f f e r [ 4 0 ] ;
char s b u f f e r 2 [ 4 0 ] ;
char w a r n i n g ;
int state , s c i b y t e ;
unsigned char e r r o r c u r r ;
41
unsigned char e r r o r p r e v ;
/ Running s t a r t s h e r e t h i s s t a r t s by initializing everything and t h e n going into a
a l g o r i t h m p r o c e s s i n g l o o p /
main ( ) {
e r r o r c u r r = 0 x22 ;
e r r o r p r e v = 0 x22 ;
p r o c e s s i n g = FALSE ;
dumpready = FALSE ;
storagecounter = 0;
vcError = 0;
ilError = 0;
state = 0;
setvoltage = 5;
a d c c o n v e r t i n g = FALSE ;
f a i l = 1;
// G e n e r a t e t h e A1 and A2 Matrices
A1 [ 0 ] = 1/INDUCTOR(RDSON RINDUCTOR) ;
A1 [ 1 ] = 0 ;
A1 [ 2 ] = 1/CAPACITOR ;
A1 [ 3 ] = 0 ;
A2 [ 0 ] = 1/INDUCTOR(RDIODERINDUCTOR) ;
A2 [ 1 ] = 0 ;
A2 [ 2 ] = 1/CAPACITOR ;
A2 [ 3 ] = 0 ;
Iinductorold = 0;
// s e t t h e o u t p u t b u f f e r t o a l l z e r o s
memset ( m y s t o r a g e , 0 , s i z e o f ( m y s t o r a g e ) ) ;
// p r e c o m p u t e t h e i n v e r s e s o f t h e s e m a t r i c e s
Minv2x2 ( A1 , A1inv ) ;
Minv2x2 ( A2 , A2inv ) ;
// I n i t i a l i z e hardware :
// S t e p 1 . I n i t i a l i z e S y s t e m C o n t r o l :
// PLL , WatchDog , e n a b l e P e r i p h e r a l C l o c k s
// T h i s e x a m p l e f u n c t i o n i s f o u n d i n t h e D S P 2 8 3 3 x S y s C t r l . c file .
InitSysCtrl () ;
/ i n i t i a l ePWM GPIO a s s i g n m e n t . . . /
config ePWM GPIO ( ) ;
// o n l y i n i t t h e p i n s f o r t h e SCIA p o r t .
InitSciaGpio () ;
// I n i t i a l i z e PIE c o n t r o l r e g i s t e r s t o t h e i r d e f a u l t s t a t e .
// The d e f a u l t s t a t e i s a l l PIE i n t e r r u p t s d i s a b l e d and f l a g s
// a r e c l e a r e d .
//
InitPieCtrl () ;
// I n i t i a l i z e t h e PIE v e c t o r t a b l e w i t h p o i n t e r s t o t h e s h e l l I n t e r r u p t
// S e r v i c e R o u t i n e s ( ISR ) .
// T h i s w i l l p o p u l a t e t h e e n t i r e t a b l e , e v e n i f t h e i n t e r r u p t
// i s n o t u s e d i n t h i s e x a m p l e . This i s u s e f u l f o r debug purposes .
// The s h e l l ISR r o u t i n e s a r e f o u n d i n D S P 2 8 3 3 x D e f a u l t I s r . c .
// T h i s f u n c t i o n i s f o u n d i n D S P 2 8 3 3 x P i e V e c t . c .
InitPieVectTable () ;
42
scia echoback init () ; // I n i t a l i z e SCI f o r e c h o b a c k
ADC Init ( ) ; // I n i t ADC c o n t r o l r e g i s t e r s
EPWMinit ( ) ; // I n i t PWM c o n t r o l r e g i s t e r s
// S e t u p i n t e r r u p t f u n c t i o n s f o r h a r d w a r e
EALLOW; // T h i s i s n e e d e d t o w r i t e t o EALLOW p r o t e c t e d registers
// P i e V e c t T a b l e . TINT0 = & c p u t i m e r 0 i s r ;
P i e V e c t T a b l e . ADCINT = &a d c i s r ;
G p i o C t r l R e g s .GPBMUX1. b i t . GPIO33 = 0 ;
G p i o C t r l R e g s . GPBDIR . b i t . GPIO33 = 1 ;
// s e t u p l c d p a n e l pins
G p i o C t r l R e g s .GPBMUX2. b i t . GPIO63 = 0;
G p i o C t r l R e g s .GPBMUX2. b i t . GPIO62 = 0;
G p i o C t r l R e g s .GPBMUX2. b i t . GPIO61 = 0;
G p i o C t r l R e g s .GPBMUX2. b i t . GPIO60 = 0;
G p i o C t r l R e g s .GPBMUX2. b i t . GPIO59 = 0;
G p i o C t r l R e g s .GPBMUX2. b i t . GPIO58 = 0;
G p i o C t r l R e g s .GPBMUX2. b i t . GPIO57 = 0;
G p i o C t r l R e g s .GPBMUX2. b i t . GPIO56 = 0;
G p i o C t r l R e g s .GPBMUX2. b i t . GPIO55 = 0 ;
G p i o C t r l R e g s .GPBMUX2. b i t . GPIO54 = 0 ;
G p i o C t r l R e g s .GPBMUX2. b i t . GPIO53 = 0 ;
// S e t u p l c d p a n e l p i n s d i r e c t i o n s
G p i o C t r l R e g s . GPBDIR . b i t . GPIO63 = 1 ;
G p i o C t r l R e g s . GPBDIR . b i t . GPIO62 = 1 ;
G p i o C t r l R e g s . GPBDIR . b i t . GPIO61 = 1 ;
G p i o C t r l R e g s . GPBDIR . b i t . GPIO60 = 1 ;
G p i o C t r l R e g s . GPBDIR . b i t . GPIO59 = 1 ;
G p i o C t r l R e g s . GPBDIR . b i t . GPIO58 = 1 ;
G p i o C t r l R e g s . GPBDIR . b i t . GPIO57 = 1 ;
G p i o C t r l R e g s . GPBDIR . b i t . GPIO56 = 1 ;
G p i o C t r l R e g s . GPBDIR . b i t . GPIO55 = 1;
G p i o C t r l R e g s . GPBDIR . b i t . GPIO54 = 1;
G p i o C t r l R e g s . GPBDIR . b i t . GPIO53 = 1;
G p i o C t r l R e g s . GPBDIR . b i t . GPIO52 = 1;
EDIS ;
DELAY US( 1 0 0 ) ;
// I n i t c o n t r o l l e r on LCD
LCDinit ( 2 0 , 2 ) ;
DELAY US( 1 0 0 ) ;
// L C D i n i t ( 2 0 , 2 ) ;
43
LCDPrint ( " C o n v e r t e r N o m i n a l " , " >90% F u n c t i o n a l ") ;
// w h i l e ( 1 ) { LCDwrite ( A ) ; DELAY US ( 1 0 0 ) ; }
// E n a b l e CPU i n t 1 w h i c h i s c o n n e c t e d t o CPUTimer 0 , CPU i n t 1 3
// w h i c h i s c o n n e c t e d t o CPUTimer 1 , and CPU i n t 1 4 , w h i c h i s c o n n e c t e d
// t o CPUTimer 2 :
IER |= M INT1 ;
// E n a b l e TINT0 i n t h e PIE : Group 1 i n t e r r u p t 7
P i e C t r l R e g s . PIEIER1 . b i t . INTx7 = 1 ;
// E n a b l e g l o b a l I n t e r r u p t s and h i g h e r p r i o r i t y r e a l t i m e d e b u g events :
EINT ; // E n a b l e G l o b a l i n t e r r u p t INTM
ERTM; // E n a b l e G l o b a l r e a l t i m e i n t e r r u p t DBGM
// I n i t t h e d a t a s t r u c t u r e h a n d l i n g p a s s i n g d a t a f r o m s e n s o r s t o algorithm
initRingbuf () ;
// I n i t PID c o n t r o l l e r f o r o u t p u t v o l t a g e c o n t r o l
Vcontroller . Igain = 15;
Vcontroller . Integral = 0;
V c o n t r o l l e r . s a t u r a t i o n = TRUE;
V c o n t r o l l e r . satHI = 0 . 9 7 ;
V c o n t r o l l e r . satLO = 0 . 1 ;
// I n o l d a l g o r i t h m i n i t i n t e g r a t o r f o r Vc
Vc . I g a i n = 1 ;
Vc . I n t e g r a l = 0 ;
I l . InputPrev = 0 ;
Vc . s a t u r a t i o n = TRUE;
Vc . s a t H I = 5 0 0 ;
Vc . satLO = 500;
Il . Igain = 1;
Il . Integral = 0;
Il . InputPrev = 0 ;
Il . s a t u r a t i o n = TRUE;
Il . satHI = 500;
Il . satLO = 500;
Itest . Igain = 1;
Itest . Integral = 0;
Itest . s a t u r a t i o n = FALSE ;
Itest . satHI = 500;
Itest . satLO = 65530;
Ilobserver = 0;
Vcobserver = 0 ;
// s e n d i n i t d o n e o u t s e r i a l port
print ( " \ r \ nInit done !\0 " ) ;
EPWMset ( 1 , 1 , 0 . 5 ) ;
while ( 1 )
{
44
/
Iinductor = 2;
Vcapacitor = 5;
Voutput = 5 ;
Ilobserver = 2;
Vcobserver = 5;
Ioutput = 1;
Iinput = 0;
Vinput = 12;
d e l t a t i m e = 1 e 7;
s a m p l e p r o c e s s i n g >r a w t i m e = 5 ;
Rload = Voutput / I o u t p u t ;
c d = R l o a d / ( R l o a d + RESR) ;
/
// / / / / / / / / / / /
i f ( s a m p l e p r o c e s s i n g >rawtime < 1 0 0 ) {
// we j u s t f i n i s h e d a t i m e when S1 i s o f f s o u s e s i g m a =2 m a t r i c e s
A1 [ 0 ] = (( RDSON RINDUCTOR cd RESR) IINDUCTOR) ;
A1 [ 1 ] = cd IINDUCTOR ;
A1 [ 2 ] = cd ICAPACITOR ;
A1 [ 3 ] = cd / Rload ICAPACITOR ;
B1 [ 0 ] = Vinput IINDUCTOR ;
B1 [ 1 ] = 0 ;
} else {
A1 [ 0 ] = (( RDIODE RINDUCTOR cd RESR) IINDUCTOR) ;
A1 [ 1 ] = cd IINDUCTOR ;
A1 [ 2 ] = cd ICAPACITOR ;
A1 [ 3 ] = cd / Rload ICAPACITOR ;
B1 [ 0 ] = (VDIODEIINDUCTOR) ;
B1 [ 1 ] = 0 ;
}
Mmpy2xs ( A1 , d e l t a t i m e , Atemp ) ; // m u l t i p l y A t i m e
// f i n d e At
Mexp2x2 ( Atemp , A2 ) ;
B2 [ 0 ] = I l o b s e r v e r ;
B2 [ 1 ] = V c o b s e r v e r ; // g e n e r a t e X( 0 )
Mmpy2x1 ( A2 , B2 , R e s u l t ) ; // p u t expm (ATime ) [ I l o b s ; V c o b s ] i n t o r e s u l t
Minv2x2 ( A1 , A1inv ) ; // c a l c u l a t e i n v e r s e
B2 [ 0 ] = ( I i n d u c t o r I l o b s e r v e r ) ;
B2 [ 1 ] = V c a p a c i t o r V c o b s e r v e r ;
Atemp [ 0 ] = exp ( 2 0 d e l t a t i m e ) ;
Atemp [ 1 ] = 0 ;
Atemp [ 2 ] = 0 ;
Atemp [ 3 ] = Atemp [ 0 ] ;
Mmpy2x1 ( Atemp , B2 , A1 ) ;
Macc2x1 ( A1 , R e s u l t ) ; // + expm ( 2 0 e y e ( 2 ) Time ) ( [ I l ; Vc ] [ I l o b s ; V c o b s ]
// now a l s o s a v e A3 u n t i l we add i t b a c k i n
Atemp [ 0 ] = 1;
Atemp [ 3 ] = 1; // e y e ( 2 )
Macc2x2 ( A2 , Atemp ) ; // expm (ATime ) e y e ( 2 )
Mmpy2x1 ( Atemp , B1 , A2 ) ; // ( expm (ATime ) e y e ( 2 ) ) B
Mmpy2x1 ( A1inv , A2 , Atemp ) ;
Macc2x1 ( Atemp , R e s u l t ) ; // add i n t o r e s u l t
// c a l c u l a t e t h e e r r o r
I l o b s e r v e r = Result [ 0 ] ;
Vcobserver = Result [ 1 ] ;
i f ( I l o b s e r v e r > 100) I l o b s e r v e r = 100;
i f ( Vcobserver > 100) Vcobserver = 100;
// o u r e r r o r i s s i t t i n g i n B2
i f ( s t o r a g e c o u n t e r < (0 x010000 /( s i z e o f ( s t o r a g e ) ) ) ) {
if ( shouldfail ){
i f ( s t o r a g e c o u n t e r == ( 0 x 0 1 0 0 0 0 / ( s i z e o f ( s t o r a g e ) / 2 ) ) ) {
f a i l = 1;
}
}
m y s t o r a g e [ s t o r a g e c o u n t e r ] . i n t e r n a l s t a t e s [ 0 ] = ( f l o a t ) B2 [ 0 ] ;
m y s t o r a g e [ s t o r a g e c o u n t e r ] . i n t e r n a l s t a t e s [ 1 ] = ( f l o a t ) B2 [ 1 ] ;
45
mystorage [ s t o r a g e c o u n t e r ] . i n t e r n a l s t a t e s [ 2 ] = ( f l o a t ) ( ( s a m p l e p r o c e s s i n g >
rawtime < 1 0 0 ) ? 2 : 1 ) ;
mystorage [ s t o r a g e c o u n t e r ] . internalstates [ 3 ] = Iinductor ;
mystorage [ s t o r a g e c o u n t e r ] . internalstates [ 4 ] = Vcapacitor ;
mystorage [ s t o r a g e c o u n t e r ] . internalstates [5] = Ilobserver ;
mystorage [ s t o r a g e c o u n t e r ] . internalstates [ 6 ] = Vcobserver ;
mystorage [ s t o r a g e c o u n t e r ] . internalstates [ 7 ] = Vinput ;
mystorage [ s t o r a g e c o u n t e r ] . internalstates [ 8 ] = Voutput ;
mystorage [ s t o r a g e c o u n t e r ] . internalstates [ 9 ] = Ioutput ;
mystorage [ s t o r a g e c o u n t e r ] . internalstates [ 10 ] = deltatime ; // p r i n t s in higher
r e s to computer
s t o r a g e c o u n t e r ++;
}
e r r o r c u r r = E r r o r 2 Z o n e ( B2 [ 0 ] , B2 [ 1 ] ) ;
i f ( s a m p l e p r o c e s s i n g >rawtime < 1 0 0 ) { // n o t e this is b a c k w a r d s from a b o v e
if ( s a m p l e p r o c e s s i n g >rawtime < 1 0 0 ) {
i ++;
i f ( i == 5 0 0 ) {
i = 0;
// c a l c u l a t e some e r r o r e s t i m a t e s into component failures
// c h e c k f o r b u t t o n p r e s s e s
if ( scia has byte () ){
46
case d :
s t a t e = STATEDUMP;
shouldfail = 0;
EPWMset ( 1 , 1 , 0 ) ;
break ;
case r : // / r e c o r d
// s t a t e = STATERUN ;
s t a t e = STATERECORD;
shouldfail = 0;
f a i l = 0;
storagecounter = 0;
break ;
case f : // s e t t o f a i l f o r first half of recording
s t a t e = STATERECORD;
shouldfail = 1;
f a i l = 0;
storagecounter = 0;
//EPWMset ( 1 , f a i l , 0 . 5 ) ;
break ;
default :
break ;
}
i f ( s c i b y t e > 0 && s c i b y t e < 9 ) {
setvoltage = ( float ) ( scibyte 0 ) ; // c o n v e r t from ascii to decimal
//EPWMset ( 1 , 1 , s e t v o l t a g e ) ;
}
}
// dump o u t a l l o f o u r s t o r e d b u f f e r t o t h e c o m p u t e r t h r o u g h t h e s e r i a l p o r t
i f (STATEDUMP == s t a t e ) {
for ( s t o r a g e c o u n t e r = 0 ; s t o r a g e c o u n t e r < (0 x010000 /( s i z e o f ( s t o r a g e ) ) ) ;
s t o r a g e c o u n t e r ++)
{
f o r ( i = 0 ; i < 1 0 ; i ++){
printDouble ( ( mystorage [ s t o r a g e c o u n t e r ] . i n t e r n a l s t a t e s [ i ] ) , 4 ) ;
print ( " ," ) ;
}
p r i n t D o u b l e ( ( m y s t o r a g e [ s t o r a g e c o u n t e r ] . i n t e r n a l s t a t e s [ 1 0 ] ) , 1 0 ) ; // p r i n t
times in h i g h r e r e s o l u t i o n t o computer
print ( "\n" ) ;
}
// s t o r a g e c o u n t e r = 0 ;
print ( " SectionEnd \n" ) ;
s t a t e = STATESTOP ;
}
}
// float testfloat ;
// float ilprev ;
// f l o a t vcprev ;
// f l o a t Rrefaverage ;
// f l o a t Cd ;
i n t e r r u p t void c p u t i m e r 0 i s r ( void ) {
// u n s i g n e d c h a r s m a l l c o u n t ;
// t o g g l e o u r TIMER0 g p i o t o show t h e word t h a t we a r e running
GpioDataRegs . GPBSET . b i t . GPIO33 = 1 ;
}
int time ;
47
i n t e r r u p t void a d c i s r ( void ) {
a d c r i n g s a m p l e mysample ;
mysample . s a m p l e s [ 0 ] = AdcMirror . ADCRESULT0 ;
mysample . s a m p l e s [ 1 ] = AdcMirror . ADCRESULT1 ;
mysample . s a m p l e s [ 2 ] = AdcMirror . ADCRESULT2 ;
mysample . s a m p l e s [ 3 ] = AdcMirror . ADCRESULT3 ;
mysample . s a m p l e s [ 4 ] = AdcMirror . ADCRESULT4 ;
mysample . s a m p l e s [ 5 ] = AdcMirror . ADCRESULT5 ;
mysample . s a m p l e s [ 6 ] = AdcMirror . ADCRESULT6 ;
mysample . s a m p l e s [ 7 ] = AdcMirror . ADCRESULT7 ;
mysample . v a l i d = m i s s e d s a m p l e ;
mysample . t i m e = t i m e 6 . 6 6 6 6 6 7 e 9;
mysample . rawtime = t i m e ;
// memcpy ( a d c r i n g . , A d c M i r r o r . ADCRESULT0, s i z e o f ( A d c M i r r o r . ADCRESULT0) 8 ) ;
i n s e r t R i n g E l e m (&mysample ) ;
// i f t h e pwm t r i g g e r e d and m i s s e d a s a m p l e , we s h o u l d r e g i s t e r t h a t t o
// o u r d a t a s t r u c t u r e , s o down t h e r o a d we can f i g u r e o u t w h a t h a p p e n e d . .
i f (TRUE == m i s s e d s a m p l e ) {
//TODO: S h o v e some c r a p i n t o t h e r i n g b u f f e r t o show m i s s i n g s a m p l e
m i s s e d s a m p l e = FALSE ;
}
a d c c o n v e r t i n g = FALSE ;
// R e i n i t i a l i z e f o r n e x t ADC s e q u e n c e
AdcRegs . ADCTRL2 . b i t . RST SEQ1 = 1 ; // R e s e t SEQ1
AdcRegs .ADCST. b i t . INT SEQ1 CLR = 1 ; // C l e a r INT SEQ1 b i t
P i e C t r l R e g s . PIEACK . a l l = PIEACK GROUP1 ;
// u p d a t e o u r p i d c o n t r o l l o o p
i f (200 > time ) {
i f ( s t a t e == STATERUN) {
EPWMset( f a i l , 1 , MathI(& V c o n t r o l l e r , s e t v o l t a g e ADC2VOLTOUT mysample . s a m p l e s
[1]) ) ;
}
// e l s e
//EPWMset ( 1 , 1 , 0 ) ;
}
return ;
}
i n t e r r u p t void p w m 3 i s r ( void ) {
t i m e = EPwm3Regs .TBCTR;
// c h e c k i f t h e a d c i s c u r r e n t l y i n t h e m i d d l e o f a c o n v e r s i o n
// t h i s h a p p e n s i f t h e pwm i s s e t b e l o w 10% o r a b o v e 90%
i f (FALSE == AdcRegs .ADCST. b i t . SEQ1 BSY ) {
// s t a r t ADC c o n v e r s i o n
AdcRegs . ADCTRL2 . b i t . SOC SEQ1 = 1 ;
// C l e a r i n t e r r u p t f l a g
a d c c o n v e r t i n g = TRUE;
}
else {
// we m i s s e d a s a m p l e b c t h e a d c i s t o o s l o w o c r a p . . . p r o b a b l y t h e pwm d u t y is near
0% o r 100%
m i s s e d s a m p l e = TRUE;
}
// a l t e r n a t e w h a t we t r i g g e r on , s o i f we t r i g g e r e d on 0 this t i m e , we
// want t o t r i g g e r on CMPA n e x t t i m e
i f ( EPwm3Regs . ETSEL . b i t . INTSEL == 0 x01 ) {
EPwm3Regs . ETSEL . b i t . INTSEL = 0 x04 ;
//
} else {
EPwm3Regs . ETSEL . b i t . INTSEL = 0 x01 ;
}
// C l e a r INT f l a g f o r t h i s t i m e r
EPwm3Regs . ETCLR . b i t . INT = 1 ;
// A c k n o w l e d g e t h i s i n t e r r u p t t o r e c e i v e more interrupts from group 3
P i e C t r l R e g s . PIEACK . a l l = PIEACK GROUP3 ;
return ;
}
48
C.2 Adc2VA.h
/
a d c 2 v a . h Base c l a s s t h a t p r o v i d e s raw a d c v a l u e s t o v o l t a g e s and c u r r e n t s
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
/
#i f n d e f ADC2VA H
#d e f i n e ADC2VA H
#d e f i n e ADC2VOLT ( 0 . 0 0 1 2 2 0 7 0 3 1 2 5 ) // ( 5 / 4 0 9 6 )
#d e f i n e DCOFFSET ( 2.500 )
#d e f i n e VOLT2AMP ( 5 . 4 0 5 4 0 ) // ( 1 / 0 . 1 8 5 ) 5 . 4 0 5 4 0
#d e f i n e ADC2VOLTOUT ( 0 . 0 0 9 7 6 5 6 2 5 ) // ( 4 0 / 4 0 9 6 )
#d e f i n e ADC2VOLTIN ( 0 . 0 0 9 7 6 5 6 2 5 ) // ( 4 0 / 4 0 9 6 )
extern f l o a t INCHAN [ 1 6 ] ;
#d e f i n e IOUT ( 0 )
#d e f i n e VOUT ( 1 )
#d e f i n e IIND ( 2 )
#d e f i n e IIN ( 3 )
#d e f i n e VIN ( 4 )
void p r o c e s s c h a n n e l s ( void ) ;
#e n d i f // end o f definition
C.3 Adc2VA.c
/
Adc2VA . c Base c l a s s t h a t p r o v i d e s c o n v e r s i o n s f r o m raw a d c to real world values
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
49
Foundation , Inc . , 51 F r a n k l i n S t , Fifth Floor , B o s t o n , MA 02110 1301 USA
/
#include " A d c 2 V A . h "
f l o a t INCHAN [ 1 6 ] ;
void p r o c e s s c h a n n e l s ( void ) {
//INCHAN [ 5 ] = 0 ;
//INCHAN [ 6 ] = 0 ;
//INCHAN [ 7 ] = 0 ;
}
f l o a t g e t c h a n ( unsigned char chan ) {
return INCHAN [ chan ] ;
}
C.4 Adclib.h
/
A d c l i b . h Base c l a s s t h a t p r o v i d e s hardware i n t e r f a c e to adc
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
/
#i f n d e f ADCLIBS H
#d e f i n e ADCLIBS H
#include " D S P 2 8 x _ P r o j e c t . h " // D e v i c e Headerfile
#include " s w i t c h e r l i b s . h "
#e n d i f // end o f definition
50
C.5 Adclib.c
/
A d c l i b . c Base c l a s s t h a t p r o v i d e s hardware s e t u p f o r adc
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
B a s e d on TI e x a m p l e s . . .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
/
#include " A d c l i b . h "
v o l a t i l e double RAWADC[ 1 6 ] ;
v o l a t i l e unsigned char p r o c e s s i n g ;
// f o r now o n l y c o n v e r t s on l o w e r 8 c h a n n e l s
void ADC Init ( void ) {
// ISR f u n c t i o n s f o u n d w i t h i n t h i s f i l e .
EALLOW; // T h i s i s n e e d e d t o w r i t e t o EALLOW p r o t e c t e d r e g i s t e r
// P i e V e c t T a b l e . ADCINT = &A D C I n t e r r u p t ;
// P i e V e c t T a b l e . ADCINT = &s i m u l a t i o n ;
EDIS ; // T h i s i s n e e d e d t o d i s a b l e w r i t e t o EALLOW p r o t e c t e d r e g i s t e r s
// C o n f i g u r e ADC
/ AdcRegs . ADCTRL3 . b i t . SMODE SEL = 1 ; // s e t u p f o r s i m u l t a n e o u s mode
AdcRegs . ADCTRL1 . b i t . CONT RUN = 0 ; // s e t u p f o r c o n t i n u o u s c o n v e r s i o n
AdcRegs . ADCTRL1 . b i t . ACQ PS = 0 x 7 ; // a q u i s i t i o n window s i z e
AdcRegs . ADCTRL1 . b i t . SEQ OVRD = 0 ;
51
AdcRegs . ADCTRL3 . b i t . SMODE SEL = 0 ; // 1 : S i m u l t a n e o u s , 0 : S e q u e n t i a l s a m p l i n g
AdcRegs .ADCMAXCONV. b i t .MAX CONV1 = 4 ; // Number o f c o n v e r s i o n s i n CONV2 when u s i n g B
module
AdcRegs . ADCTRL1 . b i t . SEQ CASC = 0 ; // 1 : C a s c a d e d , 0 : D u a l s e q u e n c e r mode
AdcRegs . ADCCHSELSEQ1 . a l l = 1 2 8 1 6U ; // C h a n n e l s f o r c o n v e r s i o n
AdcRegs . ADCCHSELSEQ2 . a l l = 4U ; // C h a n n e l s f o r c o n v e r s i o n
AdcRegs . ADCTRL2 . b i t . RST SEQ1 = 0 x1 ; // R e s e t SEQ1
// Assumes ePWM1 c l o c k i s a l r e a d y e n a b l e d i n I n i t S y s C t r l ( ) ;
/ EPwm1Regs . ETSEL . b i t . SOCAEN = 1 ; // E n a b l e SOC on A g r o u p
EPwm1Regs . ETSEL . b i t . SOCASEL = 4 ; // S e l e c t SOC f r o m f r o m CPMA on u p c o u n t
EPwm1Regs . ETPS . b i t .SOCAPRD = 1 ; // G e n e r a t e p u l s e on 1 s t e v e n t
EPwm1Regs .CMPA. h a l f .CMPA = 0 x 0 0 8 0 ; // S e t compare A v a l u e
EPwm1Regs .TBPRD = 0xFFFF ; // S e t p e r i o d f o r ePWM1
EPwm1Regs . TBCTL . b i t .CTRMODE = 0 ; // c o u n t up and s t a r t
/
}
}
void ADCsample ( void )
{
// t r i g g e r s a m p l e
AdcRegs . ADCTRL2 . b i t . SOC SEQ1 = 1 ;
// w h i l e ( AdcRegs . ADCST . b i t . INT SEQ1 == 0 ) ;
52
C.6 Epwmlib.h
/
e p w m l i b . h Base c l a s s t h a t p r o v i d e s h a r d w a r e interface t o pwm
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
/
#i f n d e f EPWMLIB H
#d e f i n e EPWMLIB H
#d e f i n e PWMMAX 75 0 0 2
#d e f i n e PWMMIN 0
/ PWM P a r a m e t e r S t r u c t u r e /
typedef s t r u c t EPWMPARAMS {
/ TimeBase (TB) S u b m o d u l e /
U i n t 1 6 TBPRD;
U i n t 1 6 TBCTL CTRMODE;
U i n t 1 6 TBCTL SYNCOSEL ;
U i n t 1 6 TBCTL PHSEN ;
U i n t 1 6 TBCTL PHSDIR ;
U i n t 1 6 TBPHS ;
U i n t 1 6 TBCTL HSPCLKDIV ;
U i n t 1 6 TBCTL CLKDIV ;
/ C o u n t e r C o m p a r e (CC) S u b m o d u l e /
U i n t 1 6 CMPCTL LOADAMODE;
U i n t 1 6 CMPCTL LOADBMODE;
U i n t 1 6 CMPA;
U i n t 1 6 CMPB;
/ A c t i o n Q u a l i f i e r (AQ) S u b m o d u l e /
U i n t 1 6 AQCTLA;
U i n t 1 6 AQCTLB;
U i n t 1 6 AQCSFRC CSFA ;
U i n t 1 6 AQCSFRC CSFB ;
U i n t 1 6 AQCSFRC RLDCSF ;
/ DeadBand G e n e r a t o r (DB) S u b m o d u l e /
U i n t 1 6 DBCTL OUT MODE ;
U i n t 1 6 DBCTL IN MODE ;
U i n t 1 6 DBCTL POLSEL ;
U i n t 1 6 DBRED;
U i n t 1 6 DBFED;
/ E v e n tT r i g g e r (ET) S u b m o d u l e /
U i n t 1 6 ETSEL SOCAEN ;
U i n t 1 6 ETSEL SOCASEL ;
U i n t 1 6 ETPS SOCAPRD ;
U i n t 1 6 ETSEL SOCBEN ;
U i n t 1 6 ETSEL SOCBSEL ;
U i n t 1 6 ETPS SOCBPRD ;
U i n t 1 6 ETSEL INTEN ;
U i n t 1 6 ETSEL INTSEL ;
U i n t 1 6 ETPS INTPRD ;
53
/ PWMC h o p p e r (PC) S u b m o d u l e /
U i n t 1 6 PCCTL CHPEN ;
U i n t 1 6 PCCTL CHPFREQ ;
U i n t 1 6 PCCTL OSHTWTH;
U i n t 1 6 PCCTL CHPDUTY ;
/ T r i pZone (TZ) S u b m o d u l e /
U i n t 1 6 TZSEL ;
U i n t 1 6 TZCTL TZA ;
U i n t 1 6 TZCTL TZB ;
U i n t 1 6 TZEINT OST ;
U i n t 1 6 TZEINT CBC ;
} EPWMPARAMS;
#e n d i f // end o f definition
C.7 Epwmlib.c
// e p q m l i b . c
//READ SPRU791F f o r i n f o a b o u t t h i s . . . . .
/
e p w m l i b . c Base c l a s s t h a t p r o v i d e s h a r d w a r e interface t o pwm
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
/
// b a s e d on t i e x a m p l e s
#include " E p w m l i b . h "
void config ePWM GPIO ( void )
{
EALLOW;
/ C o n f i g u r e p i n a s s i g n m e n t s f o r ePWM3 /
G p i o C t r l R e g s .GPAPUD. b i t . GPIO4 = 0 ; // E n a b l e p u l l up on GPIO4 (EPWM3A)
G p i o C t r l R e g s .GPAPUD. b i t . GPIO5 = 0 ; // E n a b l e p u l l up on GPIO5 (EPWM3B)
G p i o C t r l R e g s .GPAMUX1. b i t . GPIO4 = 1 ; // C o n f i g u r e GPIO4 a s EPWM3A
G p i o C t r l R e g s .GPAMUX1. b i t . GPIO5 = 1 ; // C o n f i g u r e GPIO5 a s EPWM3B
/ C o n f i g u r e p i n a s s i g n m e n t s f o r ePWM2 /
G p i o C t r l R e g s .GPAPUD. b i t . GPIO2 = 0 ; // E n a b l e p u l l up on GPIO2 (EPWM2A)
G p i o C t r l R e g s .GPAPUD. b i t . GPIO3 = 0 ; // E n a b l e p u l l up on GPIO3 (EPWM2B)
G p i o C t r l R e g s .GPAMUX1. b i t . GPIO2 = 1 ; // C o n f i g u r e GPIO2 a s EPWM2A
G p i o C t r l R e g s .GPAMUX1. b i t . GPIO3 = 1 ; // C o n f i g u r e GPIO3 a s EPWM2B
54
/ C o n f i g u r e p i n a s s i g n m e n t s f o r ePWM1 /
G p i o C t r l R e g s .GPAPUD. b i t . GPIO0 = 0 ; // E n a b l e p u l l up on GPIO0 (EPWM1A)
G p i o C t r l R e g s .GPAPUD. b i t . GPIO1 = 0 ; // E n a b l e p u l l up on GPIO1 (EPWM1B)
G p i o C t r l R e g s .GPAMUX1. b i t . GPIO0 = 1 ; // C o n f i g u r e GPIO0 a s EPWM1A
G p i o C t r l R e g s .GPAMUX1. b i t . GPIO1 = 1 ; // C o n f i g u r e GPIO1 a s EPWM1B
G p i o C t r l R e g s .GPBPUD. b i t . GPIO32 = 0 ; // E n a b l e p u l l up on GPIO32 ( xSYNCI ) .
G p i o C t r l R e g s .GPBMUX1. b i t . GPIO32 = 2 ; // C o n f i g u r e GPIO32 a s xSYNCI .
G p i o C t r l R e g s .GPBPUD. b i t . GPIO33 = 0 ; // E n a b l e p u l l up on GPIO33 (xSYNCO) .
G p i o C t r l R e g s .GPBMUX1. b i t . GPIO33 = 2 ; // C o n f i g u r e GPIO33 a s xSYNCO .
/ F u n c t i o n : config ePWMRegs
Abstract :
C o n f i g u r e EPwmXRegs
/
void config ePWMRegs ( v o l a t i l e s t r u c t EPWM REGS EPwmRegs , EPWMPARAMS
EPwmParams )
{
/ S e t u p TimeBase (TB) S u b m o d u l e /
EPwmRegs>TBPRD = EPwmParams>TBPRD;
EPwmRegs>TBCTL. b i t .CTRMODE = EPwmParams>TBCTL CTRMODE;
EPwmRegs>TBCTL. b i t . SYNCOSEL = EPwmParams>TBCTL SYNCOSEL ;
EPwmRegs>TBCTL. b i t . PHSEN = EPwmParams>TBCTL PHSEN ;
EPwmRegs>TBCTL. b i t . PHSDIR = EPwmParams>TBCTL PHSDIR ;
EPwmRegs>TBPHS . h a l f . TBPHS = EPwmParams>TBPHS ;
EPwmRegs>TBCTL. b i t . HSPCLKDIV = EPwmParams>TBCTL HSPCLKDIV ;
EPwmRegs>TBCTL. b i t . CLKDIV = EPwmParams>TBCTL CLKDIV ;
EPwmRegs>TBCTR = 0 x0000 ; // C l e a r c o u n t e r
/ S e t u p C o u n t e r C o m p a r e (CC) S u b m o d u l e /
EPwmRegs>CMPCTL. b i t .SHDWAMODE = CC SHADOW; // A l w a y s e n a b l e s h a d o w mode , no i m m e d i a t e
mode
EPwmRegs>CMPCTL. b i t .SHDWBMODE = CC SHADOW; // A l w a y s e n a b l e s h a d o w mode , no i m m e d i a t e
mode
EPwmRegs>CMPCTL. b i t .LOADAMODE = EPwmParams>CMPCTL LOADAMODE;
EPwmRegs>CMPCTL. b i t .LOADBMODE = EPwmParams>CMPCTL LOADBMODE;
EPwmRegs>CMPA. h a l f .CMPA = EPwmParams>CMPA;
EPwmRegs>CMPB = EPwmParams>CMPB;
/ S e t u p A c t i o n Q u a l i f i e r (AQ) S u b m o d u l e /
EPwmRegs>AQCTLA. a l l = EPwmParams>AQCTLA;
EPwmRegs>AQCTLB. a l l = EPwmParams>AQCTLB;
EPwmRegs>AQSFRC. b i t . RLDCSF = EPwmParams>AQCSFRC RLDCSF ;
EPwmRegs>AQCSFRC. b i t . CSFA = EPwmParams>AQCSFRC CSFA ;
EPwmRegs>AQCSFRC. b i t . CSFB = EPwmParams>AQCSFRC CSFB ;
/ S e t u p DeadBand G e n e r a t o r (DB) S u b m o d u l e /
EPwmRegs>DBCTL. b i t .OUT MODE = EPwmParams>DBCTL OUT MODE ;
EPwmRegs>DBCTL. b i t . IN MODE = EPwmParams>DBCTL IN MODE ;
EPwmRegs>DBCTL. b i t . POLSEL = EPwmParams>DBCTL POLSEL ;
EPwmRegs>DBRED = EPwmParams>DBRED;
EPwmRegs>DBFED = EPwmParams>DBFED;
/ S e t u p E v e n tT r i g g e r (ET) S u b m o d u l e /
EPwmRegs>ETSEL . b i t .SOCAEN = EPwmParams>ETSEL SOCAEN ;
EPwmRegs>ETSEL . b i t . SOCASEL = EPwmParams>ETSEL SOCASEL ;
EPwmRegs>ETPS . b i t .SOCAPRD = EPwmParams>ETPS SOCAPRD ;
EPwmRegs>ETSEL . b i t .SOCBEN = EPwmParams>ETSEL SOCBEN ;
EPwmRegs>ETSEL . b i t . SOCBSEL = EPwmParams>ETSEL SOCBSEL ;
EPwmRegs>ETPS . b i t .SOCBPRD = EPwmParams>ETPS SOCBPRD ;
EPwmRegs>ETSEL . b i t . INTEN = EPwmParams>ETSEL INTEN ;
EPwmRegs>ETSEL . b i t . INTSEL = EPwmParams>ETSEL INTSEL ;
EPwmRegs>ETPS . b i t . INTPRD = EPwmParams>ETPS INTPRD ;
/ S e t u p PWMC h o p p e r (PC) S u b m o d u l e /
EPwmRegs>PCCTL . b i t .CHPEN = EPwmParams>PCCTL CHPEN ;
EPwmRegs>PCCTL . b i t .CHPFREQ = EPwmParams>PCCTL CHPFREQ ;
EPwmRegs>PCCTL . b i t .OSHTWTH = EPwmParams>PCCTL OSHTWTH;
55
EPwmRegs>PCCTL . b i t .CHPDUTY = EPwmParams>PCCTL CHPDUTY ;
/ S e t up T r i pZone (TZ) S u b m o d u l e /
EALLOW;
EPwmRegs>TZSEL . a l l = EPwmParams>TZSEL ;
EPwmRegs>TZCTL . b i t . TZA = EPwmParams>TZCTL TZA ;
EPwmRegs>TZCTL . b i t . TZB = EPwmParams>TZCTL TZB ;
EPwmRegs>TZEINT . b i t . OST = EPwmParams>TZEINT OST ;
EPwmRegs>TZEINT . b i t .CBC = EPwmParams>TZEINT CBC ;
EDIS ;
}
/ S t a r t f o r SF u n c t i o n ( c280xpwm ) : <S6>/ePWM /
/ I n i t i a l i z e ePWM3 m o d u l e s /
{
EPWMPARAMS EPwm3Params ;
/ S e t u p TimeBase (TB) S u b m o d u l e /
EPwm3Params .TBPRD = PWMMAX; // p e r i o d o f t i m e b a s e c o u n t e r , s e t s
frequency
EPwm3Params .TBCTL CTRMODE = 0 ; // up c o u n t mode
EPwm3Params . TBCTL SYNCOSEL = 3 ; // d i s a b l e s y n c h r o n i z a t i o n s e l e c t
EPwm3Params . TBCTL PHSEN = 0 ; // do n o t l o a d f r o m p h a s e r e g i s t e r
EPwm3Params . TBCTL PHSDIR = 0 ; // p h a s e d i r e c t i o n s e t
EPwm3Params . TBPHS = 0 ; // s e t s t h e t i m e b a s e p h a s e
EPwm3Params . TBCTL HSPCLKDIV = 0 ; // h i g h s p e e d t i m e b a s e c l o c k p r e s c a l e = /1
EPwm3Params . TBCTL CLKDIV = 0 ; // t i m e b a s e c l o c k p r e s c a l e = /1
/ S e t u p C o u n t e r C o m p a r e (CC) S u b m o d u l e /
EPwm3Params .CMPCTL LOADAMODE = 0 ; // l o a d 0 i n t o c o u n t e r on compare t r u e
EPwm3Params .CMPCTL LOADBMODE = 0 ;
EPwm3Params .CMPA = 0 ; // The v a l u e i n t h e a c t i v e CMPA r e g i s t e r i s c o n t i n u o u s l y
c o m p a r e d t o t h e t i m e b a s e c o u n t e r (TBCTR) . When t h e v a l u e s a r e e q u a l , t h e
c o u n t e r compare m o d u l e g e n e r a t e s a t i m e b a s e c o u n t e r e q u a l t o c o u n t e r compare A
event .
EPwm3Params .CMPB = 3 2 0 0 0 ;
/ S e t u p A c t i o n Q u a l i f i e r (AQ) S u b m o d u l e /
EPwm3Params .AQCTLA = 0 x24 ; // was d e c 3 6 // s e t o u t p u t h i g h when compare e q u a l and z e r o
at timer overflow value
EPwm3Params .AQCTLB = 0 x108 ; // was d e c 2 6 4
EPwm3Params . AQCSFRC CSFA = 0 ; //
EPwm3Params . AQCSFRC CSFB = 0 ; //
EPwm3Params . AQCSFRC RLDCSF = 0 ;
/ S e t u p DeadBand G e n e r a t o r (DB) S u b m o d u l e /
EPwm3Params . DBCTL OUT MODE = 0 ;
EPwm3Params . DBCTL IN MODE = 0 ;
EPwm3Params . DBCTL POLSEL = 0 ;
EPwm3Params .DBRED = 0 . 0 ;
EPwm3Params .DBFED = 0 . 0 ;
/ S e t u p E v e n tT r i g g e r (ET) S u b m o d u l e /
EPwm3Params . ETSEL SOCAEN = 0 ;
EPwm3Params . ETSEL SOCASEL = 1 ;
EPwm3Params . ETPS SOCAPRD = 1 ;
EPwm3Params . ETSEL SOCBEN = 0 ;
EPwm3Params . ETSEL SOCBSEL = 1 ;
EPwm3Params . ETPS SOCBPRD = 1 ;
EPwm3Params . ETSEL INTEN = 1 ;
EPwm3Params . ETSEL INTSEL = 1 ;
EPwm3Params . ETPS INTPRD = 1 ;
/ S e t u p PWMC h o p p e r (PC) S u b m o d u l e /
EPwm3Params . PCCTL CHPEN = 0 ;
EPwm3Params . PCCTL CHPFREQ = 0 ;
EPwm3Params .PCCTL OSHTWTH = 0 ;
EPwm3Params . PCCTL CHPDUTY = 0 ;
/ S e t u p T r i pZone (TZ) S u b m o d u l e /
56
EPwm3Params . TZSEL = 0 ;
EPwm3Params . TZCTL TZA = 3 ;
EPwm3Params . TZCTL TZB = 3 ;
EPwm3Params . TZEINT OST = 0 ;
EPwm3Params . TZEINT CBC = 0 ;
/ I n i t i a l ePWM3 /
config ePWMRegs(&EPwm3Regs , &EPwm3Params ) ;
}
/ S t a r t f o r SF u n c t i o n ( c280xpwm ) : <S6>/ePWM1 /
/ I n i t i a l i z e ePWM2 m o d u l e s /
{
EPWMPARAMS EPwm2Params ;
/ S e t u p TimeBase (TB) S u b m o d u l e /
EPwm2Params .TBPRD = PWMMAX;
EPwm2Params .TBCTL CTRMODE = 0 ;
EPwm2Params . TBCTL SYNCOSEL = 3 ;
EPwm2Params . TBCTL PHSEN = 0 ;
EPwm2Params . TBCTL PHSDIR = 0 ;
EPwm2Params . TBPHS = 0 ;
EPwm2Params . TBCTL HSPCLKDIV = 0 ;
EPwm2Params . TBCTL CLKDIV = 0 ;
/ S e t u p C o u n t e r C o m p a r e (CC) S u b m o d u l e /
EPwm2Params .CMPCTL LOADAMODE = 0 ;
EPwm2Params .CMPCTL LOADBMODE = 0 ;
EPwm2Params .CMPA = PWMMAX;
EPwm2Params .CMPB = 3 2 0 0 0 ;
/ S e t u p A c t i o n Q u a l i f i e r (AQ) S u b m o d u l e /
EPwm2Params .AQCTLA = 3 6 ;
EPwm2Params .AQCTLB = 2 6 4 ;
EPwm2Params . AQCSFRC CSFA = 0 ;
EPwm2Params . AQCSFRC CSFB = 0 ;
EPwm2Params . AQCSFRC RLDCSF = 0 ;
/ S e t u p DeadBand G e n e r a t o r (DB) S u b m o d u l e /
EPwm2Params . DBCTL OUT MODE = 0 ;
EPwm2Params . DBCTL IN MODE = 0 ;
EPwm2Params . DBCTL POLSEL = 0 ;
EPwm2Params .DBRED = 0 . 0 ;
EPwm2Params .DBFED = 0 . 0 ;
/ S e t u p E v e n tT r i g g e r (ET) S u b m o d u l e /
EPwm2Params . ETSEL SOCAEN = 0 ;
EPwm2Params . ETSEL SOCASEL = 1 ;
EPwm2Params . ETPS SOCAPRD = 1 ;
EPwm2Params . ETSEL SOCBEN = 0 ;
EPwm2Params . ETSEL SOCBSEL = 1 ;
EPwm2Params . ETPS SOCBPRD = 1 ;
EPwm2Params . ETSEL INTEN = 0 ;
EPwm2Params . ETSEL INTSEL = 1 ;
EPwm2Params . ETPS INTPRD = 1 ;
/ S e t u p PWMC h o p p e r (PC) S u b m o d u l e /
EPwm2Params . PCCTL CHPEN = 0 ;
EPwm2Params . PCCTL CHPFREQ = 0 ;
EPwm2Params .PCCTL OSHTWTH = 0 ;
EPwm2Params . PCCTL CHPDUTY = 0 ;
/ S e t u p T r i pZone (TZ) S u b m o d u l e /
EPwm2Params . TZSEL = 0 ;
EPwm2Params . TZCTL TZA = 1 ;
EPwm2Params . TZCTL TZB = 1 ;
EPwm2Params . TZEINT OST = 0 ;
EPwm2Params . TZEINT CBC = 0 ;
/ I n i t i a l ePWM2 /
config ePWMRegs(&EPwm2Regs , &EPwm2Params ) ;
}
57
/ S t a r t f o r SF u n c t i o n ( c280xpwm ) : <S6>/ePWM2 /
/ I n i t i a l i z e ePWM1 m o d u l e s /
{
EPWMPARAMS EPwm1Params ;
/ S e t u p TimeBase (TB) S u b m o d u l e /
EPwm1Params .TBPRD = PWMMAX;
EPwm1Params .TBCTL CTRMODE = 0 ;
EPwm1Params . TBCTL SYNCOSEL = 3 ;
EPwm1Params . TBCTL PHSEN = 0 ;
EPwm1Params . TBCTL PHSDIR = 0 ;
EPwm1Params . TBPHS = 0 ;
EPwm1Params . TBCTL HSPCLKDIV = 0 ;
EPwm1Params . TBCTL CLKDIV = 0 ;
/ S e t u p C o u n t e r C o m p a r e (CC) S u b m o d u l e /
EPwm1Params .CMPCTL LOADAMODE = 0 ;
EPwm1Params .CMPCTL LOADBMODE = 0 ;
EPwm1Params .CMPA = PWMMAX;
EPwm1Params .CMPB = 3 2 0 0 0 ;
/ S e t u p A c t i o n Q u a l i f i e r (AQ) S u b m o d u l e /
EPwm1Params .AQCTLA = 3 6 ;
EPwm1Params .AQCTLB = 2 6 4 ;
EPwm1Params . AQCSFRC CSFA = 0 ;
EPwm1Params . AQCSFRC CSFB = 0 ;
EPwm1Params . AQCSFRC RLDCSF = 0 ;
/ S e t u p DeadBand G e n e r a t o r (DB) S u b m o d u l e /
EPwm1Params . DBCTL OUT MODE = 0 ;
EPwm1Params . DBCTL IN MODE = 0 ;
EPwm1Params . DBCTL POLSEL = 0 ;
EPwm1Params .DBRED = 0 . 0 ;
EPwm1Params .DBFED = 0 . 0 ;
/ S e t u p E v e n tT r i g g e r (ET) S u b m o d u l e /
EPwm1Params . ETSEL SOCAEN = 0 ;
EPwm1Params . ETSEL SOCASEL = 1 ;
EPwm1Params . ETPS SOCAPRD = 1 ;
EPwm1Params . ETSEL SOCBEN = 0 ;
EPwm1Params . ETSEL SOCBSEL = 1 ;
EPwm1Params . ETPS SOCBPRD = 1 ;
EPwm1Params . ETSEL INTEN = 0 ;
EPwm1Params . ETSEL INTSEL = 1 ;
EPwm1Params . ETPS INTPRD = 1 ;
/ S e t u p PWMC h o p p e r (PC) S u b m o d u l e /
EPwm1Params . PCCTL CHPEN = 0 ;
EPwm1Params . PCCTL CHPFREQ = 0 ;
EPwm1Params .PCCTL OSHTWTH = 0 ;
EPwm1Params . PCCTL CHPDUTY = 0 ;
/ S e t u p T r i pZone (TZ) S u b m o d u l e /
EPwm1Params . TZSEL = 0 ;
EPwm1Params . TZCTL TZA = 1 ;
EPwm1Params . TZCTL TZB = 1 ;
EPwm1Params . TZEINT OST = 0 ;
EPwm1Params . TZEINT CBC = 0 ;
/ I n i t i a l ePWM1 /
config ePWMRegs(&EPwm1Regs , &EPwm1Params ) ;
}
58
if ( chan1 > 1 )
chan1 = 1 ;
if ( chan1 < 0 )
chan1 = 0 ;
if ( chan2 > 1 )
chan2 = 1 ;
if ( chan2 < 0 )
chan2 = 0 ;
if ( chan3 > 1 )
chan3 = 1 ;
if ( chan3 < 0 )
chan3 = 0 ;
/ U p d a t e CMPA v a l u e f o r ePWM3 /
{
EPwm3Regs .CMPA. h a l f .CMPA = ( U i n t 1 6 ) ( chan3 ) ;
}
/ U p d a t e CMPB v a l u e f o r ePWM3 /
{
EPwm3Regs .CMPB = ( U i n t 1 6 ) ( chan3 ) ;
}
/ SF u n c t i o n ( c280xpwm ) : <S6>/ePWM1 /
/ U p d a t e CMPA v a l u e f o r ePWM2 /
{
EPwm2Regs .CMPA. h a l f .CMPA = ( U i n t 1 6 ) ( chan2 ) ;
}
/ U p d a t e CMPB v a l u e f o r ePWM2 /
{
EPwm2Regs .CMPB = ( U i n t 1 6 ) ( chan2 ) ;
}
/ SF u n c t i o n ( c280xpwm ) : <S6>/ePWM2 /
/ U p d a t e CMPA v a l u e f o r ePWM1 /
{
EPwm1Regs .CMPA. h a l f .CMPA = ( U i n t 1 6 ) ( chan1 ) ;
}
/ U p d a t e CMPB v a l u e f o r ePWM1 /
{
EPwm1Regs .CMPB = ( U i n t 1 6 ) ( chan1 ) ;
}
C.8 LCD.h
/
LCD . h Base c l a s s t h a t p r o v i d e s h a r d w a r e i n t e r f a c e t o LCD
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
59
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
/
// b a s e d on a r d u i n o h d 4 4 7 8 0 l i b r a r y
#i f n d e f LCDLIBS H
#d e f i n e LCDLIBS H
#include " D S P 2 8 x _ P r o j e c t . h " // D e v i c e Headerfile
#include " s w i t c h e r l i b s . h "
// commands
#d e f i n e LCD CLEARDISPLAY 0 x01
#d e f i n e LCD RETURNHOME 0 x02
#d e f i n e LCD ENTRYMODESET 0 x04
#d e f i n e LCD DISPLAYCONTROL 0 x08
#d e f i n e LCD CURSORSHIFT 0 x10
#d e f i n e LCD FUNCTIONSET 0 x20
#d e f i n e LCD SETCGRAMADDR 0 x40
#d e f i n e LCD SETDDRAMADDR 0 x80
// f l a g s f o r d i s p l a y e n t r y mode
#d e f i n e LCD ENTRYRIGHT 0 x00
#d e f i n e LCD ENTRYLEFT 0 x02
#d e f i n e LCD ENTRYSHIFTINCREMENT 0 x01
#d e f i n e LCD ENTRYSHIFTDECREMENT 0 x00
// f l a g s f o r d i s p l a y on / o f f control
#d e f i n e LCD DISPLAYON 0 x04
#d e f i n e LCD DISPLAYOFF 0 x00
#d e f i n e LCD CURSORON 0 x02
#d e f i n e LCD CURSOROFF 0 x00
#d e f i n e LCD BLINKON 0 x01
#d e f i n e LCD BLINKOFF 0 x00
// f l a g s f o r d i s p l a y / c u r s o r s h i f t
#d e f i n e LCD DISPLAYMOVE 0 x08
#d e f i n e LCD CURSORMOVE 0 x00
#d e f i n e LCD MOVERIGHT 0 x04
#d e f i n e LCD MOVELEFT 0 x00
// f l a g s f o r f u n c t i o n s e t
#d e f i n e LCD 8BITMODE 0 x10
#d e f i n e LCD 4BITMODE 0 x00
#d e f i n e LCD 2LINE 0 x08
#d e f i n e LCD 1LINE 0 x00
#d e f i n e LCD 5x10DOTS 0 x04
#d e f i n e LCD 5x8DOTS 0 x00
60
C.9 LCD.c
/
LCD . c Base c l a s s t h a t p r o v i d e s h a r d w a r e i n t e r f a c e t o LCD
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
/
// b a s e d on a r d u i n o source code for hd44780 display
#include " L C D . h "
/ v o i d L C D s e t C u r s o r ( u i n t 8 t c o l , u i n t 8 t row ) /
/ { /
/ i n t r o w o f f s e t s [ ] = { 0 x00 , 0 x40 , 0 x14 , 0 x 5 4 } ; /
/ i f ( row > n u m l i n e s ) { /
/ row = n u m l i n e s 1; // we c o u n t r o w s s t a r t i n g w/0 /
/ } /
/ /
/ LCDcommand (LCD SETDDRAMADDR | ( c o l + r o w o f f s e t s [ row ] ) ) ; /
/ } /
61
v a l u e = ( ( v a l u e 0 x80200802ULL ) & 0 x0884422110ULL ) 0 x0101010101ULL >> 3 2 ;
GpioDataRegs .GPBCLEAR. a l l = 0 xFF000000 ; // c l e a r t h e t o p p i n s
GpioDataRegs . GPBSET . a l l = 0 xFF000000 & ( ( unsigned long ) v a l u e << 2 4 ) ;
LCDpulseEnable ( ) ;
}
// i f t h e r e i s a RW p i n i n d i c a t e d , s e t it low to Write
// d i g i t a l W r i t e ( r w p i n , LOW) ;
GpioDataRegs .GPBCLEAR. b i t . GPIO54 = 1 ;
LCDwrite8bits ( value ) ;
// Send f u n c t i o n s e t command s e q u e n c e
LCDcommand(LCD FUNCTIONSET | LCDdisplayfunction ) ;
DELAY US( 4 5 0 0 ) ; // w a i t more t h a n 4 . 1 ms
// s e c o n d t r y
LCDcommand(LCD FUNCTIONSET | LCDdisplayfunction ) ;
DELAY US( 1 5 0 ) ;
// t h i r d g o
LCDcommand(LCD FUNCTIONSET | LCDdisplayfunction ) ;
DELAY US( 1 5 0 ) ;
// f i n a l l y , s e t # l i n e s , f o n t s i z e , e t c .
LCDcommand(LCD FUNCTIONSET | LCDdisplayfunction ) ;
DELAY US( 1 5 0 ) ;
// t u r n t h e d i s p l a y on w i t h no c u r s o r o r b l i n k i n g d e f a u l t
L C D d i s p l a y c o n t r o l = LCD DISPLAYON | LCD CURSOROFF | LCD BLINKOFF ;
LCDdisplay ( ) ;
DELAY US( 1 5 0 ) ;
// c l e a r i t o f f
LCDclear ( ) ;
DELAY US( 1 5 0 ) ;
// I n i t i a l i z e t o d e f a u l t t e x t d i r e c t i o n ( f o r romance l a n g u a g e s )
LCDdisplaymode = LCD ENTRYLEFT | LCD ENTRYSHIFTDECREMENT ;
// s e t t h e e n t r y mode
LCDcommand(LCD ENTRYMODESET | LCDdisplaymode ) ;
DELAY US( 1 5 0 ) ;
}
62
void LCDclear ( )
{
LCDcommand(LCD CLEARDISPLAY) ; // c l e a r d i s p l a y , s e t cursor position to zero
DELAY US( 2 0 0 0 ) ; // t h i s command t a k e s a l o n g t i m e !
}
void LCDhome ( )
{
LCDcommand(LCD RETURNHOME) ; // s e t c u r s o r p o s i t i o n to zero
DELAY US( 2 0 0 0 ) ; // t h i s command t a k e s a l o n g t i m e !
}
// Turn t h e d i s p l a y on / o f f ( q u i c k l y )
void LCDnoDisplay ( ) {
L C D d i s p l a y c o n t r o l &= LCD DISPLAYON ;
LCDcommand(LCD DISPLAYCONTROL | LCDdisplaycontrol ) ;
}
void LCDdisplay ( ) {
L C D d i s p l a y c o n t r o l |= LCD DISPLAYON ;
LCDcommand(LCD DISPLAYCONTROL | LCDdisplaycontrol ) ;
}
C.10 Mathlib.h
/
M a t h l i b . h Base c l a s s t h a t p r o v i d e s PID and m a t r i x m u l t i p l i c a t i o n operations in
fl oat ing point
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
#i f n d e f MATHLIB H
#d e f i n e MATHLIB H
#d e f i n e r e a l T double
typedef s t r u c t P I D s t r u c t {
f l o a t Pgain ;
float Igain ;
f l o a t Dgain ;
double I n t e g r a l ;
f l o a t Dcurrent ;
f l o a t Dprev ;
} PIDstruct ;
typedef s t r u c t I s t r u c t {
float Igain ;
double I n t e g r a l ;
f l o a t InputPrev ;
char s a t u r a t i o n ;
float satHI ;
63
f l o a t satLO ;
}Istruct ;
typedef s t r u c t F I R s t r u c t {
float prevsamples [ 4 ] ;
} FIRstruct ;
#d e f i n e VC ZONEPLUS 0 x01
#d e f i n e VC ZONEZERO 0 x02
#d e f i n e VC ZONEMINUS 0 x04
#d e f i n e IL ZONEPLUS 0 x40
#d e f i n e IL ZONEZERO 0 x20
#d e f i n e IL ZONEMINUS 0 x10
unsigned char E r r o r 2 Z o n e ( r e a l T il , real T vc ) ;
#e n d i f // end o f definition
C.11 Mathlib.c
/
M a t h l i b . c Base c l a s s t h a t p r o v i d e s PID and m a t r i x m u l t i p l i c a t i o n operations in
fl oat ing point
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
f l o a t MathPID ( P I D s t r u c t PID , f l o a t P , f l o a t I , f l o a t D) {
// t h i s i s a r e a l l y n o i s y d e r i v i i t v e so i t s h o u l d not r e a l l y be used . . .
64
float d e r i v i t i v e ;
d e r i v i t i v e = (D ( PID>Dprev ) ) /SAMPLETIME ;
( PID>Dprev ) = D;
PID>I n t e g r a l += ( I ( PID>I g a i n ) ) SAMPLETIME ;
f l o a t MathFIR4 ( F I R s t r u c t FIR , f l o a t s a m p l e ) {
f l o a t temp ;
temp = ( s a m p l e FIR>p r e v s a m p l e s [ 0 ] + FIR>p r e v s a m p l e s [ 1 ] FIR>p r e v s a m p l e s [ 2 ] +
FIR>p r e v s a m p l e s [ 3 ] ) / 5 ;
FIR>p r e v s a m p l e s [ 3 ] = FIR>p r e v s a m p l e s [ 2 ] ;
FIR>p r e v s a m p l e s [ 2 ] = FIR>p r e v s a m p l e s [ 1 ] ;
FIR>p r e v s a m p l e s [ 1 ] = FIR>p r e v s a m p l e s [ 0 ] ;
FIR>p r e v s a m p l e s [ 0 ] = s a m p l e ;
return temp ;
}
// f i r s t i s x s e c o n d i s y s o x b y y m a t r i x
// m u l t i p l y t w o 2 x 2 m a t r i c s t o g e t h e r
void Mmpy2x2 ( r e a l T A [ 4 ] , r e a l T B [ 4 ] , r e a l T o u t [ 4 ] ) {
out [ 0 ] = A[ 0 ] B [ 0 ] + A[ 1 ] B [ 2 ] ;
out [ 1 ] = A[ 0 ] B [ 1 ] + A[ 1 ] B [ 3 ] ;
out [ 2 ] = A[ 2 ] B [ 0 ] + A[ 3 ] B [ 2 ] ;
out [ 3 ] = A[ 2 ] B [ 1 ] + A[ 3 ] B [ 3 ] ;
}
// m u l t i p l y a 2 x 2 1 x 2 t o g e t a 1 x 2
void Mmpy2x1 ( r e a l T A [ 4 ] , r e a l T B [ 2 ] , r e a l T o u t [ 2 ] ) {
out [ 0 ] = A[ 0 ] B [ 0 ] + A[ 1 ] B [ 1 ] ;
out [ 1 ] = A[ 2 ] B [ 0 ] + A[ 3 ] B [ 1 ] ;
}
// m u l t i p l y a 2 x 2 by a s c a l a r
void Mmpy2xs ( r e a l T A[ 4 ] , real T s , r e a l T out [ 4 ] ) {
out [ 0 ] = A[ 0 ] s;
out [ 1 ] = A[ 1 ] s;
out [ 2 ] = A[ 2 ] s;
out [ 3 ] = A[ 3 ] s;
}
65
// d o t m u l t i p l y , m u l t i p l y e l e m e n t w i z e t w o m a t r i c e s t o g e t h e r
void Mmpydot2x2 ( r e a l T A [ 4 ] , r e a l T B [ 4 ] , r e a l T o u t [ 4 ] ) {
out [ 0 ] = A[ 0 ] B [ 0 ] ;
out [ 1 ] = A[ 1 ] B [ 1 ] ;
out [ 2 ] = A[ 2 ] B [ 2 ] ;
out [ 3 ] = A[ 3 ] B [ 3 ] ;
}
#d e f i n e ITER ( 6 . 0 0 )
void Mexp2x2 ( r e a l T A [ 4 ] , r e a l T o u t [ 4 ] ) {
real T X[ 4 ] ;
r e a l T A2 [ 4 ] ;
r e a l T T1 [ 4 ] ;
r e a l T cX [ 4 ] ;
r e a l T mxc = 0 . 5 0 ;
r e a l T nm ;
real T s ;
r e a l T norm ;
r e a l T E [ 4 ] = { 1 , 0 , 0 , 1 } ; // make e y e ( 2 )
real T D[ 4 ] = {1 ,0 ,0 ,1};
int logtwo ;
int i , j , k ;
66
// now we a r e d o n e i t e r a t i n g , and n e e d t o do some c r a z y E = D\E
memcpy (X, E , s i z e o f (X) ) ; // c o p y r e s u l t s b a c k i n t o X
// f i g u r e o u t i f t h e u p p e r r i g h t i s l a r g e r t h a n t h e u p p e r l e f t e n t r y
i f ( a b s (D [ 1 ] ) > a b s (D [ 0 ] ) ) {
i = 2;
j = 1;
} else {
i = 1;
j = 2;
}
nm = D[ j 1 ] / D[ i 1 ] ;
s = D[ j + 1 ] nm D[ i + 1 ] ;
// d o n t t e s t f o r b a d t h i n g s l i k e zero entries here . . just assume g o o d
// m a n u a l l y u n r o l l e d b e l o w
// f o r ( k = 0 ; k < 2 ; k++) {
// E [ 1 + ( k << 1 ) ] = (X [ ( j 1 ) + ( k << 1 ) ] X [ ( i 1 ) + ( k << 1 ) ] nm) / s ;
// E [ k << 1 ] = (X [ ( i 1 ) + ( k << 1 ) ] E [ 1 + ( k << 1 ) ] D [ i + 1 ] ) / D [ i
1];
// }
E [ 0 ] = (X [ ( i 1 ) ] E [ 1 ] D[ i + 1 ] ) / D[ i 1 ] ;
E [ 1 ] = (X [ ( j 1 ) ] X [ ( i 1 ) ] nm) / s ;
E [ 2 ] = (X [ ( i 1 ) + 2 ] E [ 3 ] D[ i + 1 ] ) / D[ i 1 ] ;
E [ 3 ] = (X [ ( j 1 ) + 2 ] X [ ( i 1 ) + 2 ] nm) / s ;
f o r ( i = 0 ; i < l o g t w o ; i ++){
Sq2x2 (E , T1 ) ;
memcpy (E , T1 , s i z e o f (E) ) ;
}
// c o p y r e s u l t f r o m E t o o u t p u t
memcpy ( out , E , s i z e o f (E) ) ;
}
void Minv2x2 ( r e a l T A [ 4 ] , r e a l T o u t [ 4 ] ) {
r e a l T temp ;
temp = 1 / (A [ 0 ] A [ 3 ] A [ 1 ] A [ 2 ] ) ;
o u t [ 0 ] = A [ 3 ] temp ;
o u t [ 1 ] = A [ 1 ] temp ;
o u t [ 2 ] = A [ 2 ] temp ;
o u t [ 3 ] = A [ 0 ] temp ;
}
67
i f ( v c > NOISEI ) {
temp |= VC ZONEPLUS ;
} e l s e i f ( v c > NOISEI ) {
temp |= VC ZONEZERO ;
} else {
temp |= VC ZONEMINUS ;
}
return temp ;
}
C.12 Obsparams.h
/
ObsParams . h V a l u e s u s e d f o r o b s e r v e r p a r a m e t e r s
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
/
#d e f i n e A11 ( 2.0040 e0 )
#d e f i n e A12 ( 2.0040 e3 )
#d e f i n e A21 ( 1 . 7 2 4 1 0 e3 )
#d e f i n e A22 (0 e0 )
#d e f i n e B11 ( 2 . 0 0 4 0 e 3 )
#d e f i n e B22 ( 1 . 7 2 4 1 0 e 3 )
//4 , 5
#d e f i n e L11 ( 7 . 9 9 8 e3 )
#d e f i n e L12 ( 2 . 5 0 0 4 e3 )
#d e f i n e L21 ( 1 . 7 2 4 1 e3 )
#d e f i n e L22 (8 e3 )
/
#d e f i n e SIGMA (100 e0 )
#d e f i n e RESR ( 0 . 0 8 2 e0 )
#d e f i n e RDSON ( 0 . 0 2 2 e0 )
#d e f i n e RDIODE ( 0 . 1 e0 )
#d e f i n e RINDUCTOR ( 0 . 0 4 e0 )
#d e f i n e INDUCTOR ( 5 0 0 . 9 e 6)
#d e f i n e CAPACITOR ( 5 3 4 e 6)
#d e f i n e VDIODE ( 0 . 5 1 3 7 e0 )
// I n v e r s e s s o t h e c o m p i l e r d o e s n t do divides
#d e f i n e ISIGMA ( 1 . 0 e 2)
#d e f i n e IRESR ( 1 2 . 1 9 5 1 2 1 e0 )
#d e f i n e IRDSON ( 4 5 . 4 5 4 5 4 5 4 5 e0 )
#d e f i n e IRDIODE (10 e0 )
#d e f i n e IRINDUCTOR (25 e0 )
#d e f i n e IINDUCTOR ( 1 9 9 6 . 4 0 6 4 e 0 )
#d e f i n e ICAPACITOR ( 1 8 7 2 . 6 5 9 e0 )
#d e f i n e IVDIODE ( 1 . 9 4 6 6 6 e0 )
// d i l = + Cd/INDUCTOR g e t c h a n ( Vc )
68
#d e f i n e NOISEI ( 0 . 4 )
#d e f i n e NOISEC ( 0 . 0 3 )
C.13 Print.h
/
P r i n t . h Base c l a s s t h a t p r o v i d e s p r i n t ( ) and p r i n t l n ( )
C o p y r i g h t ( c ) 2008 David A. M e l l i s . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
/
#i f n d e f P r i n t h
#d e f i n e P r i n t h
#include " D S P 2 8 x _ P r o j e c t . h " // D e v i c e Headerfile
#include " s w i t c h e r l i b s . h "
void p r i n t ( char s t r [ ] ) ;
void p r i n t N 8 S ( char , i n t ) ;
void printN8U ( unsigned char , i n t ) ;
void p r i n t I n t S ( int , i n t ) ;
void p r i n t I n t U ( unsigned int , i n t ) ;
void p r i n t L o n g S ( long , i n t ) ;
void p r i n t L o n g U ( unsigned long , i n t ) ;
void p r i n t D o u b l e ( double , i n t ) ; // s e c o n d param is 2
void p r i n t l n ( void ) ;
#e n d i f
C.14 Print.c
/
P r i n t . c p p Base c l a s s t h a t provides p r i n t ( ) and p r i n t l n ( )
C o p y r i g h t ( c ) 2008 David A. Mellis . All right reserved .
69
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
M o d i f i e d 23 November 2 0 0 6 b y D a v i d A . Mellis
/
// P u b l i c Methods //////////////////////////////////////////////////////////////
/ d e f a u l t i m p l e m e n t a t i o n : may b e o v e r r i d d e n /
void w r i t e ( const char s t r )
{
while ( s t r ) {
s c i a x m i t ( s t r ) ;
s t r ++;
}
}
/ d e f a u l t i m p l e m e n t a t i o n : may b e o v e r r i d d e n /
void w r i t e N ( char b u f f e r , unsigned char s i z e )
{
while ( s i z e )
s c i a x m i t ( b u f f e r ++) ;
}
void p r i n t ( char s t r [ ] )
{
write ( str ) ;
}
void p r i n t N 8 S ( char c , i n t b a s e )
{
p r i n t L o n g S ( ( long ) c , b a s e ) ;
}
void p r i n t I n t S ( i n t n , i n t b a s e )
{
p r i n t L o n g S ( ( long ) n , b a s e ) ;
}
void p r i n t L o n g S ( long n , i n t b a s e )
{
i f ( b a s e == 0 ) {
p r i n t L o n g S ( n ,DEC) ;
} e l s e i f ( b a s e == 1 0 ) {
i f (n < 0) {
print ( " -" ) ;
n = n ;
}
printNumber ( n , 1 0 ) ;
} else {
printNumber ( n , b a s e ) ;
70
}
}
void p r i n t l n ( void )
{
print ( "\r" ) ;
print ( "\n" ) ;
}
// P r i v a t e Methods /////////////////////////////////////////////////////////////
if ( n == 0 ) {
print ( "0" ) ;
return ;
}
while ( n > 0 ) {
b u f [ i ++] = n % b a s e ;
n /= b a s e ;
}
f o r ( ; i > 0 ; i )
s c i a x m i t ( ( char ) ( b u f [ i 1 ] < 10 ?
0 + buf [ i 1 ] :
A + buf [ i 1 ] 10) ) ;
}
number += r o u n d i n g ;
71
// E x t r a c t d i g i t s f r o m t h e r e m a i n d e r one a t a t i m e
while ( d i g i t s > 0 )
{
r e m a i n d e r = 1 0 . 0 ;
toPrint = ( int ) remainder ;
p r i n t I n t S ( t o P r i n t ,DEC) ;
r e m a i n d e r = t o P r i n t ;
}
}
C.15 Ring.h
/
r i n g . h Base c l a s s t h a t p r o v i d e s a b u f f e r e d r e a d e r and writer using rings
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
/
#i f n d e f RINGLIBS H
#d e f i n e RINGLIBS H
#d e f i n e RINGSIZE 4
typedef s t r u c t a d c r i n g s a m p l e {
float samples [ 8 ] ;
unsigned char v a l i d ;
f l o a t time ;
unsigned short rawtime ;
} adcringsample ;
typedef s t r u c t a d c r i n g d e f {
a d c r i n g s a m p l e s a m p l e [ RINGSIZE ] ;
i n t head ;
int t a i l ;
int s i z e ;
}adcringdef ;
void i n i t R i n g b u f ( void ) ;
a d c r i n g s a m p l e popRingElem ( void ) ;
void i n s e r t R i n g E l e m ( a d c r i n g s a m p l e ) ;
int a d c r i n g a v a l i a b l e ( void ) ;
#e n d i f // end o f definition
72
C.16 Ring.c
/
r i n g . c Base c l a s s t h a t p r o v i d e s a b u f f e r e d r e a d e r and writer using rings
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
adcringdef adcring ;
void i n i t R i n g b u f ( void ) {
a d c r i n g . head = 0 ;
adcring . t a i l = 0;
adcring . s i z e = 0;
}
void i n s e r t R i n g E l e m ( a d c r i n g s a m p l e e l e m e n t ) {
i n t i = ( a d c r i n g . head + 1 ) % RINGSIZE ;
if ( i != a d c r i n g . t a i l ) {
memcpy(&( a d c r i n g . s a m p l e [ a d c r i n g . head ] ) , e l e m e n t , sizeof ( adcringsample ) ) ;
a d c r i n g . head = i ;
}
else {
//TODO: we h a v e overflowed the buffer and s h o u l d flag it here :
asm( " N O P " ) ;
}
}
a d c r i n g s a m p l e popRingElem ( void ) {
i f ( a d c r i n g . head == a d c r i n g . t a i l ) {
return ( a d c r i n g s a m p l e ) 0 ;
}
a d c r i n g . t a i l = ( unsigned i n t ) ( a d c r i n g . t a i l + 1 )% RINGSIZE ;
return &( a d c r i n g . s a m p l e [ a d c r i n g . t a i l ] ) ;
int a d c r i n g a v a l i a b l e ( void ) {
return ( unsigned i n t ) ( RINGSIZE + a d c r i n g . head a d c r i n g . t a i l ) % RINGSIZE ;
}
C.17 Scilib.h
/
s c i l i b . h Base c l a s s t h a t p r o v i d e s hardware i n t e r f a c e to serial port
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
73
version 2.1 of the License , or ( at your o p t i o n ) any later version .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
/
#i f n d e f SCILIB H
#d e f i n e SCILIB H
void s c i a e c h o b a c k i n i t ( void ) ;
void s c i a f i f o i n i t ( void ) ;
void s c i a x m i t ( i n t a ) ;
void s c i a m s g ( const char msg ) ;
void s c i a r x i s r ( void ) ;
unsigned char s c i a h a s b y t e ( void ) ;
unsigned char s c i a g e t b y t e ( void ) ;
C.18 Scilib.c
/
s c i l i b . c Base c l a s s t h a t p r o v i d e s hardware i n t e r f a c e to serial port
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
/
// s c i a
#include " S c i l i b . h "
S c i a R e g s . SCICCR . a l l =0x0007 ; // 1 s t o p b i t , No l o o p b a c k
// No p a r i t y , 8 c h a r b i t s ,
// a s y n c mode , i d l e l i n e p r o t o c o l
S c i a R e g s . SCICTL1 . a l l =0x0003 ; // e n a b l e TX, RX, i n t e r n a l SCICLK ,
// D i s a b l e RX ERR, SLEEP , TXWAKE
S c i a R e g s . SCICTL2 . a l l =0x0003 ;
S c i a R e g s . SCICTL2 . b i t . TXINTENA =1;
74
S c i a R e g s . SCICTL2 . b i t .RXBKINTENA =1;
/ # i f ( CPU FRQ 150MHZ )
S c i a R e g s . SCIHBAUD =0 x 0 0 0 1 ; // 9 6 0 0 b a u d @LSPCLK = 3 7 . 5 MHz .
S c i a R e g s . SCILBAUD =0x00E7 ;
#e n d i f
# i f ( CPU FRQ 100MHZ )
S c i a R e g s . SCIHBAUD =0 x 0 0 0 1 ; // 9 6 0 0 b a u d @LSPCLK = 20MHz .
S c i a R e g s . SCILBAUD =0 x 0 0 4 4 ;
#e n d i f /
S c i a R e g s . SCIHBAUD = ( BAUDREG >> 8 ) & 0x00FF ;
S c i a R e g s . SCILBAUD = ( BAUDREG & 0x00FF ) ;
S c i a R e g s . SCICTL1 . a l l =0x0023 ; // R e l i n q u i s h SCI f r o m R e s e t
}
// T r a n s m i t a c h a r a c t e r f r o m t h e SCI
void s c i a x m i t ( i n t a )
{
while ( S c i a R e g s . SCIFFTX . b i t . TXFFST != 0 ) {}
S c i a R e g s . SCITXBUF=a ;
// I n i t a l i z e t h e SCI FIFO
void s c i a f i f o i n i t ( )
{
S c i a R e g s . SCIFFTX . a l l =0xE040 ;
S c i a R e g s . SCIFFRX . a l l =0 x 2 0 4 f ;
S c i a R e g s . SCIFFCT . a l l =0x0 ;
}
unsigned short r x b y t e ;
unsigned short r e c i e v e d b y t e ;
/
interrupt void s c i a r x i s r () {
r x b y t e = S c i a R e g s . SCIRXBUF . a l l ;
recievedbyte = 1;
S c i a R e g s . SCIFFRX . b i t .RXFFOVRCLR=1; // C l e a r Overflow f l a g
S c i a R e g s . SCIFFRX . b i t . RXFFINTCLR=1; // C l e a r Interrupt flag
}
/
unsigned char s c i a h a s b y t e ( ) {
i f ( S c i a R e g s . SCIFFRX . b i t . RXFFST)
return 1 ;
return 0 ;
}
unsigned char s c i a g e t b y t e ( ) {
// r e c i e v e d b y t e = 0 ;
// r e t u r n r x b y t e ;
return S c i a R e g s . SCIRXBUF . a l l ;
}
75
C.19 switcherlibs.h
/
s w i t c h e r l i b s . h header f i l e to b u i l d p r o j e c t
C o p y r i g h t ( c ) 2011 Kieran T Le vi n . All right reserved .
This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
L e s s e r G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
You s h o u l d h a v e r e c e i v e d a c o p y o f t h e GNU L e s s e r G e n e r a l P u b l i c
L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e Free S o f t w a r e
F o u n d a t i o n , I n c . , 51 F r a n k l i n S t , F i f t h F l o o r , B o s t o n , MA 02110 1301 USA
/
#i f n d e f SWITCHERLIBS H
#d e f i n e SWITCHERLIBS H
#include " D S P 2 8 x _ P r o j e c t . h " // D e v i c e H e a d e r f i l e
#include " m a t h . h "
// s e r i a l p o r t c u s t o m l i b r a r y
#d e f i n e FALSE ( 0 )
#d e f i n e TRUE ( 1 )
#d e f i n e REALTIME
#d e f i n e SAMPLERATE ( 1 . 0 E005 1 0 0 0 0 0 0 )
#d e f i n e SAMPLETIME ( 1 . 0 E005 )
76
APPENDIX D
D.1 serialreadtofiles.m
%s e r i a l t o M f i l e r e c o r d e r . . . .
clear
%i f ( 0 == i s v a l i d ( s ) )
s = s e r i a l ( COM4 ) ;
set ( s , B a u d R a t e ,115200 , D a t a B i t s ,8 , Parity , none ) ;
fopen ( s ) ;
%end
% Find a GPIB o b j e c t .
obj1 = i n s t r f i n d ( Type , gpib , B o a r d I n d e x , 7 , P r i m a r y A d d r e s s , 1 , Tag , ) ;
% C r e a t e t h e GPIB o b j e c t i f i t d o e s not e x i s t
% o t h e r w i s e u s e t h e o b j e c t t h a t was f o u n d .
i f isempty ( obj1 )
obj1 = gpib ( A G I L E N T , 7 , 1) ;
else
f c l o s e ( obj1 ) ;
obj1 = obj1 (1)
end
% Connect t o i n s t r u m e n t o b j e c t , obj1 .
fopen ( obj1 ) ;
f p r i n t f ( obj1 , M O D E : R E S ) ;
f p r i n t f ( obj1 , R E S 10 ) ;
%t i m e r f u n c t i o n s o we d e l a y
t = timer ( S t a r t D e l a y , 5 , T i m e r F c n , . . .
@( x , y ) d i s p ( W a i t i n g f o r c o n v e r t e r results ) ) ;
%f l u s h t h e s e r i a l b u f f e r s
N = s . BytesAvailable () ;
while (N=0)
f r e a d ( s , N) ;
N = s . BytesAvailable () ;
end
Ts = 1 e 5;
displayframes = 2050;
x = ( 0 : Ts : ( d i s p l a y f r a m e s ) Ts Ts ) ;
77
tline = fgetl (s) ;
counter = 1;
while ( 1 = strncmp ( t l i n e , SectionEnd ,9) )
C = textscan ( tline , % f32 % f32 % f32 % f32 % f32 % f32 % f32 % f32 % f32 % f32 % f32
, delimiter , ,) ;
o u t p u t ( v o l t a g e , c o u n t e r , : ) = c e l l 2 m a t (C) ;
counter = counter + 1;
tline = fgetl (s) ;
end
end
name = s p r i n t f ( A u t o R u n R e s u l t s _ d a t a _ R I N D U C T O R = 5 _ R l o a d = % u . m a t , r e s i s t a n c e ) ;
name
s a v e ( name , o u t p u t , T s , x ) ;
end
%t u r n o f f t h e c o n v e r t e r
fprintf (s , s ) ;
fclose (s)
delete ( s )
clear s
f c l o s e ( obj1 ) ;
%x = ( 0 : Ts : ( 4 0 9 6 ) Ts Ts ) ;
% subplot (3 ,3 ,9)
% h o l d on
% p l o t ( output ( : , 1 ) , output ( : , 2 ) , c o l o r , b l u e ) ;
% xlabel ( Il amps ) ;
% ylabel ( Vc Volts ) ;
% t i t l e ( D i f f e r e n c e E q u a t i o n s XY ) ;
%d i s p l a y f r a m e s = 1 8 0 0 ; %drop t h e empty f r a m e s
%o u t p u t = o u t p u t ( 1 : d i s p l a y f r a m e s , : ) ;
%l o a d ( r e s u l t s _ d a t a . m a t ) ;
% subplot (6 ,2 ,1)
% p l o t ( x , output ( : , 5 ) ) ;
% t i t l e ( [ V o l t a g e In . Avg , num2str ( mean ( o u t p u t ( : , 5 ) ) ) ] ) ;
% ylabel ( V ) ;
%
% subplot (6 ,2 ,2)
% p l o t ( x , output ( : , 4 ) ) ;
% t i t l e ( [ C u r r e n t In . Avg , num2str ( mean ( o u t p u t ( : , 4 ) ) ) ] ) ;
% ylabel ( A ) ;
%
% subplot (6 ,2 ,3)
% p l o t ( x , output ( : , 3 ) ) ;
% t i t l e ( [ Inductor Current . Avg , num2str ( mean ( o u t p u t ( : , 3 ) ) ) ] ) ;
% ylabel ( A ) ;
%
% subplot (6 ,2 ,4)
% p l o t ( x , output ( : , 2 ) ) ;
% t i t l e ( [ Voltage Out . Avg , num2str ( mean ( o u t p u t ( : , 2 ) ) ) ] ) ;
% ylabel ( V ) ;
%
% subplot (6 ,2 ,5)
% p l o t ( x , output ( : , 1 ) ) ;
% t i t l e ( [ Current Out . Avg , num2str ( mean ( o u t p u t ( : , 1 ) ) ) ] ) ;
% ylabel ( A ) ;
%
% subplot (6 ,2 ,6)
% p l o t ( x , output ( : , 6 ) ) ;
% t i t l e ( Fault Trigger ) ;
% ylabel ( TF ) ;
%
% subplot (6 ,2 ,7)
% p l o t ( x , output ( : , 7 ) ) ;
% t i t l e ( O b s e r v e r Il ) ;
% ylabel ( A ) ;
%
78
% subplot (6 ,2 ,8)
% p l o t ( x , output ( : , 8 ) ) ;
% t i t l e ( Estimated Capacitor Voltage ) ;
% ylabel ( V ) ;
%
% subplot (6 ,2 ,9)
% p l o t ( x , ( output ( : , 9 ) ) ) ;
% t i t l e ( [ V c F I R O U T . A v g , num2str ( mean ( o u t p u t ( : , 9 ) ) ) ] ) ;
% ylabel ( V ) ;
%
% subplot (6 ,2 ,10)
% p l o t ( x , output ( : , 1 0 ) ) ;
% t i t l e ( [ IlFIROUT . Avg , num2str ( mean ( o u t p u t ( : , 1 0 ) ) ) ] ) ;
% ylabel ( A ) ;
% subplot (6 ,2 ,11)
% p l o t ( x , ( output ( : , 1 ) . output ( : , 2 ) ) . / ( output ( : , 4 ) . output ( : , 5 ) ) ) ;
% t i t l e ( [ E f f i c i e n c y . A v g , num2str ( mean ( ( o u t p u t ( : , 1 ) . o u t p u t ( : , 2 ) ) . / ( o u t p u t ( : , 4 ) .
output ( : , 5 ) ) ) ) ] ) ;
% ylabel ( Efficiency % ) ;
%T h i s i s t h e most i m p o r t a n t one . . . . .
% subplot (6 ,2 ,12)
%p l o t ( x , ( o u t d a t a ( : , 1 ) . o u t d a t a ( : , 2 ) ) ) ;
% t i t l e ( [ P o w e r o u t d a t a . A v g , num2str ( mean ( ( o u t d a t a ( : , 1 ) . o u t d a t a ( : , 2 ) ) ) ) ] ) ;
%y l a b e l ( W ) ;
% p l o t ( x , ( output ( : , 2 ) output ( : , 8 ) ) ) ;
D.2 displaygraphs.m
clear ;
%l o a d ( r e s u l t s _ d a t a _ N o m i n a l _ R l o a d 4 . m a t ) ;
%l o a d ( A u t o R u n R e s u l t s _ d a t a _ N o m i n a l _ R l o a d = 2 . m a t ) ;
load ( A u t o R u n R e s u l t s _ d a t a _ R E S R =10 _Rload =2. mat ) ;
run = 5 ;
startframe = 100; %i f we want t o a d j u s t s t a r t i n d e x
d i s p l a y f r a m e s = 1 0 0 0 ; %drop t h e empty f r a m e s
o u t p u t = o u t p u t ( : , s t a r t f r a m e : ( d i s p l a y f r a m e s+s t a r t f r a m e 1) , : ) ;
Ts = 1 e 5;
x = ( 0 : Ts : ( d i s p l a y f r a m e s ) Ts Ts ) ;
%d e l t a t i m e i s i n c h a n n e l 1 1 . . . .
time = 0 ;
for i = 1 : displayframes
for j = 1:11
i f ( o u t p u t ( run , i , j ) ) > 20 | ( o u t p u t ( run , i , j ) ) < 20
o u t p u t ( run , i , j ) = median ( o u t p u t ( run , : , j ) ) ;
end
end
t i m e = t i m e + o u t p u t ( run , i , 1 1 ) ;
x ( i ) = time ;
end
%c h a n n e l = 1 1 ;
for channel = 1:11
subplot (4 ,3 , channel )
p l o t ( x , o u t p u t ( run , : , c h a n n e l ) ) ;
meanout = mean ( o u t p u t ( run , : , c h a n n e l ) ) ;
s t d d e v o u t = s t d ( o u t p u t ( run , : , c h a n n e l ) ) ;
a x i s ( [ 0 t i m e ( meanout 2 s t d d e v o u t ) ( meanout+2 s t d d e v o u t ) ] ) ;
xlabel ( t ) ;
switch c h a n n e l
case 1 %e r r o r IL
t i t l e ( [ I L E r r o r . A v g , num2str ( mean ( o u t p u t ( run , : , c h a n n e l ) ) ) ] ) ;
ylabel ( I ) ;
case 2 %e r r o r VC
t i t l e ( [ V c E r r o r . A v g , num2str ( mean ( o u t p u t ( run , : , c h a n n e l ) ) ) ] ) ;
79
ylabel ( V ) ;
case 3 %c o n f i g u r a t i o n ( i f switch 1 or 2 i s on )
t i t l e ( [ S y s t e m C o n f i g u r a t i o n . A v g , num2str ( mean ( o u t p u t ( run , : , c h a n n e l ) ) ) ] ) ;
ylabel ( \ sigma ) ;
case 4 %I I n d u c t o r
t i t l e ( [ I _ I n d u c t o r . A v g , num2str ( mean ( o u t p u t ( run , : , c h a n n e l ) ) ) ] ) ;
ylabel ( I ) ;
case 5 %V C a p a c i t o r
t i t l e ( [ V C a p a c i t o r . A v g , num2str ( mean ( o u t p u t ( run , : , c h a n n e l ) ) ) ] ) ;
ylabel ( V ) ;
case 6 %I o b s e r v e r
t i t l e ( [ O b s e r v e r I . A v g , num2str ( mean ( o u t p u t ( run , : , c h a n n e l ) ) ) ] ) ;
ylabel ( I ) ;
case 7 %Vc O b s e r v e r
t i t l e ( [ O b s e r v e r V c . A v g , num2str ( mean ( o u t p u t ( run , : , c h a n n e l ) ) ) ] ) ;
ylabel ( V ) ;
case 8 %Vinput
t i t l e ( [ V o l t a g e I n . A v g , num2str ( mean ( o u t p u t ( run , : , c h a n n e l ) ) ) ] ) ;
ylabel ( V ) ;
case 9 %Voutput
t i t l e ( [ V o l t a g e O u t . A v g , num2str ( mean ( o u t p u t ( run , : , c h a n n e l ) ) ) ] ) ;
ylabel ( V ) ;
case 10 %I o u t p u t
t i t l e ( [ C u r r e n t O u t . A v g , num2str ( mean ( o u t p u t ( run , : , c h a n n e l ) ) ) ] ) ;
ylabel ( I ) ;
case 11 %d e l t a t i m e
t i t l e ( [ D e l t a T i m e . A v g , num2str ( mean ( o u t p u t ( run , : , c h a n n e l ) ) ) ] ) ;
ylabel ( sec ) ;
end
end
D.3 generateErrors.m
clear ;
%l o a d ( r e s u l t s _ d a t a _ N o m i n a l _ R l o a d 4 . m a t ) ;
%l o a d ( A u t o R u n R e s u l t s _ d a t a _ N o m i n a l _ R l o a d = 2 . m a t ) ;
rload = 5;
%f o r e r r o r = [ 1 2 3 4 5 10 1 5 ] %f o r c a p a c i t o r
f o r e r r o r = [ 1 2 3 4 5 1 0 ] %f o r i n d u c t o r
%l o a d ( [ A u t o R u n R e s u l t s _ d a t a _ R E S R = , num2str ( e r r o r ) , _ R l o a d = , num2str ( r l o a d ) , . m a t ] ) ;
%l o a d ( [ A u t o R u n R e s u l t s _ d a t a _ N o m i n a l _ R l o a d = , num2str ( r l o a d ) , . m a t ] ) ;
l o a d ( [ A u t o R u n R e s u l t s _ d a t a _ R I N D U C T O R = , num2str ( e r r o r ) , _ R l o a d = , num2str ( r l o a d ) , . m a t
]) ;
run = 5 ;
startframe = 100; %i f we want t o a d j u s t s t a r t i n d e x
d i s p l a y f r a m e s = 1 0 0 0 ; %drop t h e empty f r a m e s
o u t p u t = o u t p u t ( : , s t a r t f r a m e : ( d i s p l a y f r a m e s+s t a r t f r a m e 1) , : ) ;
Ts = 1 e 5;
x = ( 0 : Ts : ( d i s p l a y f r a m e s ) Ts Ts ) ;
%d e l t a t i m e i s i n c h a n n e l 1 1 . . . .
time = 0 ;
for i = 1 : displayframes
for j = 1:11
i f ( o u t p u t ( run , i , j ) ) > 6 | ( o u t p u t ( run , i , j ) ) < 6
o u t p u t ( run , i , j ) = median ( o u t p u t ( run , : , j ) ) ;
end
end
t i m e = t i m e + o u t p u t ( run , i , 1 1 ) ;
x ( i ) = time ;
end
%g e n e r a t e s t a t e v a l u e s
% outputstate1 = zeros (250 ,11) ;
% outputstate2 = zeros (250 ,11) ;
%f o r j = 1 : 8
o u t p u t s t a t e l o g i c a l = ( o u t p u t ( run , : , 3 ) 1) ;
outputstatelogical = outputstatelogical (1:250) ;
for i = 1:11
80
o u t p u t s t a t e 1 ( run , : , i ) = o u t p u t ( run , l o g i c a l ( o u t p u t s t a t e l o g i c a l ) , i ) ;
o u t p u t s t a t e 2 ( run , : , i ) = o u t p u t ( run , l o g i c a l (1 o u t p u t s t a t e l o g i c a l ) , i ) ;
end
%end
yoffset = 0.04;
xoffset = 0.0;
%a r r o w = \ l e f t a r r o w ;
arrow = ;
%p l o t t h e I l ( x ) v s Vc ( y ) e r r o r
subplot (2 ,1 ,1) ;
p l o t ( o u t p u t s t a t e 1 ( run , : , 1 ) , o u t p u t s t a t e 1 ( run , : , 2 ) ) ;
p l o t ( median ( o u t p u t s t a t e 1 ( run , : , 1 ) ) , median ( o u t p u t s t a t e 1 ( run , : , 2 ) ) , o , M a r k e r S i z e
,12 , M a r k e r F a c e C o l o r , [ . 4 9 1 . 6 3 ] ) ;
h o l d on ;
% Transform from d a t a s p a c e t o f i g u r e s p a c e
%a x i s ( [ min ( 1 , min( 0.2+ o u t p u t s t a t e 1 ( run , : , 1 ) ) ) max ( 1 , 0 . 2 + max ( o u t p u t s t a t e 1 ( run , : , 1 ) ) )
min( 1 , 0.2+min ( o u t p u t s t a t e 1 ( run , : , 2 ) ) ) max ( 1 , 0 . 2 + max ( o u t p u t s t a t e 1 ( run , : , 2 ) ) ) ] )
;
content = s p r i n t f ( R_ { L }=% d , e r r o r ) ;
%c o n t e n t = ;
% P l o t anno t e x t c e n t e r e d a t t h e t a i l o f t h e a r r o w
t e x t ( x o f f s e t+mean ( o u t p u t s t a t e 1 ( run , : , 1 ) ) , y o f f s e t+mean ( o u t p u t s t a t e 1 ( run , : , 2 ) ) , [ arrow ,
content ] )
t i t l e ( Error d y n a m i c s in state 1 ) ;
ylabel ( Error V_c ( A ) ) ;
xlabel ( Error I_L ( A ) ) ;
subplot (2 ,1 ,2) ;
p l o t ( o u t p u t s t a t e 2 ( run , : , 1 ) , o u t p u t s t a t e 2 ( run , : , 2 ) , r e d ) ;
p l o t ( median ( o u t p u t s t a t e 2 ( run , : , 1 ) ) , median ( o u t p u t s t a t e 2 ( run , : , 2 ) ) , - m o , M a r k e r S i z e
,12 , M a r k e r F a c e C o l o r , [ . 4 9 1 . 6 3 ] ) ;
h o l d on ;
%a x i s ( [ min( 1 , 0.2+min ( o u t p u t s t a t e 2 ( run , : , 1 ) ) ) max ( 1 , 0 . 2 + max ( o u t p u t s t a t e 2 ( run , : , 1 ) ) )
min( 1 , 0.2+min ( o u t p u t s t a t e 2 ( run , : , 2 ) ) ) max ( 1 , 0 . 2 + max ( o u t p u t s t a t e 2 ( run , : , 2 ) ) ) ] )
;
t e x t ( x o f f s e t+mean ( o u t p u t s t a t e 2 ( run , : , 1 ) ) , y o f f s e t+mean ( o u t p u t s t a t e 2 ( run , : , 2 ) ) , [ arrow ,
content ] )
t i t l e ( Error d y n a m i c s in state 2 ) ;
ylabel ( Error V_c ( V ) ) ;
xlabel ( Error I_L ( A ) ) ;
end ;
D.4 Buckconverter.m
f u n c t i o n [ I l O u t VcOut Vout ] = B u c k c o n v e r t e r ( I l , Vc , Iload , I i n , Vin , Time , DutyState ,
iteration , f , failure )
%C o n v e r t e r P a r a m e t e r s
RESR =(0.082 e0 ) ;
RDSON =(0.022 e0 ) ;
RDIODE =(0.1 e0 ) ;
RINDUCTOR =(0.04 e0 ) ;
INDUCTOR = ( 5 0 0 . 9 e 6) ;
CAPACITOR =(534 e 6) ;
VDIODE =(0.5137 e0 ) ;
F NONE = 0 ;
F CAPACITOR = 1 ;
F INDUCTOR = 2 ;
F RESR = 3 ;
F RINDUCTOR = 4 ;
F DSON = 5 ;
F RDIODE = 6 ;
switch f a i l u r e
case F CAPACITOR
CAPACITOR = ( 5 3 4 e 6) ( 5 3 4 e 6) f ;
case F INDUCTOR
INDUCTOR = ( 5 0 0 . 9 e 6) ( 5 0 0 . 9 e 6) f ;
case F RESR
RESR = ( 0 . 0 8 2 e 0 ) + ( 1 0 ) f ;
case F RINDUCTOR
81
RINDUCTOR = ( 0 . 0 4 e 0 ) + ( 1 ) f ;
case F DSON
RDSON = ( 0 . 0 2 2 e 0 ) + ( 1 ) f ;
case F RDIODE
RDIODE = ( 0 . 1 e 0 ) + ( 1 ) f ;
otherwise
end
if i t e r a t i o n > 500
%RINDUCTOR = 2RINDUCTOR;
%CAPACITOR = 0 . 6 CAPACITOR ;
%INDUCTOR = 0 . 6 INDUCTOR;
%RESR = 5RESR ;
end
Rload = Vc/ I l o a d ;
cd = Rload / ( Rload + RESR) ;
if DutyState
A = [ ( ( RDSON RINDUCTOR cd RESR) /INDUCTOR) (cd /INDUCTOR) ; ( cd /CAPACITOR)
(cd / Rload /CAPACITOR) ] ;
B = [ ( Vin /INDUCTOR) ; ( 0 ) ] ;
else
A = [ ( ( RDIODE RINDUCTOR cd RESR) /INDUCTOR) (cd /INDUCTOR) ; ( cd /CAPACITOR)
(cd / Rload /CAPACITOR) ] ;
B = [( VDIODE/INDUCTOR) ; ( 0 ) ] ;
end
end
D.5 BuckObserver.m
f u n c t i o n [ IlOutObs VcOutObs VoutObs ] = BuckObserver ( I l , Vc , I l o b s , Vcobs , Iload , Iin ,
Vin , Time , D u t y S t a t e )
%C o n v e r t e r P a r a m e t e r s
ORESR =(0.082 e0 ) ;
ORDSON =(0.022 e0 ) ;
ORDIODE =(0.1 e0 ) ;
ORINDUCTOR = ( 0 . 0 4 e 0 ) ;
OINDUCTOR = ( 5 0 0 . 9 e 6) ;
OCAPACITOR =(534 e 6) ;
OVDIODE =(0.5137 e0 ) ;
Rload = Vcobs / I l o a d ;
cd = Rload / ( Rload + ORESR) ;
if DutyState
A = [ ( ( ORDSON ORINDUCTOR cd ORESR) /OINDUCTOR) (cd /OINDUCTOR) ; ( cd /
OCAPACITOR) (cd / Rload /OCAPACITOR) ] ;
B = [ ( Vin /OINDUCTOR) ; ( 0 ) ] ;
else
A = [ ( ( ORDIODE ORINDUCTOR cd ORESR) /OINDUCTOR) (cd /OINDUCTOR) ; ( cd /
OCAPACITOR) (cd / Rload /OCAPACITOR) ] ;
B = [( OVDIODE/OINDUCTOR) ; ( 0 ) ] ;
end
%d e b u g g i n g s t u f f
X0 = expm (ATime ) [ I l o b s ; Vcobs ] ;
X1 = expm ( 2 0 e y e ( 2 ) Time ) ( [ I l ; Vc ] [ I l o b s ; Vcobs ] ) ;
X2 = A 1(expm (ATime ) e y e ( 2 ) ) B ;
X = X0 + X1 + X2 ;
%X = expm (ATime ) [ I l o b s ; Vcobs ] + A 1(expm (ATime ) e y e ( 2 ) ) B + expm ( 2 0 e y e ( 2 ) Time )
( [ I l ; Vc ] [ I l o b s ; Vcobs ] ) ;
VoutObs = X( 2 ) + ORESR (X( 1 ) I l o a d ) ;
IlOutObs = X( 1 ) ;
VcOutObs = X( 2 ) ;
82
end
D.6 Bucksimulator.m
%l e t s s i m u l a t e a buck c o n v e r t e r now
RESR =(0.082 e0 ) ;
RDSON =(0.022 e0 ) ;
RDIODE =(0.1 e0 ) ;
RINDUCTOR =(0.04 e0 ) ;
INDUCTOR = ( 5 0 0 . 9 e 6) ;
CAPACITOR =(534 e 6) ;
VDIODE =(0.5137 e0 ) ;
83
o u t p u t ( k , 6 ) = VoutObs ;
end
subplot (3 ,3 ,1)
p l o t ( x , output ( : , 1 ) ) ;
t i t l e ( Inductor Current . A ) ;
xlabel ( Time (s) ) ;
ylabel ( A ) ;
subplot (3 ,3 ,2)
p l o t ( x , output ( : , 2 ) ) ;
t i t l e ( Capacitor Voltage V ) ;
xlabel ( Time (s) ) ;
ylabel ( V ) ;
subplot (3 ,3 ,3)
p l o t ( x , output ( : , 3 ) ) ;
t i t l e ( Output Voltage V ) ;
xlabel ( Time (s) ) ;
ylabel ( V ) ;
subplot (3 ,3 ,4)
p l o t ( x , output ( : , 4 ) ) ;
t i t l e ( Capacitor Observer Voltage V ) ;
xlabel ( Time (s) ) ;
ylabel ( V ) ;
subplot (3 ,3 ,5)
p l o t ( x , output ( : , 5 ) ) ;
t i t l e ( Inductor Observer Current A ) ;
xlabel ( Time (s) ) ;
ylabel ( A ) ;
subplot (3 ,3 ,6)
p l o t ( x , output ( : , 1 ) output ( : , 5 ) ) ;
t i t l e ( D i f f e r e n c e E q u a t i o n IL ) ;
xlabel ( Time (s) ) ;
ylabel ( A ) ;
subplot (3 ,3 ,7)
p l o t ( x , output ( : , 3 ) output ( : , 6 ) ) ;
t i t l e ( D i f f e r e n c e E q u a t i o n Vc ) ;
xlabel ( Time (s) ) ;
ylabel ( V ) ;
subplot (3 ,3 ,8)
p l o t ( output ( : , 1 ) output ( : , 5 ) , output ( : , 3 ) output ( : , 6 ) ) ;
xlabel ( Il Amps ) ;
ylabel ( Vc Volts ) ;
t i t l e ( D i f f e r e n c e E q u a t i o n s XY ) ;
D.7 errordynamics.m
%syms c l a m b d a c l a m b d a e s r l r d s o n r l r e s r l a m b d a l r e a l ;
%syms r d l a m b d a r d l a m b d a r d s o n r e a l ;
RESR =(0.082 e0 ) ;
RDSON =(0.022 e0 ) ;
RDIODE =(0.1 e0 ) ;
RINDUCTOR =(0.04 e0 ) ;
INDUCTOR = ( 5 0 0 . 9 e 6) ;
CAPACITOR =(534 e 6) ;
VDIODE =(0.5137 e0 ) ;
x = [1;5];
u =[10;2];
lambdaC = CAPACITOR 0 ;
lambdaL = INDUCTOR 0 ;
lambdaESR = RESR 2 ;
lambdaRl = RINDUCTOR 0 ;
lambdaRDSON = RDSON 0 ;
%o u t p u t cap f a u l t
84
Eb1c = [ 0 0 ; 0 ( 1 / (CAPACITOR + lambdaC ) ) ] ;
Eb2c = Eb1 ;
%A m a t r i x e r r o r a t t i m e t
t = 1/100000.5;
%expm ( Ea1c t ) x ;
%expm ( Eb1c t ) u ;
%E s r F a u l t
E a 1 e s r = [lambdaESR/INDUCTOR 0 ; 0 0];
Ea2esr = Ea1esr ;
E b 1 e s r = [ 0 lambdaESR/INDUCTOR; 0 0];
Eb2esr = Eb1esr ;
expm ( E a 1 e s r t ) x
expm ( E b 1 e s r t ) u
D.8 parametervariations.m
%l e t s s i m u l a t e a buck c o n v e r t e r now
capacitornoiseprofile = 0.0076;
inductornoiseprofile = 0.0323;
F NONE = 0 ;
F CAPACITOR = 1 ;
F INDUCTOR = 2 ;
F RESR = 3 ;
F RINDUCTOR = 4 ;
F DSON = 5 ;
F RDIODE = 6 ;
Vset = 5 ;
Vc = 5 ;
Vout = 5 . 0 ;
I l = 2;
Vcobs = 5 ;
Ilobs = 2;
Rload = 2 . 5 ;
Vin = 1 0 ;
DutyState = 1 ;
Rload = 2 ;
Iin = 0;
CurrentTime = 0 ;
PIcontrol = 0.5429;
for Vset = 2 : 1 : 8
%f o r Rload = 1 : 1 : 1 0
I l o a d = Vc/ Rload ;
f o r k = 1 : LOOPSIZE
85
[ I l O u t VcOut Vout ] = B u c k c o n v e r t e r ( I l , Vc , I l o a d , I i n , Vin , Time ,
DutyState , k , f , f a i l u r e ) ;
[ IlOutObs VcOutObs VoutObs ] = BuckObserver ( I l , Vc , I l o b s , Vcobs , I l o a d ,
I i n , Vin , Time , D u t y S t a t e ) ;
x ( k ) = CurrentTime ;
%do a v o l t a g e s e t p o i n t c h a n g e t o s e e how t h e c o n v e r t e r r e a c t s
%i f k == 500
% Vset = 7 ;
%end
i f DutyState
Time = P e r i o d P I c o n t r o l P e r i o d ;
DutyState = 0 ;
else
P I c o n t r o l = P I c o n t r o l + 3 0 ( ( V s e t VcOut ) ) P e r i o d ;
i f P I c o n t r o l >= 0 . 9 7
PIcontrol = 0.97;
else i f PIcontrol < 0.00
PIcontrol = 0.00;
end
end
Time = P I c o n t r o l P e r i o d ;
DutyState = 1 ;
end
CurrentTime = CurrentTime + Time ;
I l = IlOut ;
Vc = VcOut ;
I l o b s = IlOutObs ;
Vcobs = VcOutObs ;
I l o a d = Vc/ Rload ;
output ( k , 1 ) = I l ;
o u t p u t ( k , 2 ) = Vc ;
o u t p u t ( k , 3 ) = Vout ;
o u t p u t ( k , 4 ) = Vcobs ;
output ( k , 5 ) = I l o b s ;
o u t p u t ( k , 6 ) = VoutObs ;
end
%s u b p l o t ( 1 , 2 , 1 )
h o l d on ;
%p l o t ( o u t p u t (LOOPSIZE1 ,1) o u t p u t ( LOOPSIZE1 ,5) , o u t p u t (LOOPSIZE1 ,3)
o u t p u t ( LOOPSIZE1 ,6) , * , C o l o r , [ f ,1 f , 0 ] , M a r k e r S i z e ,11 Rload ) ;
%p l o t ( o u t p u t (LOOPSIZE2 ,1) o u t p u t ( LOOPSIZE2 ,5) , o u t p u t (LOOPSIZE2 ,3)
o u t p u t ( LOOPSIZE2 ,6) , o , C o l o r , [ f ,1 f , 0 ] , M a r k e r S i z e ,11 Rload ) ;
%p l o t ( o u t p u t (LOOPSIZE1 ,1) o u t p u t ( LOOPSIZE1 ,5) , o u t p u t (LOOPSIZE1 ,3)
o u t p u t ( LOOPSIZE1 ,6) , * , C o l o r , [ f ,1 f , 0 ] , M a r k e r S i z e , V s e t ) ;
%p l o t ( o u t p u t (LOOPSIZE2 ,1) o u t p u t ( LOOPSIZE2 ,5) , o u t p u t (LOOPSIZE2 ,3)
o u t p u t ( LOOPSIZE2 ,6) , o , C o l o r , [ f ,1 f , 0 ] , M a r k e r S i z e , V s e t ) ;
p l o t ( o u t p u t ( LOOPSIZE1 ,1) o u t p u t ( LOOPSIZE1 ,5) , o u t p u t (LOOPSIZE1 ,3)
o u t p u t ( LOOPSIZE1 ,6) , * , C o l o r , [ f a i l u r e /6 ,1 f a i l u r e / 6 , 0 ] , M a r k e r S i z e
,5) ;
p l o t ( o u t p u t ( LOOPSIZE2 ,1) o u t p u t ( LOOPSIZE2 ,5) , o u t p u t (LOOPSIZE2 ,3)
o u t p u t ( LOOPSIZE2 ,6) , o , C o l o r , [ f a i l u r e /6 ,1 f a i l u r e / 6 , 0 ] , M a r k e r S i z e
,5) ;
end
c i r c l e = rsmak ( c i r c l e ) ;
e l l i p s e = fncmb ( c i r c l e , [ i n d u c t o r n o i s e p r o f i l e 0;0 capacitornoiseprofile ]) ;
fnplt ( ellipse ) ;
xlabel ( Il Amps ) ;
ylabel ( Vc Volts ) ;
86
switch f a i l u r e
case F CAPACITOR
t i t l e ( Capacitor fault Difference Equations ) ;
case F INDUCTOR
t i t l e ( Inductor fault Difference Equations ) ;
case F RESR
t i t l e ( ESR fault Difference Equations ) ;
case F RINDUCTOR
t i t l e ( R Inductor fault Difference Equations ) ;
case F DSON
t i t l e ( RDSON fault Difference Equations ) ;
case F RDIODE
t i t l e ( R Diode fault Difference Equations ) ;
otherwise
end
end
87
REFERENCES
[2] R. Peuget, S. Courtine, and J.-P. Rognon, Fault detection and isolation
on a PWM inverter by knowledge-based model, IEEE Transactions on
Industry Applications, vol. 34, no. 6, pp. 13181326, Nov./Dec. 1998.
88
[9] R. Beard, Failure accommodation in linear systems through self-
reorganization, Man Vehicle Laboratory, Massachusetts Institute of
Technology, Cambridge, MA, Tech. Rep. MVT-71-1, 1971.
89
[21] C. Moler and C. Loan, Nineteen dubious ways to compute the exponen-
tial of a matrix, twenty-five years later, SIAM Review, vol. 45, no. 1,
pp. 349, 2003.
90