Diplomarbeit.pdf
Diplomarbeit.pdf
Diplomarbeit.pdf
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Regelung eines Aktiven Filters zur Reduzierung der<br />
Netzrückwirkungen einer Windenergieanlage<br />
Technische Universität Berlin<br />
Institut für Elektrische Energietechnik<br />
Fachgebiet Elektrische Maschinen und Antriebe<br />
Prof. Dr.-Ing. M. Stiebler<br />
Betreuer: Dipl.-Ing. J.H. Carstens<br />
8. Juni 2000<br />
<strong>Diplomarbeit</strong><br />
von<br />
Christoph Saniter
Erklärung<br />
Hiermit versichere ich an Eides Statt, daß die vorliegende Arbeit mit dem Thema “Regelung eines Aktiven<br />
Filters zur Reduzierung der Netzrückwirkungen einer Windenergieanlage” von mir selbstständig und eigenhändig<br />
angefertigt wurde.<br />
Alle verwendeten Quellen und Hilfsmittel sind angegeben. Die Arbeit wurde in dieser oder anderer Form noch<br />
keiner anderen Prüfungsbehörde vorgelegt und von dieser als Teil einer Prüfungsleistung angenommen.<br />
Berlin, den 8. Juni 2000<br />
Ich möchte mich ganz herzlich bei all denen bedanken, die mich bei der Erstellung dieser Arbeit unterstützt<br />
und ermuntert haben.<br />
2
Zusammenfassung<br />
Die installierte Leistung von regenerativen Energieerzeugern und leistungselektronisch geregelten Antrieben hat<br />
in den letzten Jahren stark zugenommen. Dadurch wurden die ungleichmäßige Energieabgabe von Energieerzeugern,<br />
Netzoberschwingungen sowie der Blindleistungsbedarf von leistungselektronischen Schaltungen zu einem<br />
zunehmenden Problem in Mittel- und Niederspannungsnetzen. Um diesem Problem zu begegnen, sind in der<br />
Vergangenheit zahlreiche aktive Netzfilter in Reihenschaltung oder Parallelschaltung zum Netz untersucht und<br />
eingesetzt worden.<br />
In dieser Arbeit wird ein zum Netz paralleles aktives Filter mit einer für aktive Netzfilter neuen Regelstrategie,<br />
einer sogenannten Dead Beat Regelung, untersucht. Das Filter hat eine Nennleistung von 15kVA.<br />
Die Regelung des Stromes erfolgt in einem synchron umlaufenden Bezugssystem. Durch die Transformation<br />
wird die ehemals oszillierende Führungsgröße eine Gleichgröße, und verbessert so das stationäre Verhalten des<br />
Reglers.<br />
Der Regelalgorithmus ist in einem Siemens SAB 80C167 Microcontroller implementiert. Die Effektivität des<br />
Dead Beat Reglers wird durch einen Vergleich mit einem PI-, einem PID 2 - und einem Zustandsregler belegt.<br />
Sowohl Simulationsergebnisse mit Maltlab/Simulink als auch experimentelle Ergebnisse mit den realisierten<br />
Regelalgorithmen werden dargestellt und durch eine Analyse geeigneter Abtastfrequenzen ergänzt.<br />
Das aktive Filter ist Teil eines für eine Windenergieanlage entwickelten Energiemanagements. Aufgrund der<br />
komplexen Struktur des Gesamtsystems und der zahlreichen damit verbundenen Rechnungen kommen insgesamt<br />
drei Microcontroller zum Einsatz. Für die Kommunikation der drei Controller wurde eine Multi-Controller<br />
Kommunikation entwickelt.<br />
Abstract<br />
It is well established that harmonic currents drawn by power electronic loads such as electrical motor drives have<br />
a number of detrimental effects. To overcome this problem, various series and shunt active filters have been<br />
discussed.<br />
This paper evaluates an advanced control technique for use with a 15 kVA shunt active filter, a so called dead-beat<br />
controller.<br />
The current control is carried out in a synchronously rotating reference frame. Thus the previously oscillatory<br />
current reference is now transformed to a d.c. value, thereby improving the steady state performance of the<br />
controller.<br />
The control algorithm is implemented on a Siemens SAB 80C167 microcontroller. The effectiveness of this<br />
technique is verified in comparing the dead-beat controller with a conventional PI controller, a PID 2 controller<br />
and a state space controller.<br />
Both computer simulation results using Matlab/Simulink and experimental results are presented and completed<br />
with an analysis of suitable sample frequencies.<br />
The active filter is only part of a energy management for a wind power converter. Due to the complex nature<br />
of the whole system and various calculations three controllers are required. Consequently a multi-controller<br />
communication was developed.<br />
3
Inhaltsverzeichnis<br />
Verwendete Formelzeichen 7<br />
1. Einleitung 9<br />
1.1. Ziel der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
1.2. Gliederung der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />
I. Grundlagen 12<br />
2. Funktionsweise und Aufbau des aktiven Filters 13<br />
2.1. Der Wechselrichter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
3. Darstellung der dreiphasigen Ströme und Spannungen 16<br />
3.1. Raumzeiger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
3.2. αβ-Koordinatentransformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
3.3. dq-Koordinatentransformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
4. Aktive Filter - ein Überblick 21<br />
4.1. Aktive Filter ohne Regelung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />
4.1.1. Berechnung des Kompensationsstroms durch Eliminierung der Grundschwingung mittels<br />
Notch Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />
4.1.2. Berechnung des Kompensationsstroms aus der momentanen Wirk- und Blindleistung in<br />
αβ-Koordinaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />
4.1.3. Berechnung des Kompensationsstroms in dq-Koordinaten . . . . . . . . . . . . . . . . 23<br />
4.1.4. Gezielte Elimination der Oberschwingungen durch den Einsatz von pll’s . . . . . . . . . 24<br />
4.1.5. Gezielte Elimination der Oberschwingungen mittels FFT . . . . . . . . . . . . . . . . 24<br />
4.2. Aktive Filter mit Regelung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />
4.2.1. PI-Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />
4.2.1.1. PI-Regler ohne Koordinatentransformation . . . . . . . . . . . . . . . . . . . 25<br />
4.2.1.2. PI-Regler mit dq-Koordinatentransformation . . . . . . . . . . . . . . . . . . 25<br />
4.2.2. Fuzzy-Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
4.2.3. Zustandsregler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
II. Implementierung der Regelung des aktiven Netzfilters 27<br />
4
5. Auslegung der Regler 28<br />
5.1. Herleitung der mathematischen Zusammenhänge am aktiven Filter . . . . . . . . . . . . . . . . 28<br />
5.2. Das aktive Filter unter regelungstechnischen Gesichtspunkten . . . . . . . . . . . . . . . . . . . 29<br />
5.3. Aufstellen der Systemgleichungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30<br />
5.4. Störgrößenkompensation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />
5.5. Zeitkontinuierliche Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />
5.5.1. PI-Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />
5.5.2. PID 2 -Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
5.6. Zeitdiskrete Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
5.6.1. Entwurf des digitalen Reglers durch Übergang vom s- in den z-Bereich . . . . . . . . . 37<br />
5.6.1.1. PI-Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />
5.6.1.2. PID 2 -Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />
5.6.2. Digitales Entwurfsverfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />
5.6.2.1. Diskretisierung der Strecke . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />
5.6.2.2. Dead Beat Reglerentwurf . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />
5.6.2.3. Darstellung des diskreten PI-, diskreten PID 2 - und Dead Beat Reglers im Bodediagramm<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />
5.6.2.4. Diskretisierung der Störgrößenaufschaltung . . . . . . . . . . . . . . . . . . 40<br />
5.7. Vergleich der digitalen Regler anhand der Sprungantwort des geschlossenen Regelkreises . . . . 41<br />
5.8. Simulation des Regelkreises mit Simulink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />
5.8.1. Vergleich der Regler in der Simulation . . . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />
5.8.2. Einfluss der Störgrößenkompensation . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
5.8.3. Auswertung der Simulation mit Simulink . . . . . . . . . . . . . . . . . . . . . . . . . 44<br />
5.9. Einfluß einer höheren Abtastfrequenz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />
5.10. Zusammenfassung des Kapitels 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />
6. Realisierung der Regelung mit einem Microcontroller 48<br />
6.1. Übergang aus dem z- in den Zeitbereich . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />
6.2. Abweichungen der realisierten Regelalgorithmen von der Theorie . . . . . . . . . . . . . . . . 49<br />
6.3. Das Programm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />
6.3.1. globals.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />
6.3.2. main.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />
6.3.3. adc.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />
7. Meßergebnisse 52<br />
7.1. Reduzierte Netz- und Zwischenkreisspannung . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />
7.1.1. PI-Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />
7.1.1.1. Stromeinspeisung in das Netz ohne Laststrom . . . . . . . . . . . . . . . . . 53<br />
7.1.1.2. Stromeinspeisung in das Netz mit sinusförmigem Laststrom . . . . . . . . . . 53<br />
7.1.1.3. Stromeinspeisung in das Netz mit einer B6 Brücke mit angeschlossener Induktivität<br />
als Last . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54<br />
7.1.2. Dead Beat Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55<br />
5
7.1.2.1. Stromeinspeisung in das Netz ohne Laststrom . . . . . . . . . . . . . . . . . 55<br />
7.1.2.2. Stromeinspeisung in das Netz mit sinusförmigem Laststrom . . . . . . . . . . 56<br />
7.1.2.3. Stromeinspeisung in das Netz mit einer B6 Brücke mit angeschlossener Induktivität<br />
als Last . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57<br />
7.1.3. Zustandsregler ohne Laststrom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57<br />
7.1.4. Zusammenfassung der Meßergebnisse mit reduzierten Spannungen . . . . . . . . . . . 57<br />
7.2. Nennbetrieb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59<br />
7.2.1. Oberschwingungsbehaftete Netzspannung . . . . . . . . . . . . . . . . . . . . . . . . . 60<br />
7.2.1.1. Laststrom durch zum Stern geschaltete Widerstände mit Netzspannung . . . . 60<br />
7.2.1.2. Stromeinspeisung in das Netz ohne Laststrom . . . . . . . . . . . . . . . . . 61<br />
7.2.2. Sinusspannung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61<br />
7.2.2.1. Laststrom durch zum Stern geschaltete Widerstände mit Sinusspannung . . . 62<br />
7.2.2.2. Stromeinspeisung in ein Netz mit Sinusspannung ohne Laststrom . . . . . . . 63<br />
7.2.3. Zusammenfassung der Meßergebnisse mit Nennspannung . . . . . . . . . . . . . . . . 65<br />
III. Multi-Controller-System 67<br />
8. Anforderungen und Aufgabenstellung 68<br />
8.1. Die synchrone serielle Schnittstelle SSC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />
8.1.1. Die Funktionsweise der SSC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70<br />
8.1.2. Realisierung der Datenübertragung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71<br />
9. Zusammenfassung und Ausblick 73<br />
IV. Anhang 75<br />
A. Sourcecode 76<br />
A.1. globals.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76<br />
A.2. main.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83<br />
A.3. main.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93<br />
A.4. adc.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94<br />
A.5. adc.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112<br />
A.6. master.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114<br />
A.7. slave.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121<br />
A.8. seriell.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126<br />
B. Simulationsfiles 128<br />
B.1. dq_ab_simulation.m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130<br />
B.2. reglerdesign.m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133<br />
B.3. modell.mdl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141<br />
6
Verwendete Formelzeichen<br />
s¡<br />
z¡<br />
s¡<br />
z¡<br />
s¡<br />
z¡<br />
s¡<br />
z¡<br />
s¡<br />
z¡<br />
Cαβ Transformationsmatrix für die αβ-Transformation aus den UVW-Koordinaten<br />
Cdq<br />
Transformationsmatrix für die dq-Transformation aus den UVW-Koordinaten<br />
d,q Achsenbezeichnung des mit ω rotierenden Bezugssystemes<br />
fSchalt<br />
Schaltfrequenz der IGBT’s<br />
fTast<br />
Abtastfrequenz des digitalen Reglers<br />
G Übertragungsfunktion des geschlossenen Regelkreises, zeitkontinuierlich<br />
GDB<br />
Übertragungsfunktion des Dead Beat Reglers<br />
GL&R<br />
Übertragungsfunktion der Kopplungsinduktivität, zeitkontinuierlich<br />
GL&R<br />
Übertragungsfunktion der Kopplungsinduktivität, diskret<br />
GL&Rkomp Kompensationsübertragungsfunktion der Kopplungsinduktivität, zeitkontinuierlich<br />
GL&Rkomp Kompensationsübertragungsfunktion der Kopplungsinduktivität, diskret<br />
GMess<br />
Übertragungsfunktion der Messeinrichtung, zeitkontinuierlich<br />
GMess<br />
Übertragungsfunktion der Messeinrichtung, diskret<br />
GPI<br />
Übertragungsfunktion des zeitkontinuierlichen PI-Reglers<br />
Übertragungsfunktion des diskreten PI-Reglers<br />
s¡<br />
z¡<br />
GPI<br />
G 2 PID<br />
G 2 PID<br />
2 Übertragungsfunktion des zeitkontinuierlichen PID -Reglers<br />
2 Übertragungsfunktion des diskreten PID -Reglers<br />
s¡<br />
s¡<br />
z¡<br />
s¡<br />
z¡<br />
iCU¢ CV¢<br />
LV¢ iLU¢<br />
NV¢ iNU¢<br />
Gs<br />
Übertragungsfunktion des offenen Kreises, zeitkontinuierlich<br />
GWR<br />
Übertragungsfunktion des Wechselrichters, zeitkontinuierlich<br />
GWR<br />
Übertragungsfunktion des Wechselrichters, diskret<br />
GWRkomp Kompensationsübertragungsfunktion des Wechselrichters, zeitkontinuierlich<br />
GWRkomp Kompensationsübertragungsfunktion des Wechselrichters, diskret<br />
I Stromraumzeiger allg.<br />
iα, iβ, iαβ Ströme in den αβ-Koordinaten<br />
CW Kompensationsströme<br />
id, iq, idq Ströme in den dq-Koordinaten<br />
LW Ströme der Windenergieanlage<br />
NW Netzströme<br />
iU, iV, iW,iUVW Ströme im Dreiphasensystem allg.<br />
KL&Rω Proportionalanteil der Übertragungsfunktion der Kopplungsinduktivität<br />
KL&Rkomp Proportionalanteil der Kompensationsübertragungsfunktion der Kopplungsinduktivität<br />
KMess<br />
Proportionalanteil der Übertragungsfunktion der Meßstrecke<br />
KMessω Proportionalanteil der Übertragungsfunktion der Meßstrecke (alternative Darstellung)<br />
KV<br />
Proportionalanteil der Übertragungsfunktion des Wechselrichters<br />
L Kopplungsinduktivität<br />
R Ohmscher Anteil der Kopplungsinduktivität<br />
Tges, T0, T1, T2 Dauer der PWM Signale<br />
U Spannungsraumzeiger allg.<br />
uα, uβ Spannungen in αβ-Koordinaten<br />
Ud<br />
Zwischenkreisspannung<br />
Netzspannung in dq-Koordinaten<br />
UNq, UNd<br />
7
NV¢ NW uNU¢<br />
UWRq, UWRd<br />
uWRU¢ WRV¢ WRW<br />
Netzspannungen im Dreiphasensystem<br />
Wechselrichterausgangsspannung in dq-Koordinaten<br />
Wechselrichterausgangsspannung in UVW-Koordinaten<br />
β Achsen des orthogonalen, ortsfesten Bezugssystemes<br />
α£<br />
ΔUdq<br />
Spannungsdifferenz an der Kopplungsinduktivität in dq-Koordinaten<br />
V¢ W Spannungsdifferenz an der Kopplungsinduktivität in UVW-Koordinaten<br />
ΔUU¢<br />
φ Phasenwinkel zwischen Strom und Spannung<br />
θ Winkel zwischen dem ortsfesten und dem mit ω rotierenden Bezugssystem<br />
τPI<br />
Zeitkonstante der Übertragungsfunktion des PI-Reglers, zeitkontinuierlich<br />
τR1, τR2 Zeitkonstanten der Übertragungsfunktion des PID2-Reglers, zeitkontinuierlich<br />
τMess<br />
Zeitkonstante der Übertragungsfunktion der Messeinrichtung<br />
τ1WR, τ2WR Zeitkonstanten der Übertragungsfunktion des Wechselrichters<br />
ω Winkelgeschwindigkeit des rotierenden Bezugssystemes<br />
ωD<br />
Durchtrittsfrequenz im Bodediagramm<br />
ωL&R<br />
Grenzfrequenz der Übertragungsfunktion der Kopplungsinduktivität<br />
ωWR1, ωWR2 Grenzfrequenz der Übertragungsfunktion des Wechselrichters<br />
Grenzfrequenz der Übertragungsfunktion der Messeinrichtung<br />
ωMess<br />
8
1. Einleitung<br />
Die installierte Leistung von regenerativen Energieerzeugern und leistungselektronisch geregelten Antrieben hat<br />
in den letzten Jahren stark zugenommen. Dadurch wurde die ungleichmäßige Energieabgabe von Energieerzeugern,<br />
wie z.B. Windenergieanlagen, Netzoberschwingungen sowie der Blindleistungsbedarf von leistungselektronischen<br />
Schaltungen, wie z.B. netzgeführten Stromrichtern, zu einem zunehmenden Problem in Mittel- und<br />
Niederspannungsnetzen. Es steigt die Notwendigkeit, geeignete Maßnahmen zu ergreifen, um die Netzrückwirkungen<br />
der o.a. Anlagen wirksam zu reduzieren, damit keine negative Beeinflussung Dritter z.B. durch Flicker 1<br />
oder eine verkürzte Lebensdauer von elektronischen Geräten erfolgt.<br />
Eine weit verbreitete Lösung besteht im Anschluß passiver RLC Elemente zur Oberschwingungs- und Blindleistungskompensation.<br />
Dieses kann unerwünschte Effekte mit sich bringen, wie z.B. eine Überkompensation oder<br />
Oberschwingungsprobleme durch Resonanzen. Außerdem wird in den passiven Elementen die herausgefilterte<br />
Leistung in Wärme umgesetzt, also nicht sinnvoll genutzt. Insbesondere die Vermeidung von Flicker, der bei der<br />
Energieerzeugung mit Windenergieanlagen entstehen kann, ist mit passiven Filtern nicht möglich.<br />
Eine wirkungsvolle Methode, diese Probleme zu umgehen, besteht im Einsatz aktiver Filter mit Energiespeicher.<br />
Diese sind in der Lage sowohl kurzfristige Leistungsschwankungen auszugleichen, d.h. Oberschwingungen zu<br />
kompensieren, als auch langfristig Leistung abzugeben bzw. aufzunehmen, und damit z.B. den Blindleistungsbedarf<br />
von Lasten zu kompensieren. Ein solches aktives Filter kann auf zwei verschiedene Arten an das Netz<br />
angeschlossen werden:<br />
1. In Reihe, gemäß Abbildung 1.1 a)<br />
2. Parallel, gemäß Abbildung 1.1 b).<br />
Wird der Strom in ein starkes Netz mit sinusförmiger Spannung eingespeist, so muß das aktive Filter in der Lage<br />
sein, den Laststrom so zu beeinflussen, daß der Netzstrom iNU¢ NV¢ NW sinusförmig und mit einem frei einzustellenden<br />
Phasenwinkel φ (bzw. cosφ) bzgl. der Netzspannung uNU¢ NV¢ NW verläuft. Das Filter verhält sich dann wie<br />
eine gesteuerte Stromquelle. Sowohl die Parallelschaltung als auch die Reihenschaltung des Filters mit dem Netz<br />
ermöglichen es, einen sinusförmigen Netzstrom mit beliebigem Phasenwinkel zu erzeugen.<br />
Wird das Filter in Reihe zur Last bzw. zum Energieerzeuger geschaltet, so muß es den gesamten Laststrom<br />
führen. Ein parallel angeschlossenes aktives Filter hingegen kann sehr viel kleiner ausgelegt werden. Es muß<br />
nur die notwendigen Kompensationssströme iCU¢ CV¢ CW liefern, um die nicht sinusförmigen und mit einem beliebigen<br />
Phasenwinkel versehenen Lastströme zu dem gewünschten Netzstrom zu ergänzen. Ein solches Filter ist<br />
erheblich günstiger und einfacher zu dimensionieren. Aus diesen Gründen ist es in der Vergangenheit vielfach<br />
eingesetzt worden.<br />
Zusätzlich kann noch ein passives Filter, gewöhnlich als Saugkreis ausgeführt, mit angeschlossen werden. Zusammen<br />
mit einem aktiven Filter wird es erheblich kleiner dimensioniert, als wenn es als alleinige Kompensationseinrichtung<br />
diente. Zudem kann es gezielt auf z.B. die fünfte und siebte Oberschwingung abgestimmt<br />
werden.<br />
Ein zum Netz paralleles aktives Filter ist die Grundlage für diese <strong>Diplomarbeit</strong>.<br />
1 Flicker wird durch Änderungen der Netzspannung hervorgerufen. Der Name kommt daher, daß Schwankungen in der Netzspannung<br />
ein “Flickern” von Glühlampen verursacht (vgl. [1, S. 280]).<br />
9
Netz<br />
i NU,NV,NW<br />
Filter<br />
aktiv<br />
Filter<br />
passiv<br />
i LU,LV,LW<br />
Windenergieanlage<br />
Netz<br />
i NU,NV,NW<br />
i CU,CV,CW<br />
Filter Filter<br />
aktiv<br />
passiv<br />
i LU,LV,LW<br />
Windenergieanlage<br />
a) Anschluß des aktiven Filters in Reihe b) Anschluß des aktiven Filters parallel<br />
1.1. Ziel der Arbeit<br />
Abbildung 1.1.: Anschlußmöglichkeiten aktiver Filter an das Netz<br />
Im Rahmen dieser <strong>Diplomarbeit</strong> soll ein im Zusammenhang mit aktiven Netzfiltern neuer Regelalgorithmus, eine<br />
sogenannte Dead Beat Regelung, für ein aktives Netzfilter zur Reduzierung der Netzrückwirkungen einer Windenergieanlage<br />
entwickelt und getestet werden. Das Filter ist parallel zum Netz angeschloßen. Durch geeignete<br />
Energieaufnahme bzw. -abgabe soll das Filter die Leistungsabgabe einer Windenergieanlage vergleichmäßigen.<br />
Um die Qualität des entworfenen Dead Beat Reglers zu beurteilen und Aussagen bezüglich geeigneter Abtastfrequenzen<br />
für die Regelung aktiver Filter im Allgemeinen zu treffen, werden auch ein PI- sowie ein PID 2 -Regler<br />
entworfen und getestet. Mittels Simulation unter Matlab/Simulink werden die verschiedenen Regelstrategien<br />
analysiert, bevor sie dann in der Praxis untersucht werden. Der Test erfolgt zunächst mit reduzierter Netz- sowie<br />
Zwischenkreisspannung, bevor das Filter dann mit Nennspannung getestet wird.<br />
Die Arbeit baut auf der von J. Carstens [2], C. Riefle [3] und T. Sadowski [4] entworfenen und realisierten Anlage<br />
gemäß Abbildung 1.2 auf. Bei dem aktiven Filter handelt es sich um einen Pulswechselrichter mit IGBT’s 2 (in<br />
Abbildung 1.2 vereinfacht durch Schalter dargestellt) und Gleichspannungszwischenkreis. Der Zwischenkreis ist<br />
über einen DC/DC-Steller mit Akkumulatoren als Energiespeicher verbunden.<br />
In der Arbeit soll zusätzlich eine Multi-Controller-Kommunikation entwickelt werden. Dies wird notwendig, da<br />
die gesamte Anlage ein sehr komplexes System mit zahlreichen rechenintensiven Regelungen ist. Ein einzelner<br />
Controller ist nicht in der Lage, die Regelungen mit der notwendigen Geschwindigkeit durchzuführen.<br />
Der gestrichelt dargestellte Teil wird im Rahmen dieser Arbeit nicht weiter behandelt, da er bereits in [2], [3] und<br />
[4] ausführlich beschrieben ist.<br />
Batteriespeicher<br />
Microcontroller I<br />
2 Insulated Gate Bipolar Transistor<br />
DC/DC<br />
Steller<br />
Microcontroller II<br />
Microcontroller III<br />
mit<br />
Regelalgorythmus<br />
Ud<br />
ϕ +U d<br />
ϕ<br />
S1<br />
S S<br />
3 5<br />
S S S<br />
4 6 2<br />
ΔU<br />
U<br />
U U U<br />
WR U WR V WR W<br />
IcU L<br />
ΔU<br />
V<br />
I cV<br />
L<br />
ΔU<br />
W<br />
IcW L<br />
R R R<br />
U<br />
N U<br />
Abbildung 1.2.: Aufbau des Filters<br />
10<br />
U<br />
N V<br />
U<br />
N W
1.2. Gliederung der Arbeit<br />
In Teil I werden in Kapitel 2 und 3 die Grundlagen für das Verständnis aktiver Filter vorgestellt. Dazu gehört<br />
der Aufbau des aktiven Filters, die Funktionsweise eines Pulswechselrichters sowie die verwendeten Koordinatentransformationen.<br />
In Kapitel 4 wird ein Überblick über die bisher veröffentlichten Regelstrategien für aktive<br />
Netzfilter gegeben.<br />
In Teil II werden in Kapitel 5 die Entwurfsverfahren für die in dieser Arbeit realisierten Regler erläutert sowie<br />
die mathematischen Zusammenhänge am aktiven Filter dargestellt. Kapitel 6 beinhaltet, wie die entworfenen<br />
Regelalgorithmen in einem Microcontroller implementiert werden können und welche Vorgehensweise dafür<br />
notwendig ist. Im Kapitel 7 werden die experimentellen Ergebnisse dargestellt und diskutiert.<br />
In Teil III wird die entworfene Multi-Controller Kommunikation über die synchrone serielle Schnittstelle dargestellt.<br />
In Teil IV, dem Anhang, sind die vollständigen Sourcecodes der Regelung und der Kommunikation sowie die<br />
Simulationsfiles dargestellt.<br />
11
Teil I.<br />
Grundlagen<br />
12
2. Funktionsweise und Aufbau des aktiven Filters<br />
Wie bereits in der Einleitung erörtert, handelt es sich bei dem aktiven Filter um einen Pulswechselrichter mit<br />
IGBT’s und Gleichspannungszwischenkreis. Das Filter arbeitet als aktive Stromquelle bzw. -senke und ist gemäß<br />
Abbildung 1.2 an das Netz angeschlossen.<br />
Die Funktionsweise wird im Folgenden kurz erläutert:<br />
Am Ausgang des Filters wird zu jedem Zeitpunkt eine Spannung mittels Pulsweitenmodulation eingestellt. Wird<br />
das Filter über eine Kopplungsinduktivität L an das Netz angeschlossen, so stellt sich ein Strom iCU£ iCV£ iCW<br />
entsprechend der momentanen Spannungsdifferenz ΔuU£ ΔuV£ ΔuW zwischen der Filterausgangsspannung uWRU,<br />
uWRV, uWRW und der Netzspannung uNU£ uNV£ uNW ein. Die Filterspannung wird von einem Pulswechselrichter<br />
mit Gleichspannungszwischenkreis mit IGBT’s bereitgestellt. Um zu jedem Augenblick die gewünschte Spannung<br />
bereitzustellen, werden die IGBT’s von einem Microcontroller angesteuert. Dieser enthält u.a. den zu<br />
entwickelnden Regelalgorithmus. Die Regelung erfolgt in einem synchron mit Netzfrequenz rotierenden Koordinatensystem,<br />
den dq-Koordinaten.<br />
2.1. Der Wechselrichter<br />
Bei dem verwendeten Wechselrichter handelt es sich um einen Pulswechselrichter mit Gleichspannungszwischenkreis<br />
mit IGBT’s und antiparallelen Dioden. Die dafür benötigten sechs IGBT’s und sechs Dioden sind in<br />
einem IPM 1 untergebracht. Das IPM ermöglicht u.a. eine Übertemperatur- und Überstromerkennung, so daß es<br />
im Fehlerfall selbsttätig das Filter von dem Netz trennt und eine Fehlermeldung an den Controller sendet.<br />
Die prinzipielle Schaltung ist Bild 2.1 zu entnehmen. Die IGBT’s sind der Übersichtlichkeit halber durch Schalter<br />
ersetzt. Da nie zwei Schalter eines Zweiges gleichzeitig eingeschaltet sein dürfen, ergeben sich insgesamt 2 3 = 8<br />
verschiedene Schaltzustände. Diese sind in Tabelle 2.1 zusammengefaßt.<br />
Schaltzustand U V W U S1 S2 S3 S4 S5 S6<br />
0 - - - 0 aus ein aus ein aus ein<br />
1 + - - ûe j00 ein aus aus ein aus ein<br />
2 + + - ûe j600 ein aus ein aus aus ein<br />
3 - + - ûe j1200 aus ein ein aus aus ein<br />
4 - + + ûe j1800 aus ein ein aus ein aus<br />
5 - - + ûe j2400 aus ein aus ein ein aus<br />
6 + - + ûe j3000 ein aus aus ein ein aus<br />
7 + + + 0 ein aus ein aus ein aus<br />
Tabelle 2.1.: Schaltzustände der IGBT’s<br />
Dabei wird durch “+” gekennzeichnet, daß die entsprechende Phase das Potential ϕ ¤ Ud hat, und durch “-“, daß<br />
die Phase das Potential ϕ hat. Ud bezeichnet die Spannung des Gleichspannungszwischenkreises.<br />
1 Intelligent Power Module<br />
13
U<br />
ϕ<br />
d<br />
+U d<br />
ϕ<br />
S1 S S<br />
3 5<br />
S S S<br />
4 6 2<br />
U<br />
WRU<br />
U<br />
WRV<br />
U<br />
WRW<br />
Abbildung 2.1.: Dreiphasiger Wechselrichter in Brückenschaltung mit induktiver Last<br />
Wird der Wechselrichter aus Abbildung 2.1 symmetrisch angesteuert, ergeben sich die acht Spannungsraumzeiger<br />
aus Bild 2.2. Die in Tabelle 2.1 zusammengestellten Schaltstufen sind binär 2 von 0 bis 7gekennzeichnet und<br />
den entsprechenden Spannungsraumzeigern zugewiesen. Es ist zu beachten, daß die Schaltzustände 0 und 7<br />
identisch sind, da in diesen entweder alle oberen oder alle unteren IGBT’s durchgeschaltet sind. In diesen Fällen<br />
liegt effektiv keine Spannung an den Ausgangsklemmen an. Diese beiden Zustände werden auch als Nullzeiger<br />
bezeichnet.<br />
Kreis für die maximale konstante Spannung des Raumzeigers<br />
(011)<br />
(010) (110)<br />
Sektor III<br />
Sektor IV<br />
Sektor II<br />
(111)<br />
60°<br />
Sektor I<br />
__ 1<br />
3 Ud<br />
(001) (101)<br />
ß<br />
Sektor V<br />
(000)<br />
Sektor VI<br />
(100)<br />
2<br />
__ 3 U d<br />
Abbildung 2.2.: Spannungsraumzeiger des Zweistufenwechselrichters<br />
Innerhalb des Sechsecks, das durch die sechs von Null verschiedenen Spannungsraumzeiger aufgespannt wird,<br />
kann im Mittel jeder Spannungsraumzeiger gebildet werden. Dies geschieht dadurch, daß die drei Schaltstufen,<br />
2 (000), (001), (010), (011), (100), (101), (110), (111)<br />
14<br />
α
die den Sektor begrenzen, in dem der gewünschte Raumzeiger liegt, jeweils für einen bestimmten Zeitabschnitt<br />
eingeschaltet<br />
¥ werden (vgl. Abbildung 2.3).<br />
Dabei ist zu beachten, daß ein von der Amplitude her gleichbleibender Spannungsraumzeiger nur dann eingestellt<br />
werden kann, wenn seine Länge innerhalb des eingezeichneten Kreises liegt, der bei ungefähr 86% der<br />
Zwischenkreisspannung liegt.<br />
Anhand des Beispiels in Abbildung 2.3 sind die notwendigen mathematischen Formeln zur Berechnung eines<br />
beliebigen Spannungsraumzeigers hergeleitet.<br />
(111)<br />
(000)<br />
Aus Abbildung 2.3 folgt:<br />
T x (100)<br />
1<br />
(110)<br />
__<br />
3 U<br />
1<br />
d<br />
Sektor I<br />
T x (110)<br />
2<br />
darzustellender Spannungsraumzeiger<br />
__soll U<br />
(100)<br />
2<br />
__ 3 U d<br />
Abbildung 2.3.: Raumzeigermodulation für einen beliebigen Spannungsraumzeiger<br />
U soll ¦<br />
T1<br />
Hierbei bezeichnen T1 und T2 die jeweiligen Zeiten, in denen der Schaltzustand (100) bzw. (110) aktiv ist, und<br />
Tges die Gesamtzeit, bis ein neuer Spannungsraumzeiger berechnet wird. Die Zeit, die einer der beiden möglichen<br />
Nullzeiger aktiv ist, wird folglich nach<br />
T0 ¦ Tges � T1 � T2 (2.2)<br />
100¡§¤ T2<br />
berechnet. Die Zeiten T1 und T2 lassen sich geometrisch zu<br />
ermitteln.<br />
Tges ist hier zu 50µs ( ¦ ˆ ¦ fSchalt<br />
T1 ¦<br />
T2 ¦<br />
20kHz) eingestellt.<br />
� �<br />
Usoll Tges<br />
2<br />
3 Ud<br />
� �<br />
Usoll Tges<br />
2<br />
3Ud 15<br />
110¡¨¡¨© Tges�<br />
sin π<br />
3 � α¡<br />
sin π<br />
3 ¡<br />
α¡ sin<br />
π sin 3 ¡<br />
(2.1)<br />
(2.3)<br />
(2.4)
3. Darstellung der dreiphasigen Ströme und<br />
Spannungen<br />
In diesem Kapitel werden verschiedene Möglichkeiten, die dreiphasigen Ströme und Spannungen zu beschreiben,<br />
zusammengefasst.<br />
3.1. Raumzeiger<br />
Der zeitliche Verlauf der Spannungen eines Dreiphasensystems läßt sich folgerndermaßen beschreiben:<br />
uU<br />
uV<br />
uW<br />
¦ t¡ ûUsin ω1t¡<br />
t¡ ¦ ûV � sin ω1t 2π<br />
¡<br />
t¡ ¦<br />
3<br />
(3.1)<br />
ûW ¤ sin ω1t 2π<br />
3 ¡¨£<br />
wobei ω1t den zeitlichen Winkel beschreibt. 1 Die in Gleichung 3.1 angegebenen Spannungen uU,uV und uW<br />
lassen sich vereinfacht zu einem Raumzeiger U zusammenfassen. Da die Spannungen in einem Dreiphasensystem<br />
um jeweils 120� zueinander versetzt sind, setzt sich der Spannungsraumzeiger additiv aus drei Teilen nach<br />
folgender Definitionsgleichung zusammen:<br />
mit α ¦ e j120 .<br />
U t¡ ¦ uU<br />
t¡§¤ αuV<br />
t¡�¤ α 2 uW<br />
t¡ (3.2)<br />
Graphisch läßt sich dieser Zusammenhang für zwei ausgewählte Zeitpunkte in den Bildern 3.1 erkennen. Dabei<br />
ist im zweiten Bild der Spannungsraumzeiger um 90� weiter rotiert.<br />
V<br />
U__V U<br />
__U<br />
U__U U__<br />
W<br />
W<br />
¦ uU û£ uV ¦ uW � ¦<br />
Abbildung 3.1.: Spannungen des Dreiphasennetzes als Raumzeiger dargestellt<br />
1 Statt U, V, W wird auch häufig R, S, T oder a,b,c verwendet.<br />
V<br />
U__<br />
1<br />
2 û uU ¦ 0£ uV ¦<br />
16<br />
__ U<br />
V<br />
U<br />
U__<br />
W<br />
�<br />
3<br />
2 û£ uW � ¦<br />
W<br />
�<br />
3<br />
2 û
Die beiden Beispiele aus Abbildung 3.1 zeigen, wie sich ein beliebiger Spannungsraumzeiger durch Addition<br />
� der Phasenspannungen erzeugen läßt. Umgekehrt ist es möglich, aus der Lage des Spannungsraumzeigers die<br />
drei Phasenspannungen zu ermitteln. Bei der Raumzeigermodulation wird diese Darstellung verwendet, wenn zu<br />
jedem Zeitpunkt eine bestimmte Spannung über der Induktivität anliegen soll, um den erforderlichen Kompensationsstrom<br />
einzuprägen.<br />
3.2. αβ-Koordinatentransformation<br />
Die drei Ströme iU¢ V¢ W und die drei Spannungen uU¢ V¢ W des Dreiphasensystemes werden gemäß Abbildung 3.2 in<br />
ein orthogonales ortsfestes Koordinatensystem transformiert, dessen Achsen mit α und β bezeichnet werden. Die<br />
α-Achse ist identisch mit der U-Achse des dreiphasigen Systems und kann als reelle Achse interpretiert werden.<br />
Folglich ist die β-Achse dann die imaginäre Achse.<br />
β<br />
V<br />
Abbildung 3.2.: Orthogonales und ortsfestes Koordinatensystem<br />
Für die bezugsgrößeninvariante Transformation ergibt sich nach [5] oder [6] für die Ströme<br />
Für die Spannungen gilt<br />
bzw. nach [7, S. 186]<br />
�<br />
�<br />
iα<br />
iβ uα<br />
uβ t¡<br />
t¡<br />
i αβ<br />
t¡<br />
t¡<br />
u αβ<br />
uα<br />
uβ ¦<br />
2<br />
3<br />
t¡ ¦ � C αβ<br />
¦<br />
2<br />
3<br />
t¡ ¦ � C αβ<br />
t¡<br />
t¡<br />
¦<br />
2<br />
3<br />
� 1<br />
0<br />
α<br />
U<br />
1<br />
� 2<br />
3<br />
2<br />
t¡�� iUVW<br />
� 1<br />
0<br />
1<br />
� 2<br />
3<br />
2<br />
t¡�� uUVW<br />
1 1 2 �<br />
3<br />
0 2<br />
Für die leistungsinvariante Transformation lautet der Vorfaktor 2<br />
3<br />
�<br />
�<br />
t¡ �<br />
�<br />
�<br />
1<br />
� 2<br />
3<br />
2<br />
1<br />
� 2<br />
3<br />
2<br />
W<br />
iU<br />
iV<br />
iW<br />
uU<br />
uV<br />
uW<br />
t¡<br />
t¡<br />
t¡<br />
t¡<br />
t¡<br />
t¡<br />
(3.3)<br />
(3.4)<br />
(3.5)<br />
t¡¨£ (3.6)<br />
uUV<br />
uVW<br />
t¡<br />
t¡<br />
�<br />
(3.7)<br />
2 statt 3 . In dieser Arbeit wird die bezugsgrö-<br />
ßeninvariante Transformation verwendet, da es die Aufgabe des Filters bzw. dessen Regelung ist, einen Strom<br />
einer bestimmten Amplitude einzuprägen, und da Leistungsbetrachtungen nicht vorgenommen werden.<br />
17
Ist der Sternpunkt nicht geerdet, so ist<br />
Für die α-Komponente des Stromes gilt:<br />
iα<br />
t¡ ¦<br />
¦<br />
Für die β-Komponente des Stromes gilt:<br />
i β<br />
t¡ ¦<br />
¦<br />
¦<br />
iW<br />
2<br />
3<br />
2<br />
3<br />
iU<br />
iU<br />
iU<br />
t¡ �<br />
t¡ ¦ � iU<br />
t¡ �<br />
t¡ �<br />
1<br />
2 iV<br />
1<br />
2 iV<br />
t¡ � iV<br />
t¡ �<br />
t¡ � 1<br />
2 iW<br />
t¡§¤ 1<br />
2 iU<br />
�� 2 3<br />
3 2 iV<br />
�<br />
t¡ �<br />
3<br />
2 iW<br />
�� 2 3<br />
3 2 iV<br />
�<br />
t¡§¤<br />
3<br />
2 iU<br />
�<br />
1<br />
3 iU t¡ �<br />
�<br />
2<br />
3 iV � t¡<br />
t¡¨¡<br />
t¡�¤<br />
t¡¨¡<br />
t¡§¤ 1<br />
2 iV<br />
3 �<br />
2 iV<br />
¦<br />
Folglich genügt es, zwei Phasenströme und gemäß Gleichung 3.7 zwei verkettete Spannungen zu messen.<br />
Für die Rücktransformation aus den αβ- in die UVW-Koordinaten gilt entsprechend<br />
�<br />
iU<br />
iV<br />
iW<br />
t¡<br />
t¡<br />
i UVW<br />
t¡<br />
¦<br />
�<br />
�<br />
t¡ ¦ � C αβ<br />
3.3. dq-Koordinatentransformation<br />
1 0<br />
�<br />
1 3<br />
2 � 2<br />
1 3<br />
2 � 2<br />
t¡���� 1 iαβ<br />
t¡ �<br />
iα<br />
iβ t¡<br />
t¡<br />
t¡¨¡<br />
t¡¨¡<br />
(3.8)<br />
(3.9)<br />
(3.10)<br />
(3.11)<br />
(3.12)<br />
Damit die 50Hz Phasenströme und -spannungen des Dreiphasensystems zu Gleichgrößen werden, können sie in<br />
dθ<br />
ein mit der ¦<br />
Winkelgeschwindigkeit ¦ ω dt 2π50Hz¡ rotierendes Koordinatensystem - das dq-Koordinatensystem<br />
- umgerechnet werden. Der Spannungsraumzeiger U wird gemäß Abbildung 3.3 in die d-Achse gelegt, und der<br />
Winkel θ bezeichnet den Winkel zwischen der U- bzw. α-Achse und der d-Achse.<br />
Für die bezugsgrößeninvariante Transformation ergibt sich nach [5], [6] oder [8]<br />
Für die Spannungen gilt<br />
�<br />
�<br />
id<br />
iq<br />
ud<br />
uq<br />
t¡<br />
t¡<br />
i dq<br />
t¡<br />
t¡<br />
u dq<br />
¦<br />
2<br />
3<br />
t¡ ¦ � Cdq<br />
¦<br />
2<br />
3<br />
t¡ ¦ � Cdq<br />
�<br />
�<br />
cosθ cos θ<br />
sinθ sin θ<br />
t¡�� iUVW<br />
t¡ �<br />
�<br />
�<br />
cosθ cos θ<br />
sinθ sin θ<br />
t¡�� uUVW<br />
2π<br />
3 ¡ cos ¤ 2π θ 3 ¡<br />
2π<br />
3 ¡ sin ¤ 2π θ 3 ¡<br />
2π<br />
3 ¡ cos ¤ 2π θ 3 ¡<br />
2π<br />
3 ¡ sin ¤ 2π θ 3 ¡<br />
2 2<br />
Für die leistungsinvariante Transformation gilt wieder der Vorfaktor 3 statt 3 .<br />
t¡ �<br />
18<br />
iU<br />
iV<br />
iW<br />
uU<br />
uV<br />
uW<br />
t¡<br />
t¡<br />
t¡<br />
t¡<br />
t¡<br />
t¡<br />
(3.13)<br />
(3.14)<br />
(3.15)<br />
(3.16)
β<br />
V<br />
U -<br />
ω<br />
d<br />
θ<br />
Abbildung 3.3.: Orthogonales und mit ω rotierendes Koordinatensystem<br />
Ist die Netzspannung oberschwingungsfrei, so ist deren Transformation sehr einfach und durch<br />
gegeben.<br />
Der Winkel θ kann dann gemäß<br />
berechnet werden.<br />
ud<br />
uq<br />
t¡<br />
t¡<br />
¦<br />
α<br />
U<br />
θ ¦ arctan u β<br />
u2 t¡§¤ α u2 β<br />
uα<br />
0<br />
t¡<br />
W<br />
q<br />
(3.17)<br />
(3.18)<br />
Außerdem ist es dann aus geometrischen Überlegungen nach [6] oder [8] möglich, die dq-Komponente des<br />
Stromes gemäß<br />
t¡ id<br />
1 uα t¡ uβ t¡ iα t¡<br />
(3.19)<br />
¦<br />
zu berechnen.<br />
iq<br />
Dabei läßt sich die Summe uα<br />
Blindleistung interpretieren.<br />
t¡<br />
t¡ iα<br />
t¡§¤ uβ<br />
u 2 α<br />
t¡ iβ<br />
t¡�¤ u 2 β<br />
t¡<br />
� u β<br />
t¡ uα<br />
t¡ als Wirkleistung und die Summe � u β<br />
Für die Rücktransformation aus den dq- in die αβ-Koordinaten gilt entsprechend<br />
iα<br />
iβ t¡<br />
t¡<br />
¦<br />
1<br />
u2 t¡§¤ α u2 β<br />
t¡ �<br />
t¡<br />
uα uβ uβ uα<br />
t¡<br />
so daß mit Gleichung 3.11 die UVW-Komponenten gewonnen werden können.<br />
Alternativ können mit<br />
iU<br />
iV<br />
iW<br />
t¡<br />
t¡<br />
i UVW<br />
t¡<br />
¦<br />
cos θ �<br />
cosθ � sinθ<br />
2π<br />
3 ¡ sin θ � �<br />
t¡<br />
t¡<br />
t¡<br />
2π<br />
3 ¡<br />
cos θ ¤ 2π<br />
3 ¡ � sin θ ¤ 2π<br />
3 ¡<br />
t¡<br />
�<br />
� ¦ Cdq � t¡<br />
die Ströme des Dreiphasennetzes (bezugsgrößeninvariant) direkt berechnet werden.<br />
t¡���� 1 idq<br />
i β<br />
id<br />
id<br />
id<br />
iq<br />
t¡<br />
t¡<br />
t¡<br />
t¡<br />
t¡<br />
t¡ iα<br />
t¡�¤ uα<br />
t¡ iβ<br />
t¡ als<br />
£ (3.20)<br />
(3.21)<br />
(3.22)<br />
Um zu untersuchen, welche Ergebnisse die unterschiedlichen dq-Transformationen bei oberschwingungsbehafteter<br />
Netzspannung liefern, wurden die Transformationen unter Matlab simuliert. Der zugehörige Sourcecode<br />
19
ist im Anhang B.1 wiedergegeben. Ein für diese Arbeit wesentliches Ergebnis dieser Simulationen ist, daß die<br />
� vereinfachte<br />
dq-Transformation nach 3.17 bzw. 3.19 durch die Rücktransformation 3.20 ihre Gültigkeit auch für<br />
oberschwingungsbehaftete Netzspannungen behält. Dies ist den Abbildungen 3.4 c) und d) zu entnehmen, in denen<br />
aus Gründen der Übersichtlichkeit die Spannungen bzw. Ströme IaR, IbR und UaR, UbR jeweils nach oben<br />
versetzt dargestellt sind. Ia und Ib bezeichnen die Ströme in αβ-Koordinaten nach Gleichung 3.3. IaR und IbR<br />
bezeichnen die Ströme in αβ-Koordinaten, nachdem sie mittels Gleichung 3.19 in die dq-Koordinaten und mittels<br />
Gleichung 3.20 wieder in die αβ-Koordinaten zurücktransformiert wurden. Gleiches gilt für die Spannungen Ua<br />
und Ub bzw. UaR und UbR. Die iU¢ V¢ Ströme t¡ W waren oberschwingungsbehaftet und mit einem Phasenwinkel<br />
φ gegenüber den ebenfalls oberschwingungsbehafteten uU¢ V¢ Spannungen t¡ W versehen (vgl. Abbildung 3.4 a)<br />
und b)).<br />
a) Ströme des Dreiphasennetzes c) αβ-Komponenten des Netzstromes<br />
b) Spannungen des Dreiphasennetzes d) αβ-Komponenten der Netzspannung<br />
Abbildung 3.4.: Simulation verschiedener dq-Transformationen<br />
20
4. Aktive Filter - ein Überblick<br />
In diesem Kapitel werden die aus der Literatur bekannten Regelstrategien für aktive Filter vorgestellt und diskutiert.<br />
Zu beachten ist, daß in zahlreichen der im Folgenden zitierten Veröffentlichungen nur Simulationsergebnisse<br />
vorgestellt werden, so daß viele der Verfahren ihre Funktionsfähigkeit erst noch in der Praxis beweisen<br />
müssen.<br />
Die aus der Literatur bekannten aktiven Netzfilter können folgendermaßen unterteilt werden:<br />
1. Verfahren ohne Regelung<br />
a) Berechnung des Kompensationsstroms durch Eliminierung der Grundschwingung mittels Notch Filter<br />
b) Berechnung der Wirk- und Blindleistung aus den αβ-Komponenten des Laststroms und daraus die<br />
Berechnung der notwendigen Kompensationsströme<br />
c) Berechnung der dq-Komponenten des Laststroms und daraus die Berechnung der notwendigen Kompensationsströme<br />
d) Gezielte Beeinflussung bestimmter Oberschwingungen<br />
i. Bestimmung der Oberschwingungen mit Hilfe von pll’s (phase locked loop) und gezielte Eliminierung<br />
der Oberschwingungen<br />
ii. Bestimmung der Oberschwingungen mit Hilfe einer FFT (Fast Fourier Transform) und gezielte<br />
Eliminierung der Oberschwingungen<br />
2. Verfahren mit Regelung<br />
a) PI-Regler<br />
i. ohne Koordinatentransformation<br />
ii. mit dq-Koordinatentransformation<br />
b) Fuzzy-Regler<br />
c) Zustandsregler<br />
Die in vielen Veröffentlichungen vorgeschlagene zusätzliche Verwendung von Saugkreisen, um gezielt Oberschwingungen<br />
(meist die fünfte und siebte) zu eliminieren, ist unabhängig davon, ob dem aktiven Filter eine<br />
Regelung zu Grunde liegt oder nicht.<br />
4.1. Aktive Filter ohne Regelung<br />
Bei den folgenden aus der Literatur bekannten Verfahren handelt es sich um Steuerungs- und nicht um Regelungsverfahren.<br />
In vielen Veröffentlichungen (so in [8], [9], [10]) ist jedoch von einem “current controller”, also<br />
einem Stromregler, die Rede. Dabei handelt es sich um einen sogenannten “hysteresis comparator”, der den<br />
berechneten Kompensationsstrom mit dem tatsächlich fließenden Kompensationsstrom vergleicht. So werden<br />
unnötig viele Umschaltungen der Ventile vermieden. Es ist keine Regelung im eigentlichen Sinne.<br />
21
Ein weiteres aus der Literatur bekanntes Verfahren nutzt den “hysteresis comparator” als Zweipunktregler. Die<br />
� Zweipunktregelung<br />
bezweckt, daß sich der Kompensationsstrom in einem vorgegebenen Band befindet. Hier<br />
handelt es sich um ein Regelverfahren.<br />
Die in Abschnit 4.1.1 bis 4.1.3 beschriebenen Verfahren verwenden einen “hysteresis comparator”, aber nicht als<br />
Zweipunktregler.<br />
Die prinzipielle Funktionsweise ist in der Abbildung 4.1 dargestellt.<br />
i CU,CV,CW<br />
gemessen<br />
i* CU,CV,CW<br />
berechnet<br />
Schaltpulse<br />
Abbildung 4.1.: Hysteresis Comparator<br />
4.1.1. Berechnung des Kompensationsstroms durch Eliminierung der Grundschwingung<br />
mittels Notch Filter<br />
Dieses Verfahren wird in [11] erläutert.<br />
iLU,LV,LW gemessen<br />
Notch<br />
Filter<br />
Eleminierung<br />
der<br />
Grundschwingung<br />
iCU,CV,CW berechnet<br />
i<br />
CU,CV,CW<br />
gemessen<br />
Schaltpulse<br />
Abbildung 4.2.: Schema zur Berechnung des Kompensationsstroms mittels Notch Filter<br />
Mittels eines “Notch 1 Filters” wird die Grundschwingung aus dem Laststrom herausgefiltert. Die Oberschwingungen<br />
bleiben erhalten und werden dann mit umgekehrtem Vorzeichen von dem aktiven Filter eingeprägt. Das<br />
Filter sollte nach [11] eine Bandbreite von 5Hz haben und ist für jede der drei Phasen vorzusehen. Es reagiert<br />
nach 200ms (das entspricht 10 Grundschwingungsperioden) auf einen Lastsprung.<br />
Der Vorteil dieses Verfahrens liegt in der Einfachheit und in der Fähigkeit, unsymmetrische Störungen kompensieren<br />
zu können. Der Hauptnachteil liegt darin, daß mit diesem Verfahren keine Blindleistungskompensation<br />
erfolgen kann.<br />
4.1.2. Berechnung des Kompensationsstroms aus der momentanen Wirk- und Blindleistung in<br />
αβ-Koordinaten<br />
Dieses Verfahren wird unter anderem in [6], [8] und [9] beschrieben und dort mit “Instantaneous Reactive Power<br />
Therory” bezeichnet.<br />
Die Momentanwerte der Wirk- und Blindleistung 2 berechnen sich wie in Abschnitt 3.3 erläutert nach<br />
p<br />
q ¦<br />
pdc ¤ pac<br />
q<br />
uα u β<br />
¦<br />
wobei die Wirkleistung p aus einem Gleich- und einem Wechselanteil besteht. Um Stromoberschwingungen zu<br />
eliminieren und Blindleistung zu kompensieren, muß das aktive Filter sowohl den Wechselanteil der Wirkleistung<br />
� u β uα<br />
1 (engl.) Kerbe - ein Filter, das vergleichbar zu einer Bandsperre einzelne Frequenzen aus einem Signal filtert<br />
2 Im Folgenden werden zeitlich veränderlichen Größen mit Kleinbuchstaben gekennzeichnet und “(t)” weggelassen.<br />
22<br />
iLα<br />
i Lβ<br />
£ (4.1)
i CU,CV,CW<br />
gemessen<br />
i iCU,CV,CW CU,CV,CW<br />
αβ / UVW<br />
iCα iCβ<br />
Berechnung des<br />
Kompensationstroms<br />
p<br />
ac<br />
q<br />
Filter<br />
p<br />
Berechnung der<br />
Wirk-&Blindleistung<br />
uα,β iLα,β<br />
UVW / αβ UVW / αβ<br />
u U,V,W<br />
Schaltpulse<br />
berechnet<br />
iLU,LV,LW<br />
Abbildung 4.3.: Schema zur Berechnung des Kompensationsstroms in αβ-Koordinaten<br />
pac als auch die Blindleistung q einprägen, jeweils mit negativem Vorzeichen. Unter Berücksichtigung von<br />
Verlusten in den Schaltern und den Zuleitungen wird die Wirkleistung noch um einen Anteil pV ergänzt.<br />
Damit folgt für die Kompensationsströme in αβ-Komponenten<br />
iCα<br />
i Cβ<br />
uα u β<br />
¦<br />
und schließlich mit Gleichung 3.12 für das Dreiphasensystem<br />
� u β uα<br />
� 1<br />
pac ¤ pV<br />
q<br />
CU¢ V¢ i ¦�� W αβ� � C 1 Cαβ� i (4.3)<br />
Der Hauptnachteil dieses Verfahrens liegt nach [11] darin, daß nur symmetrische Störungen kompensiert werden<br />
können.<br />
4.1.3. Berechnung des Kompensationsstroms in dq-Koordinaten<br />
Dieses Verfahren wird unter anderem [6], [8] und [9] beschrieben und dort mit “Synchronous Reference Frame”<br />
bezeichnet.<br />
Zunächst wird die in Kapitel 3.3 eingeführte Transformation auf den Laststrom angewendet.<br />
i Ldq ¦<br />
dc ¤ iLd¢ ac<br />
iLd¢<br />
iLq<br />
Dann wird wie auch schon im zuletzt dargestellten Verfahren mittels eines Filters der Gleichanteil des Wirkstromes<br />
herausgefiltert. Mit Gleichung 3.22 folgen dann die notwendigen Kompensationsströme<br />
i CU¢ V¢ W ¦�� Cdq� � 1<br />
23<br />
¦�� Cdq� i LU¢ V¢ W<br />
ac iLd¢<br />
iLq<br />
�<br />
(4.2)<br />
(4.4)<br />
(4.5)
θBerechnung<br />
u U,V,W<br />
i CU,CV,CW<br />
gemessen<br />
Schaltpulse<br />
i CU,CV,CW berechnet<br />
dq / UVW<br />
iCq iCd<br />
Berechnung des<br />
Kompensationstroms<br />
iLdac<br />
iLq Filter<br />
iLd<br />
UVW / dq<br />
θ<br />
pll<br />
u U<br />
i LU,LV,LW<br />
Abbildung 4.4.: Schema zur Berechnung des Kompensationsstroms in dq-Koordinaten<br />
Ein Problem bei diesem Verfahren liegt in der Bestimmung des Winkels θ. Eine Möglichkeit, dieses Problem zu<br />
umgehen wurde bereits in Kapitel 3.3 erläutert. Eine zweite Möglichkeit, den Winkel zu bestimmen, liegt in der<br />
Verwendung von pll’s. Jedoch steigt dann der technische Aufwand.<br />
Ein Nachteil dieses Verfahrens ist, wie auch schon in 4.1.3 dargestellt, daß nur symmetrische Störungen kompensiert<br />
werden können.<br />
4.1.4. Gezielte Elimination der Oberschwingungen durch den Einsatz von pll’s<br />
Dieses Verfahren wird unter anderem in [6] und [9] beschrieben. Da das Filter bzw. die zugehörige Anlage,<br />
für die die Regelung in dieser <strong>Diplomarbeit</strong> entworfen wird, nicht über pll’s 3 verfügt, wird auf eine ausführliche<br />
Diskussion verzichtet.<br />
Es sei nur angemerkt, daß mit Hilfe dieses Verfahrenes nur die gezielte Elimination einzelner Oberschwingungen<br />
möglich ist, es also demnach weiterhin unkompensierte Oberschwingungen geben kann. Außerdem ist es nicht<br />
möglich, den Leistungswinkel cosφ vorzugeben.<br />
4.1.5. Gezielte Elimination der Oberschwingungen mittels FFT<br />
Dieses Verfahren wird unter anderem in [6], [9] und [11] beschrieben.<br />
Die FFT 4 wird auf eine Periode des abgetasteten Laststroms angewendet und liefert als Ergebnis die Amplitude<br />
und den Phasenwinkel für jede Frequenzkomponente. Um den Kompensationsstrom zu bestimmen, wird anschließend<br />
die Grundschwingung aus dem Signal herausgefiltert und auf das verbleibende Spektrum wird dann<br />
die inverse FFT angewendet. Bei diesem Verfahren ist es wichtig, daß die FFT immer auf eine ganze Periode des<br />
Laststroms angewendet wird. Nur so kann ein korrektes Spektrum bestimmt werden.<br />
Nach [11] führt eine sprungartige Änderung des Stroms zu Fehlern in der Berechnung des Spektrums, so daß<br />
für eine kurze Zeit u.U. erhebliche Fehler durch den Kompensationsstrom auftreten können. Ferner können<br />
3 phased locked loop<br />
4 Fast Fourier Transform<br />
24
mit diesem Verfahren nur Oberschwingungen eliminiert werden, der Leistungswinkel cosφ kann jedoch nicht<br />
vor<br />
� gegeben werden.<br />
4.2. Aktive Filter mit Regelung<br />
In der Literatur sind neben Filtern mit Zustandsregler oder Fuzzy-Regler überwiegend Filter mit PI-Reglern 5 zu<br />
finden. Regler höherer Ordnung wurden bisher für die Regelung aktiver Netzfilter nicht verwendet. Aus diesem<br />
Grund wird in dieser <strong>Diplomarbeit</strong> neben dem Entwurf eines Dead Beat Reglers (vgl. 5.6.2) auch das Verhalten<br />
des Filters mit PID 2 -Regler 6 untersucht (vgl. Abschnitt 5.5).<br />
4.2.1. PI-Regler<br />
Da in dieser <strong>Diplomarbeit</strong> ebenfalls ein PI-Regler entworfen wurde (vgl. Abschnitt 5.5), wird an dieser Stelle auf<br />
eine ausführliche Darstellung der theoretischen Grundlagen verzichtet.<br />
4.2.1.1. PI-Regler ohne Koordinatentransformation<br />
In [12] wird ein Verfahren vorgeschlagen, das eine Kompensation der Oberschwingungen im Netzstrom ohne<br />
Koordinatentransformation möglich macht. Allerdings verwendet der Autor einen Transformator, um den benötigten<br />
Kompensationsstrom einzuprägen, da zusätzlich Spannungsoberschwingungen gedämpft werden sollen.<br />
Da die Anlage, für die in dieser <strong>Diplomarbeit</strong> die Regelung entworfen wird, jedoch nicht über einen Transformator<br />
verfügt, ist dieses Verfahren auf die Problemstellung der <strong>Diplomarbeit</strong> nicht übertragbar.<br />
Die grundsätzliche Idee ist Abbildung 4.5 zu entnehmen. Dabei wird der netzseitig fließende Strom i2 durch die<br />
netzseitige Spannung u2 gebildet. Die Spannung u2 wird ihrerseits durch die Spannung u1 bzw. den Strom i1<br />
eingeprägt.<br />
Netz<br />
L<br />
U 2<br />
U<br />
1<br />
PI<br />
Abbildung 4.5.: Schema des PI-Reglers ohne Koordinatentransformation nach [12]<br />
4.2.1.2. PI-Regler mit dq-Koordinatentransformation<br />
Alle weiteren aus der Literatur bekannten Verfahren verwenden die dq-Koordinatentransformation.<br />
Der Vorteil in der Verwendung dieses Koordinatensystems liegt darin, daß die Sollgröße (in UVW-Koordinaten<br />
ein 50Hz Strom) eine Gleichgöße darstellt, es folglich einfacher ist, einen guten Regler zu entwerfen. Nachteilig<br />
wirkt sich bei der Verwendung dieses Koordinatensystems der erhöhte Rechenaufwand aus.<br />
Die in [13], [14] und [15] beschriebenen Verfahren verwenden die dq-Koordinatentransformation in ein mit<br />
Netzfrequenz rotierendes Koordinatensystem.<br />
5 PI-Regler steht für Proportional und Integral Regler. Der Integralanteil sorgt dafür, daß im Gleichgewichtszustand der Fehler aus dem<br />
Soll-/ Istwertvergleich zu Null wird. Der Proportionalanteil erhöht die Dynamik des Reglers.<br />
6 Das “D” steht für Differential. Durch Hinzunahme eines differentierenden Anteils ist es möglich, die Durchtrittsfrequenz zu erhöhen<br />
und damit die Dynamik eines Reglers zu verbessern.<br />
25<br />
i 2<br />
i 1<br />
Last
In [16] wird ein PI-Regler für jede einzelne Frequenzkomponente verwendet. Dabei ist jede dieser Frequenz-<br />
� komponenten in ein zugehöriges mit entsprechend höherer Frequenz rotierendes Koordinatensystem gemäß Abbildung<br />
4.6 transformiert. In der Abbildung ist dieses Verfahren nur für die 5. Oberschwingung dargestellt,<br />
identische Zweige sind für jede weitere zu kompensierende Oberschwingung vorgesehen. Als Führungsgröße<br />
dient dann für jede Frequenzkomponente der entsprechende Laststrom.<br />
i d1 ref<br />
fund.<br />
bandpass<br />
filter<br />
5.&7.<br />
Notchfilter<br />
5. bandpass<br />
filter<br />
5. bandpass<br />
filter<br />
1<br />
-5<br />
3/2<br />
3/2<br />
3/2<br />
3/2<br />
-1<br />
id1<br />
ist<br />
iq1<br />
ist<br />
ω L<br />
id5<br />
ist<br />
i q5 ist<br />
ω L<br />
-1<br />
i q1 ref<br />
i d5 ref<br />
+<br />
-<br />
+ -<br />
+<br />
-<br />
iq5<br />
ref +<br />
-<br />
Regler<br />
Regler<br />
Regler<br />
Regler<br />
ud<br />
−1<br />
+<br />
-<br />
+<br />
+<br />
-<br />
−1<br />
2/3<br />
2/3<br />
θ<br />
u q<br />
2/3<br />
+<br />
i Kompensator<br />
i<br />
Last<br />
PWM Netz<br />
Abbildung 4.6.: Schema des PI-Reglers für einzelne Oberschwingungskomponenten<br />
Last<br />
}Grundschwingung<br />
} 5. Oberschwingung<br />
Der Vorteil ist darin zu sehen, daß für jede einzelne Frequenzkomponente die Führungsgröße eine Gleichgröße<br />
ist, folglich mit einem sehr guten stationären Regelverhalten zu rechnen ist.<br />
Ein großer Nachteil sind die zahlreichen notwendigen Berechnungen, so daß dieses Verfahren mit nur einem<br />
Microcontroller für die Regelung nicht zu realisieren ist.<br />
4.2.2. Fuzzy-Regler<br />
Aktive Filter mit Fuzzy-Regler werden u.a. in [17] und [18] vorgestellt.<br />
Zu Fuzzy-Reglern ist anzumerken, daß sie vor allem dann den herkömmlichen PI-Reglern überlegen sind, wenn<br />
die Regelstrecke nur ungenügend bekannt ist, nicht hinreichend genau mathematisch beschrieben werden kann,<br />
oder wenn in der Strecke große Nichtlinearitäten auftreten. Ist die Regelstrecke genau bekannt, so kann i.A.<br />
ein Fuzzy-Regler auf Grund seiner “unscharfen” Definition kein besseres Ergebnis liefern als ein gewöhnlicher<br />
PI-Regler.<br />
Da das in dieser Arbeit verwendete aktive Filter - allgemein die Regelstrecke - ausreichend genau bekannt und<br />
mathematisch beschreibbar ist, wird im Weiteren nicht von einem Fuzzy-Regler Gebrauch gemacht.<br />
4.2.3. Zustandsregler<br />
Dieses Verfahren wird unter anderem in [19] beschrieben.<br />
Grundsätzlich ist anzumerken, daß es sich bei Zustandsreglern um sehr mächtige Regler handelt. Ein solcher<br />
Zustandsregler wurde bereits für die zu untersuchende Anlage entwickelt und sehr ausführlich in [2] und [3]<br />
beschrieben. Daber wird hier auf eine weiterführende Diskussion verzichtet. Jedoch werden im Kapitel 7 die in<br />
dieser Arbeit entworfenen Regler mit dem in [2] und [3] entworfenen Zustandsregler verglichen.<br />
26
Teil II.<br />
Implementierung der Regelung des aktiven<br />
Netzfilters<br />
27
5. Auslegung der Regler<br />
Es ist die Aufgabe dieser <strong>Diplomarbeit</strong>, Regelstrategien für ein aktives Filter zu entwickeln, zu simulieren und<br />
anschließend experimentell zu untersuchen. Da die praktische Regelung mittels Microcontroller erfolgt, wird ein<br />
digitaler Regler benötigt. Im Rahmen dieser <strong>Diplomarbeit</strong> wird ein Dead Beat Regler 1 entworfen, ein für aktive<br />
Filter neues Regelverfahren. Der Dead Beat Reglerentwurf ist ein rein digitaler Reglerentwurf. Außerdem werden<br />
zu Vergleichszwecken ein PI- und ein PID 2 -Regler in der s-Ebene entworfen und anschließend diskretisiert.<br />
Der PID 2 -Regler hat gegenüber dem PI-Regler eine verbesserte Dynamik und es ist mit einem Regelverhalten zu<br />
rechnen, das mit dem des Dead Beat Reglers vergleichbar ist. Der grundsätzliche Unterschied der Reglerentwürfe<br />
ist in dem Entwurfverfahren zu sehen. Der Dead Beat Regler wird in der z-Ebene entworfen, es handelt sich<br />
also um einen rein digitalen Entwurf, der PI- und der PID 2 -Regler werden dagegen in der s-Ebene entworfen und<br />
anschließend digitalisiert.<br />
Für alle drei Regler erfolgt die Regelung in den dq-Koordinaten. In diesem Koordinatensystem sind die Führungsgrößen<br />
Gleichgrößen, so daß ein besseres Regelverhalten zu erwarten ist.<br />
Die Auslegung des Reglers geschieht mittels der Programme Matlab und Simulink. Simulink wird sowohl für<br />
die anschauliche Darstellung des zu regelnden Systems verwendet als auch zum Testen des unter Matlab dimensionierten<br />
Reglers. Matlab dient zur Auslegung des Reglers und wird von Simulink verwendet. Die in der<br />
Simulation gewonnenen Erkenntnisse, insbesondere die dort bestimmten Reglerstrukturen, werden anschließend<br />
in der Praxis eingesetzt.<br />
5.1. Herleitung der mathematischen Zusammenhänge am aktiven Filter<br />
In diesem Kapitel werden die mathematischen Zusammenhänge des verwendeten aktiven Filters zusammengestellt.<br />
Es handelt sich um ein aktives Filter gemäß Abbildung 1.2. Die Regelung des Netzstroms bezüglich des<br />
Phasenwinkels und des Oberschwingungsgehalts erfolgt in den dq-Koordinaten.<br />
Der von dem Filter eingespeiste Kompensationsstrom 2 in Abbildung 1.2 wird für alle drei Phasen mit folgender<br />
Differentialgleichung beschrieben<br />
L<br />
t� diU�<br />
dt<br />
� t� diV<br />
dt<br />
� t� diW<br />
dt<br />
��� R<br />
� t� iU<br />
� t� iV<br />
iW � t�<br />
�<br />
t� � uNU � t�<br />
uWRU�<br />
t� � uNV � t�<br />
uWRV�<br />
uWRW� t� � uNW � t�<br />
Eine Umwandlung in die dq-Koordinaten erfolgt mittels Gleichung 3.13 und 3.21<br />
L<br />
d �<br />
Cdq� t�����<br />
dt<br />
1<br />
t� id�<br />
t� iq�<br />
� � Cdq� t����� 1<br />
t� did�<br />
dt<br />
t� diq�<br />
dt<br />
��� R � Cdq� t����� 1<br />
t� id�<br />
t� iq�<br />
� (5.1)<br />
UWRq � UNq<br />
� � Cdq� t����� 1 UWRd � UNd<br />
1 auch: Regler mit endlicher Einstellzeit - Ein Dead Beat Regler ist ein Kompensationsregler, der ermöglicht, daß die Regelgröße nach<br />
endlicher und fest vorgegebener Zeit die Führungsgröße erreicht und beibehält.<br />
2 Es wird vereinfachend der Index “C” für den Kompensationsstrom weggelassen.<br />
28<br />
�<br />
(5.2)
Linksseitige Multiplikation mit � Cdq� t��� liefert<br />
L<br />
t� did�<br />
dt<br />
t� diq�<br />
dt<br />
� R � �<br />
Cdq� t��� L � d �<br />
Cdq� t��� �<br />
dt<br />
1<br />
t� id�<br />
q� t� i<br />
� UWRd � UNd<br />
UWRq � UNq<br />
� (5.3)<br />
Darin bezeichnen UNq und UNd die Netzspannung und UWRq und UWRd die Wechselrichterausgangsspannung<br />
in dq-Koordinaten. Für eine oberschwingungsfreie Netzspannung sind UNq � 0 und UNd � Û. Für eine oberschwingungsbehaftete<br />
Netzspannung hingegen müssen diese Werte zu jedem Zeitpunkt entsprechend Gleichung<br />
3.15 berechnet werden.<br />
Zu untersuchen bleibt jetzt noch der Ausdruck � t��� L Cdq� d �<br />
Cdq� t��� � dt<br />
1 . Ausgeschrieben ergibt sich<br />
� 2<br />
� 2<br />
3L cosθ cos� θ<br />
sin� sinθ θ<br />
3L cosθ cos� θ<br />
sin� sinθ θ<br />
�<br />
t��� L Cdq� d �<br />
Cdq� t��� � dt<br />
1<br />
2π �<br />
3 � cos� θ � 2π<br />
3 �<br />
2π �<br />
3 � sin� θ � 2π<br />
3 �<br />
2π �<br />
3 � cos� θ � 2π<br />
3 �<br />
2π �<br />
3 � sin� θ � 2π<br />
3 �<br />
2 0 � 3<br />
�<br />
3Lω 2<br />
3<br />
2 0<br />
Gleichung 5.4 in 5.3 eingesetzt liefert<br />
L<br />
t� did�<br />
dt<br />
t� diq�<br />
dt<br />
��� R<br />
t� id�<br />
t� iq�<br />
� ωL<br />
d<br />
dt<br />
ω<br />
t� iq�<br />
id� t� �<br />
Gleichung 5.5 wird nun in den Laplace- oder s-Bereich übertragen:<br />
Id� s� �<br />
Iq� s� �<br />
1<br />
R<br />
s L<br />
R<br />
1<br />
R<br />
s L<br />
R<br />
� 1 � ωLIq� s�<br />
cosθ<br />
θ � 2π cos�<br />
3 � � sin� θ<br />
� sinθ<br />
2π �<br />
3 �<br />
cos� θ � 2π<br />
3 � � sin� θ � 2π<br />
3 �<br />
� �<br />
� sin�<br />
�<br />
sinθ cosθ<br />
θ 2π<br />
3 � � � cos� θ 2π<br />
3 �<br />
� sin� θ � 2π<br />
3 � � cos� θ � 2π<br />
3 �<br />
� (5.4)<br />
� UWRd � UNd<br />
UWRq � UNq<br />
� (5.5)<br />
� UWRd� s� � UNd� s�¨� (5.6)<br />
�<br />
� �<br />
ωLId� s� UWRq� s� � UNq� s�¨� � (5.7)<br />
�<br />
1<br />
5.2. Das aktive Filter unter regelungstechnischen Gesichtspunkten<br />
Die im vorangegangenen Abschnitt hergeleiteten Beziehungen 5.6 und 5.7 können unter regelungstechnischen<br />
Gesichtspunkten folgendermaßen interpretiert werden:<br />
Die Wechselrichterausgangsspannung UWRd� q ist die Stellgröße, die Netzspannung UNd� q und die Kopplungsterme<br />
ωLId� q sind Störgrößen und die Kopplungsinduktivität L mit dem ohmschen Widerstand R stellt die Strecke<br />
dar. Da jedoch das gesamte zu regelnde System noch weitere Teilstrecken enthält, wird zunächst nur allgemein<br />
von Strecke gesprochen, ohne sie näher zu spezifizieren. Die Spezifikation geschieht in Abschnitt 5.3.<br />
Es ergibt sich das in Abbildung 5.1 dargestellte Schema, wobei im Folgenden auf eine getrennte Darstellung der<br />
d- und der q-Koordinate verzichtet wird.<br />
Im nächsten Schritt muß die Struktur des Filters dahingehend erweitert werden, daß nicht nur ein Filterstrom<br />
bereitgestellt wird, sondern gezielt ein bestimmter Laststrom kompensiert wird. Dies kann grundsätzlich auf<br />
zwei Wegen geschehen:<br />
29
UNd iq<br />
ωL<br />
iCd<br />
soll<br />
+ Regler<br />
-<br />
+<br />
-<br />
iCd ist<br />
Strecke<br />
i Cd<br />
UNq<br />
iCq<br />
soll<br />
+ Regler<br />
- −<br />
+<br />
-<br />
iCq ist<br />
a) d-Achse b) q-Achse<br />
id<br />
ωL<br />
Strecke<br />
Abbildung 5.1.: Grundschema der Regelung in dq-Koordinaten in der s-Ebene<br />
1. Der Wechselrichtersollstrom ist Führungsgröße<br />
Die Führungsgröße berechnet sich aus der Differenz von Netzstromsollwert und Laststrom. Sie ist dann<br />
in dq-Koordinaten eine additive Überlagerung einer Gleichgröße (dem Stromsollwert) und einer zeitlich<br />
veränderlichen Größe 3 (dem Laststrom). Der Regler regelt in diesem Fall allerdings auf den Kompensationsstrom<br />
und nicht direkt auf den Netzstrom.<br />
2. Der Netzsollstrom ist Führungsgröße<br />
Die Führungsgröße berechnet sich aus dem Stromsollwert und der Laststrom ist eine Störgröße. In diesem<br />
Fall ist die Führungsgröße in dq-Koordinaten eine Gleichgröße, sowohl in der d- als auch in der<br />
q-Komponente.<br />
Dieses Vorgehen hat gegenüber dem ersten Verfahren drei Vorteile und wird daher im Weiteren in dieser<br />
Arbeit verwendet werden:<br />
a) Die Führungsgröße ist eine Gleichgröße.<br />
b) Mit geeigneter Störgrößenkompensation (siehe hierzu Kapitel 5.8.2) läßt sich der Einfluss der Laststromänderung<br />
minimieren und das Regelverhalten optimieren.<br />
c) Der Regler regelt auf den Netzstrom und nicht nur auf den Kompensationsstrom, es gibt also eine<br />
direkte Kontrolle über die gewünschte Größe.<br />
So unterschiedlich, wie sie zunächst erscheinen, sind die beiden Strategien jedoch nicht, da der Kompensationsstrom<br />
über die Knotenregel fest mit dem Netzstrom verknüpft ist. Regelungstechnisch sind beide Verfahren<br />
gleichwertig, falls bei dem zweiten Verfahren keine Laststromkompensation erfolgt, siehe hierzu Kapitel 6.2.<br />
5.3. Aufstellen der Systemgleichungen<br />
Wie im Folgenden abgeleitet wird, handelt es sich bei dem zu regelnden System um ein System vierter Ordnung,<br />
für das es einen optimalen Regler zu entwerfen gilt.<br />
Die Störgrößen sind durch entsprechende Messung der Netzspannung und des Laststromes bekannt und können<br />
so, da die Regelstrecken ebenfalls bekannt sind, als kompensierbar angesehen werden. Für die Auslegung der<br />
Regler werden zunächst sämtliche Störgrößen, die Netzspannung, der Laststrom und die Kopplungsterme der<br />
dq-Komponenten vernachlässigt. Sie werden als ausreichend kompensierbar angesehen. Eine ausführliche Diskussion<br />
der Störgrößen erfolgt in Kapitel 5.8.2. Dort ist ebenfalls dargestellt, wie die Kompensation erfolgt. Die<br />
Regler werden auf ihr Führungsverhalten hin optimiert.<br />
Wird der Regler auf optimales Führungsübertragungsverhalten ausgelegt, so ist nach [20, S.229] auch sein Störverhalten<br />
optimal. Dieses wird insbesondere hinsichtlich der Wahl der Führungsgröße im vorangegangenen<br />
Abschnitt deutlich. Je nach Führungsgröße ist der Laststrom einmal Teil der Führungsgröße, ein anderes Mal<br />
3 Es ist hierbei zu beachten, daß durch die Koordinatentransformation in das mit ω � 2π50Hz rotierende dq-System die 5. und 7.<br />
Oberschwingung im U,V,W System zu einer 6. Obeschwingung im dq-System werden. Entsprechend werden die 11. und 13. auf die<br />
12. abgebildet usw.<br />
30<br />
i Cq
Störgröße. Mit anderen Worten: auch ohne Störgrößenaufschaltung hat ein auf optimales Führungsverhalten<br />
ausgele<br />
� gter Regler ein bestmögliches Störverhalten.<br />
Das Gesamtsystem setzt sich aus folgenden Strecken zusammen:<br />
1. Kopplungsinduktivität:<br />
Der berechnete Kompensationsstrom wird über eine Induktivität L, die einen ohmschen Widerstand R hat,<br />
in das Netz eingeprägt, indem über der Induktivität die Spannungsdifferenz ΔUdq � UWRdq � UNdq anliegt.<br />
Die Spannung UWRdq ist die von dem Regler errechnete Stellspannung, die der Wechselrichter ausgeben<br />
soll. Es gilt<br />
In den Laplacebereich übertragen folgt<br />
Damit ist die erste Teilübertragungsfunktion mit<br />
gefunden.<br />
Mit L=1,1mH und R=0,6Ω folgt<br />
ΔU � L diC<br />
dt<br />
IC � ΔU<br />
GL&R� s� �<br />
GL&R� s� �<br />
�<br />
�<br />
1<br />
R<br />
iCR� (5.8)<br />
L<br />
Rs � 1 � (5.9)<br />
1<br />
R<br />
L<br />
R s � 1<br />
KL&Rω<br />
s � ωL&R<br />
(5.10)<br />
(5.11)<br />
909� 09<br />
s � 545� 45 � (5.12)<br />
2. Wechselrichter<br />
Da eine gewisse Verzugszeit (durch controllerinterne Berechnungen, Beschreiben der PW-Register, etc.)<br />
entsteht, bevor der berechnete Reglerausgangswert tatsächlich an der Induktivität wirkt, enthält das System<br />
eine Totzeit. Diese wurde experimentell ermittelt und mittels eines Verzögerungsgliedes zweiter Ordnung<br />
nachgebildet. So ergibt sich als zweite Übertragungsfunktion die des Wechselrichters<br />
�<br />
τ1WRτ2WRs2 GWR� s� � 1<br />
�<br />
1<br />
�<br />
τ1WR �<br />
� s � � ωWR1� s � ωWR2�<br />
Mit τ1WR � 0� � 10� 2 3 und τ2WR � 0� � 10� 1 3 folgt<br />
GWR� s� �<br />
1<br />
τ2WR� s � 1<br />
(5.13)<br />
� (5.14)<br />
� (5.15)<br />
s � � � 5 103 � s � � � 1 104� 3. Messeinrichtung<br />
Das Verhalten der Strom- bzw. Spannungsmessung wurde ebenfalls experimentell ermittelt und wird als<br />
Verzögerungsglied erster Ordnung nachgebildet. So ergibt sich als dritte Übertragungsfunktion die der<br />
Messeinrichtung<br />
s� � KMess<br />
GMess�<br />
τMesss � 1<br />
31<br />
�<br />
KMessω<br />
s � ωMess<br />
(5.16)<br />
� (5.17)
Mit KMess � 1 und τmess � 0� 15 � 10� 3 folgt<br />
GMess� s� �<br />
Damit ergibt sich die in Abbildung 5.2 gezeigte Anordnung.<br />
+<br />
-<br />
G (s)<br />
WR<br />
6 � 10 6� 3<br />
s � 6 � 103 �<br />
6�<br />
G (s)<br />
Mess<br />
G (s)<br />
L&R<br />
Abbildung 5.2.: Zu regelnde Strecke ohne Störgröße<br />
Für die Übertragungsfunktion des offenen Kreises Gs� s� folgt<br />
KL&Rω � KMessω<br />
Gs� s� � GWR� s� GMess� s� GL&R� s�<br />
�<br />
s � � � s ωWR1� � � s ωWR2� � � s ωMess� � � (5.18)<br />
ωL&R�<br />
Für diese Gs� s� Funktion werden in den Abschnitten 5.5 bis 5.6.2.4 verschiedene Reglerentwurfsverfahren erläutert.<br />
Da der Regler bei diesem aktiven Filter in einem Controller realisiert wird, muß das Ergebnis des Reglerentwurfs<br />
ein digitaler Regler sein.<br />
5.4. Störgrößenkompensation<br />
Bevor in den folgenden Abschnitten der Reglerentwurf behandelt wird, wird an dieser Stelle die Störgrößenkompensation<br />
(auch: Störgrößenaufschaltung) behandelt. Wenn es möglich ist, die Störgrößen zu kompensieren,<br />
können die Störgrößen beim Reglerentwurf vernachlässigt werden. Ferner wird in Kapitel 5.8.2 gezeigt, daß sich<br />
das Regelverhalten merklich verbessert, wenn eine Störgrößenkompensation erfolgt.<br />
Unter der Störgrößenkompensation versteht man nach [20, S. 273] die Rückführung der Störgröße in den Bereich<br />
des Reglers mit dem Ziel, die Einwirkung der Störgröße auf den Regelkreis möglichst zu kompensieren. Voraussetzung<br />
dafür ist, daß die Störgröße gemessen werden kann, ihr Eingriffsort bekannt ist und die Strecke genau<br />
bekannt ist. Diese Voraussetzungen sind hier gegeben.<br />
Wird die vereinfachte Regelstrecke aus Abbildung 5.2 um die Störgrößen Netzspannung, Laststrom und Kopplungsterme<br />
des Stroms sowie den Regler ergänzt, so ergibt sich Abbildung 5.3.<br />
idq soll<br />
+<br />
-<br />
idq ist<br />
Regler G (s)<br />
WR<br />
U Ndq<br />
+<br />
G (s)<br />
Mess<br />
iqdωL +-<br />
G (s)<br />
L&R<br />
Abbildung 5.3.: Regelkreis mit Störgrößen<br />
Nach [20, S.273ff] wird eine Störgröße genau dann vollständig kompensiert, wenn sie gemäß Abbildung 5.4 an<br />
den Reglerausgang zurückgeführt wird und für die Übertragungsfunktion<br />
GKomp� s� �<br />
32<br />
-<br />
1<br />
GStrecke� s�<br />
i Lqd<br />
+<br />
i dq<br />
(5.19)
gilt. Die Störgröße muß an den Reglerausgang zurückgeführt werden, da nur an dieser Stelle eine rechnerische<br />
Erf<br />
� assung im Controller möglich ist.<br />
+<br />
-<br />
Regler<br />
G komp(s)<br />
Störgröße<br />
-<br />
+ G (s)<br />
Strecke<br />
+<br />
Abbildung 5.4.: Prinzip der Störgrößenkompensation<br />
Für das aktive Filter bzw. den Regelkreis aus Abbildung 5.3 folgt damit Abbildung 5.5.<br />
G (s) +<br />
WRkomp<br />
UNdq idq soll<br />
- +-<br />
+ Regler + G (s) +<br />
WR<br />
- idq ist<br />
G (s)<br />
Mess<br />
-<br />
G (s)<br />
L&Rkomp<br />
-+<br />
iqdωL G (s)<br />
L&R<br />
Abbildung 5.5.: Regelkreis mit Störgrößenkompensation<br />
Eine Berechnung der Kompensationsübertragungsfunktion nach Gleichung 5.19 ist i.A. nicht möglich, da nach<br />
[20] die Zählerordnung einer Übertragungsfunktion einer realisierbaren Strecke höher als die des Nenners sein<br />
muß 4 . Dieses kann durch das Einfügen von zusätzlichen Polen erreicht werden. Die Zeitkonstanten der Pole<br />
sind klein gegenüber den Zeitkonstanten des Zählers zu wählen 5 , damit das Verhalten der realen Kompensationsübertragungsfunktion<br />
mit dem der Übertragungsfunktion nach Gleichung 5.19 vergleichbar ist. Dadurch ist<br />
gewährleistet. daß durch die Störgrößenaufschaltung die Störgrößen kompensiert werden.<br />
Die Kompensationsfunktionen sind im einzelnen:<br />
1. Für die Netzspannung<br />
Die Netzspannung reduziert die über der Spule anliegende Spannung und damit den Filterstrom. Sie greift<br />
nach dem Wechselrichter und vor der Kompensationsdrossel an. Folglich wird sie genau dann kompensiert,<br />
wenn die zugehörige Kompensationsübertragungsfunktion die inverse Übertragungsfunktion des Wechselrichters<br />
darstellt. Für die Praxis muß sie jedoch noch um entsprechende Polstellen ergänzt werden.<br />
s� � � s<br />
GWRkomp� � � s ωWR1� � ωWR2�<br />
s � � � 10� � ωWR1 s � � 10� ωWR2<br />
� � s � � 5 103 � � s � � 1 104� � s � � 5 104 � � s � � 1 105� i Ldq<br />
+<br />
(5.20)<br />
� (5.21)<br />
4 Vgl. hierzu, daß dies für diskrete Strecken zur sogenannten Nicht-Kausalität führt.<br />
5 Kleine Zeitkonstanten bedeutet große Knickfrequenzen. Von daher werden im Folgenden die Pole mit “10” multipliziert.<br />
33
2. Für die Kopplungsterme der dq-Komponenten des Stromes<br />
Da diese Störgröße an der gleichen Stelle eingreift wie die Netzspannung, ist auch die Kompensationsübertragungsfunktion<br />
die gleiche.<br />
3. Für den Laststrom<br />
Der Laststrom greift am Ausgang der Regelstrecke noch hinter der Kompensationsdrossel an. Um diese<br />
Störgröße an den Reglerausgang zurückzuführen, müssen sowohl die Übertragungsfunktion des Wechselrichters<br />
als auch die der Kompensationsdrossel berücksichtigt werden.<br />
Theoretisch würde es genügen, den Laststrom vor die Drossel zurückzuführen, er wäre dann auch kompensiert.<br />
Dieses hat jedoch keinen praktischen Nutzen, da er an dieser Stelle rechnerisch nicht in dem<br />
Controller erfasst werden kann.<br />
Mit<br />
s� � KL&Rkomp� s<br />
GL&Rkomp� � ωL&R�<br />
s � � ωL&R 10<br />
1� 1 � 10� � 3 s � � 4� 545�<br />
s � 5 5454�<br />
folgt als Kompensationsübertragungsfunktion für den Laststrom<br />
s�§� GWRkomp� s� � KL&Rkomp� s<br />
GL&Rkomp� � � s ωL&R� � � s ωWR1� � ωWR2�<br />
s � � � 10� � ωL&R s � � 10� � ωWR1 s � � 10� ωWR2<br />
1� � � 10� 1 3 � s � 5� � 545� s � 104 � � s � � 5 103� � s � 5� � 5454� s � 105 � � s � � 5 104� (5.22)<br />
� (5.23)<br />
Wie im weiteren Verlauf der Arbeit, insbesondere im Abschnitt 5.8.2, gezeigt wird, kann für die Kopplungsterme<br />
des dq-Stromes auf eine Störgrößenaufschaltung verzichtet werden, um die Regelalgorithmen zu beschleunigen.<br />
Dies ist im Gegensatz zur Netzspannungskompensation möglich, da es sich bei den Kopplungstermen um sehr<br />
kleine Größen handelt und deshalb der positive Einfluß der Kompensation im Vergleich zu dem erhöhten Rechenaufwand<br />
vernachlässigbar ist. Die Störgrößenkompensationen des Laststromes und der Netzspannung sind<br />
hingegen von großer Bedeutung.<br />
Der Einfluß der Störgrößenkompensation läßt sich am besten anhand der Simulationsergebnisse in Abbildung<br />
5.11 erkennen.<br />
5.5. Zeitkontinuierliche Regler<br />
Im Rahmen dieser <strong>Diplomarbeit</strong> soll ein im Zusammenhang mit aktiven Netzfiltern neuer Regelalgorithmus, eine<br />
sogenannte Dead Beat Regelung, entwickelt und getestet werden.<br />
Um die Qualität des entworfenen Dead Beat Reglers zu beurteilen und Aussagen bezüglich geeigneter Abtastfrequenzen<br />
für die Regelung aktiver Filter im Allgemeinen zu treffen, werden auch ein PI- sowie ein PID 2 -Regler in<br />
dieser Arbeit entworfen und getestet. Der Entwurf erfolgt zeitkontinuierlich nach dem Frequenzkennlinienverfahren<br />
und basiert auf Simulation unter Matlab/Simulink. In einem nächsten Schritt werden die zeitkontinuierlichen<br />
Regler diskretisiert.<br />
Wie in 5.3 erwähnt, wird der Regler auf optimales Führungsverhalten ausgelegt, da die Störgrößen als kompensierbar<br />
angesehen werden. Außerdem ist nach [20, S.229] auch sein Störverhalten optimal, wenn das Führungsverhalten<br />
optimal ist. Es kann bei dem Entwurf von der vereinfachten Darstellung des Systems in Abbildung 5.2<br />
ausgegangen werden.<br />
Der Entwurf soll nach dem Frequenzkennlinienverfahren [20] erfolgen. Zunächst wird dafür das Bodediagramm<br />
des offenen Regelkreises ermittelt. Dieses geschieht mittels Matlab. Das Bodediagramm des offenen Kreises<br />
34
ist Abbildung 5.6 zu entnehmen. Da das Filter neben der Blindleistungskompensation auch Oberschwingun-<br />
� gen dämpfen soll, mindestens aber Flicker vermeiden muß, ist es notwendig, daß die Übertragungsfunktion des<br />
offenen geregelten Gesamtsystems eine ausreichend hohe Verstärkung in dem Bereich der interessierenden Frequenzen<br />
aufweist. Dabei ist zu beachten, daß es durch die Koordinatentransformation zu einer Verschiebung<br />
der Frequenzen kommt. So werden die 5. und die 7. Oberschwingung in den UVW-Koordinaten zu einer 6.<br />
Oberschwingung in den dq-Koordinaten, die 11. und 13. werden zu einer 12. usw.<br />
5.5.1. PI-Regler<br />
Ordnungszahl Frequenz f / Hz Frequenz f / rad/s<br />
“Flicker” � 20 � 125� 7<br />
1. 50 314.2<br />
5. 250 1570.8<br />
7. 350 2199.1<br />
11. 550 3455.8<br />
13. 650 4084.1<br />
Tabelle 5.1.: Frequenzen der Netzoberschwingungen<br />
Der Vorteil des PI-Reglers liegt, trotz seiner Beschränkungen in Bezug auf die Regeldynamik, in der Einfachheit<br />
des Reglers und so in der guten Nachvollziehbarkeit der Regeleigenschaften.<br />
Ein Vergleich des Bodediagrammes von Gs� s� (der offenen Strecke) aus Abbildung 5.6 mit Tabelle 5.1 zeigt, daß<br />
es nicht möglich ist, einen stabilen Regler mit der Übertragungsfunktion GPI� s� zu entwerfen, der eine ausreichend<br />
hohe Verstärkung (also ein positives “gain”) bis zur 5. Oberschwingung gewährleistet, ohne das System<br />
instabil werden zu lassen. Der Regler wird so ausgelegt, daß das geregelte System G� s� eine Phasenreserve<br />
φR � 60 0 besitzt. Damit folgt die Durchtrittsfrequenz zu ωD � 840rad� s.<br />
Der Regler hat die folgende Struktur<br />
Mit<br />
s� � KPI� 1<br />
GPI� �<br />
s<br />
�<br />
τPIs�<br />
(5.24)<br />
� KI � KP<br />
s � (5.25)<br />
KPI � 500<br />
τPI � 1� 8 � 10� 3<br />
KP � 0� 9<br />
KI � 500<br />
ergibt sich das Bodediagramm des offenen Regelkreises aus Abbildung 5.6.<br />
Mit einem so ausgelegten Regler wird es nicht möglich sein, im Laststrom enthaltene Oberschwingungen wirkungsvoll<br />
zu dämpfen, es kann sogar zu einer Verstärkung kommen. Erfolgt jedoch eine gute Störgrößenkompensation,<br />
so ist trotzdem ein zufriedenstellendes Regelverhalten zu erwarten. Außerdem ist zu bedenken, daß<br />
das aktive Filter zur Kompensation von Flicker, verursacht durch eine Windenergieanlage, zum Einsatz kommen<br />
soll. Die hier in Betracht kommenden Frequenzen liegen im Bereich von 20Hz, einem Bereich, in dem der Regler<br />
eine ausreichend positive Verstärkung aufweist.<br />
35
5.5.2. PID 2 -Regler<br />
Ziel dieses Reglerentwurfes im Vergleich zu dem vorangegangenen PI-Reglerentwurf ist es, die Durchtrittsfrequenz<br />
ωD durch eine Phasenanhebung möglichst weit nach rechts zu höheren Frequenzen zu verschieben, um<br />
die Dynamik des Kreises zu verbessern und so einen Regler zu erhalten, der auch auf Oberschwingungen im<br />
Laststrom reagieren kann.<br />
Der Regler wird so ausgelegt, daß das geregelte System G� s� eine Durchtrittsfrequenz ωD � 4000rad� s mit einer<br />
Phasenreserve φR � 70 0 besitzt. Die Durchtrittsfrequenz ergibt sich aus Tabelle 5.1 und die Phasenreserve aus<br />
der Forderung nach einem ausreichend stabilen Regler (vgl. [20, S. 246]).<br />
Der Regler hat die folgende Struktur<br />
G 2� s� �<br />
PID KR� 1 �<br />
� 1 τR1s� �<br />
1 s� � τR2 s� 2<br />
� (5.26)<br />
N<br />
Dabei wir die Zeitkonstante τR1 so ausgelegt, daß sie die größte Zeitkonstante Gs� s� von aus Gleichung 5.18<br />
eliminiert. Damit folgt<br />
τR2s� 2<br />
τR1 � 1� 8 � 10� 3 �<br />
Die Zeitkonstante τR2 wird so gewählt, daß sie eine möglichst große Phasenvordrehung im Bereich der Durchtrittsfrequenz<br />
gewährleistet. Damit folgt<br />
τR2 � 0� 25 � 10� 3 �<br />
Der Term � 1 � τR2<br />
N s� 2 ist unerwünscht, da er eine Phasenrückdrehung bedeutet, also das System eher instabil<br />
macht. Er wird aber benötigt, da sonst der Regler nicht realisierbar ist. Der Nenner N ist so zu wählen, daß die<br />
Phasenrückdrehung das System nicht mehr instabil machen kann. Dies ist der Fall, wenn N so gewählt wird, daß<br />
die Phasenrückdrehung eine Dekade später einsetzt. Damit folgt<br />
N � 10�<br />
Der Verstärkungsfaktor KR des Reglers wird mit Hilfe des Bodediagramms 5.6 so bestimmt, daß bei der Durchtrittsfrequenz<br />
ωD die geforderte Phasenreserve φR � 70 0 vorhanden ist. Damit folgt<br />
KR � 2000�<br />
Als Gesamtübertragungsfunktion des Reglers folgt damit<br />
2� s� � GPID 360s3 � � �<br />
7� 3� � � 3� � 08 106s2 36 109s 2 1012 s3 � � 8 104s2 � 1� � 6 109 �<br />
s<br />
Das Bodediagramm des offenen Gesamtsystemes mit einem PID 2 -Regler wird wiederum mit Matlab bestimmt<br />
und ist Abbildung 5.6 zu entnehmen.<br />
Es zeigt sich, daß die Verstärkung in dem Bereich der interessierenden Frequenzen für die 5. und die 7. Oberschwingung<br />
ausreichend hoch ist, jedoch wie erwartet keine oder nur eine unzureichende Verstärkung im Bereich<br />
der 11. und der 13. Oberschwingung vorhanden ist. Der Regler wird nicht oder nur unzureichend in der Lage<br />
sein, diese Oberschwingung zu unterdrücken.<br />
5.6. Zeitdiskrete Regler<br />
Da die Regelung des aktiven Filters mittels Microcontroller erfolgt, muß das Ergebnis des Reglerentwurfs ein<br />
digitaler Regler sein. Die in den vorangegangenen Abschnitten entworfenen Regler, der PI- und der PID 2 -Regler,<br />
sind zeitkontinuierlich. Folglich müssen die Übertragungsfunktionen der kontinuierlichen Regler aus Gleichungen<br />
5.24 und 5.26 diskretisiert werden.<br />
36
Abbildung 5.6.: Bodediagramm für die offene Strecke ohne Regler und den offenen Regelkreis mit PI- und PID 2 -<br />
Regler<br />
Anschließend wird ein rein digitales Entwurfsverfahren, das der Dead Beat Regelung, vorgestellt.<br />
Als Vorgriff auf die später durchgeführten Messungen ist in Tabelle 5.2 die für jeden Regler maximal erreichbare<br />
Abtastzeit zusammengestellt. Die unterschiedlichen Zeiten ergeben sich aus dem unterschiedlich hohen Rechenaufwand<br />
für die jeweiligen Algorithmen. Dieser Tabelle kommt bei der Berechnung der Reglerkoeffizienten<br />
sowie bei den Störgrössenkompensationen eine große Bedeutung zu. Außerdem läßt sich unmittelbar ablesen,<br />
welche Verfahren auf Grund der extrem langsamen Abtastung in der Praxis nicht zum Einsatz kommen können -<br />
insbesondere sei hier auf die vollständige Störgrößenaufschaltung verwiesen.<br />
Die Zeiten hängen unmittelbar von dem verwendeten Controller ab und gelten für den in dieser Arbeit eingesetzten<br />
Controller Siemens 80C167. Ein entsprechend schnellerer Controller ermöglicht schnellere Abtastzeiten.<br />
Regler max. fTast/ kHz für 50V max. fTast/ kHz für 600V<br />
PI ohne Störgrößenaufschaltung 2.0 2.2<br />
PI mit vollständiger Störgrößenaufschaltung 1.1 –<br />
PID 2 ohne Störgrößenaufschaltung 1.8 –<br />
Dead Beat 1.4 1.65<br />
Dead Beat mit Vernachlässigung von p4, q4 1.65 1.8<br />
Tabelle 5.2.: Maximale Abtastzeiten der digitalen Regler<br />
5.6.1. Entwurf des digitalen Reglers durch Übergang vom s- in den z-Bereich<br />
Bei dem PI- und dem PID2-Regler aus den vorangegangenen Abschnitten handelt es sich um zeitkontinuierliche<br />
Regler. Folglich wird eine Transformation benötigt, die einen Übergang aus dem s- in den z-Bereich ermöglicht.<br />
Die eindeutige Abbildung<br />
z � e sT<br />
(5.27)<br />
37
mit der Abtastperiode T hat keine eindeutige Umkehrung.<br />
Die aus der “Trapezregel” der digitalen Integration oder aus der Reihenentwicklung für die Exponentialfunktion<br />
abgeleitete “Tustin Formel” [21]<br />
s � 2 z<br />
T<br />
� 1<br />
z � (5.28)<br />
1<br />
ermöglicht eine Transformation aus der s- in die z-Ebene. Allerdings handelt es sich hierbei um eine Näherung,<br />
so daß im Allgemeinen davon ausgegangen werden muß, keinen optimalen Regler in z zu erhalten.<br />
In den folgenden Abschnitten wird auf ein Ergebnis der in Kapitel 7 dargestellten Messergebnisse vorgegriffen.<br />
Je nach Regelaufwand ändert sich die maximal mögliche Abtastfrequenz fTast (vgl. Tabelle 5.2).<br />
5.6.1.1. PI-Regler<br />
Die Tustin Formel auf den im s-Bereich entworfenen Regler GPI� s� aus Gleichung 5.24 angewandt, ergibt den<br />
Regler im z-Bereich<br />
mit den Koeffizienten gemäß Tabelle 5.3.<br />
z� � GPI� K1z � K2<br />
z � 1<br />
fTast/ kHz K1 K2<br />
1.1 1.127 -0.673<br />
2.0 1.025 -0.775<br />
2.2 1.014 -0.786<br />
Tabelle 5.3.: Koeffizienten des PI-Reglers in Abhängigkeit von der Abtastfrequenz<br />
Das zugehörige Bodediagramm ist Abbildung 5.7 zu entnehmen.<br />
5.6.1.2. PID 2 -Regler<br />
(5.29)<br />
Die Tustin Formel auf den im s-Bereich entworfenen Regler G PID 2� s� aus Gleichung 5.26 angewandt, ergibt den<br />
Regler im z-Bereich mit fTast � 1� 8kHz<br />
G z� � 12� 63z<br />
PID2� 3 � 7� 921z2 � 0� 9388z � 0� 02562<br />
z3 � 0� 6697z2 � 0� 9727z � � (5.30)<br />
697 0�<br />
Das zugehörige Bodediagramm ist Abbildung 5.7 zu entnehmen.<br />
Im weiteren Verlauf dieser Arbeit wird der Einfluß der Abtastzeit noch ausführlich diskutiert, insbesondere der<br />
Einfluß einer schnelleren Abtastung. Für eine optimierte Abtastfrequenz von fTast � 5� 6kHz sieht die Gleichung<br />
für den PID 2 -Regler folgerndermaßen aus<br />
Das zugehörige Bodediagramm ist Abbildung 5.12 zu entnehmen.<br />
5.6.2. Digitales Entwurfsverfahren<br />
G z� � 33� 3z<br />
PID2� 3 � 61� 7z2 � 36� 04z � 6� 8<br />
z3 � 0� 125z2 � 0� 809z � � (5.31)<br />
316 0�<br />
Nachdem in den vorangegangenen Abschnitten der Entwurf zeitkontinuierlicher Regler mit anschließender Diskretisierung<br />
erläutert wurde, wird in diesem Abschnitt ein rein digitaler Reglerentwurf vorgestellt, der sogenannte<br />
38
Dead Beat Entwurf [21]. Ein nach diesem Verfahren entworfener digitaler Regler garantiert, daß das geregelte<br />
digitale System in einem Minimum von Abtastintervallen den Sollwert annimmt und beibehält. Der Regler<br />
wird folglich das beste Regelverhalten aufweisen. Nach [22, S. 226] muß allerdings beachtet werden, daß die<br />
Stellsignale sehr groß werden können.<br />
Bei dem Entwurf wird auf die maximal mögliche Abtastfrequenz fTast als ein Ergebnis der Messungen vorgegriffen<br />
(vgl. Tabelle 5.2).<br />
5.6.2.1. Diskretisierung der Strecke<br />
Für den Reglerentwurf ist in einem ersten Schritt die Digitalisierung der Streckenübertragungsfunktion Gs� s�<br />
(vgl. 5.18) notwendig. Da die Strecke im Zeit- bzw. s-Bereich sprungfähig ist, sollte diese Eigenschaft nach [21]<br />
auch bei der Diskretisierung erhalten bleiben. Mit anderen Worten, es wird eine sprunginvariante Transformation<br />
benötigt, so daß ein zeitdiskretes System erzeugt werdem kann, dessen Sprungantwort in den Abtastzeitpunkten<br />
mit denen des zeitkontinuierlichen Systems übereinstimmt. Die im vorherigen Abschnitt verwendete Tustin<br />
Formel kann aus diesem Grund nicht angewendet werden. Nach [21, S. 541] ist die Transformation<br />
z � 1<br />
z Z G� s�<br />
s<br />
(5.32)<br />
sprunginvariant. Dabei bedeutet Z G� s�<br />
s erst eine Rücktransformation der s-Übertragungsfunktion in den Zeitbereich<br />
und dann die Anwendung der Z-Transformation. Diese Transformation entspricht einem Abtastvorgang<br />
mit einem Halteglied nullter Ordnung.<br />
Damit ergibt sich für die mit 5.32 transformierte kontinuierliche Gs� s� Streckenübertragungsfunktion in allgemeiner<br />
Form<br />
z� � b1z�<br />
Ghs� 1 �<br />
b2z� 2 �<br />
b3z� 3 �<br />
b4z� 4<br />
1 � a1z� 1 � a2z� 2 � a3z� 3 � a4z� 4 � (5.33)<br />
Je nach Abtastfrequenz ergeben sich die Koeffizienten gemäß Tabelle 5.4.<br />
fTast�<br />
18� � 10�<br />
kHz b1 b2 b3 b4 a1 a2 a3 a4<br />
1.4 0.2417 0.2648 0.013 47 6 10� 0� � -0.7148 0.02564 1826 3 0� � 10� 1287 6<br />
55� 10� � 1.65 0.1741 0.2456 0.017 42 6 10� 0� � -0.7867 0.05 723 3 1� � 10� 424 6<br />
89� 10� � 1.8 0.1444 0.2325 0.02 59 6 10� 1� � -0.8293 0.06884 39 3 4� 10� � 373 6<br />
Tabelle 5.4.: Koeffizienten der diskreten Regelstrecke in Abhängigkeit der Abtastfrequenz<br />
5.6.2.2. Dead Beat Reglerentwurf<br />
Nach [21, S. 518] berechnet sich die Übertragungsfunktion des Dead Beat Reglers GDB� z� mit<br />
nach folgendem Schema:<br />
�<br />
� q0 q1z�<br />
GDB� z� 1 �<br />
q2z� 2 �<br />
q3z� 3 �<br />
q4z� 4<br />
1 � p1z� 1 � p2z� 2 � p3z� 3 � p4z� 4 (5.34)<br />
q0<br />
qi<br />
pi<br />
�<br />
1<br />
∑ 4 i� 1 bi<br />
� aiq0 (5.35)<br />
� biq0<br />
mit i � 0� ����� � 4. Dabei sind die Koeffizienten ai� bi nach Gleichung 5.33 bzw. Tabelle 5.4 bestimmt.<br />
Je nach Abtastfrequenz ergeben sich die Koeffizienten für den Dead Beat Regler gemäß Tabelle 5.5.<br />
Das zugehörige Bodediagramm ist Abbildung 5.7 zu entnehmen.<br />
39
fTast�<br />
� 0� � 10�<br />
kHz q0 q1 q2 q3 q4 p1 p2 p3 p4<br />
1.4 1.93 -1.38 0.05 35 3 � 10� 0� 25 6 10� � 35� 0.467 0.511 0.022 7 6<br />
1� � � 10� 0� 1.65 2.29 -1.79 114 65 3 � 10� 3� 25 6 126� � 0� 10� 0� 0� 398 563 039 6 6<br />
� 3� 10� � 1.8 2.52 -2.09 0.173 49 3 � 10� 11� 02 6 10� � 225� 0.364 0.5864 0.05 6 6<br />
Tabelle 5.5.: Koeffizienten des Dead Beat Reglers in Abhängigkeit der Abtastfrequenz<br />
5.6.2.3. Darstellung des diskreten PI-, diskreten PID 2 - und Dead Beat Reglers im Bodediagramm<br />
Abbildung 5.7.: Bodediagramm für die diskreten Regler für reale Abtastfrequenzen<br />
Es zeigt sich, daß die Durchtrittsfrequenz des digitalen PI-Reglers unverändert gegenüber der des zeitkontinuierlichen<br />
PI-Reglers aus Gleichung 5.24 bei ca. ωD � 850rad� s liegt. Daraus folgt, daß der digitale PI-Regler wie<br />
der zeitkontinuierliche PI-Regler nicht in der Lage ist, Oberschwingungen zu dämpfen. Ein anderes Ergebnis<br />
wäre auch verwunderlich gewesen.<br />
Es ist aber auch zu erkennen, daß die Durchtrittsfrequenz des Dead Beat Reglers in der gleichen Größenordnung<br />
wie die des PI-Reglers liegt. Folglich wird auch der Dead Beat Regler, trotz optimalen Entwurfsverfahrens, nicht<br />
in der Lage sein, Oberschwingungen zu dämpfen. Wie in Kapitel 5.9 gezeigt wird, hat ein Dead Beat Regler mit<br />
erhöhter Abtastfrequenz eine deutlich höhere Durchtrittsfrequenz.<br />
Als letztes Ergebnis aus Abbildung 5.7 ist noch festzuhalten, daß der digitalisierte PID 2 -Regler nach Gleichung<br />
5.30 unverändert gegenüber dem zeitkontinuierlichen PID 2 -Regler eine Durchtrittsfrequenz jenseits der 7. Oberschwingung<br />
besitzt, folglich eine gute Dämpfung von Oberschwingungen garantiert.<br />
5.6.2.4. Diskretisierung der Störgrößenaufschaltung<br />
Die für den s-Bereich in Kapitel 5.8.2 hergeleitete Störgrößenkompensation muß nun ebenfalls in den z-Bereich<br />
übertragen werden. Dazu wird die im Abschnitt 5.6.1 eingeführte Tustin Formel verwendet und auf die einzelnen<br />
40
kontinuierlichen s-Übertragungsfunktionen von Gleichung 5.20 und 5.22 angewendet. Die Berechnung erfolgt<br />
wiederum<br />
� mittels Matlab.<br />
Im Einzelnen ergibt sich damit für<br />
1. die Netzspannungskompensation<br />
mit den Koeffizienten gemäß Tabelle 5.6.<br />
� z� � a1z<br />
GkompUN 2 �<br />
a2z � a3<br />
z2 � b1z � � (5.36)<br />
b2<br />
fTast� kHz a1 a2 a3 b1 b2<br />
1.1 1.647 1.693 0.4094 1.873 0.8763<br />
1.4 1.839 1.553 0.2918 1.839 0.8452<br />
1.65 2.005 1.421 0.2069 1.812 0.8202<br />
2.0 2.244 1.211 0.1068 1.775 0.7863<br />
Tabelle 5.6.: Koeffizienten der Übertragungsfunktion der Netzspannungskompensation<br />
2. die Kompensation der Kopplungsterme<br />
3. die Laststromkompensation<br />
� z� � GkompiLast<br />
a0z3 �<br />
a1z2 �<br />
a2z � z<br />
a3<br />
3 � b1z2 � b2z � mit den Koeffizienten gemäß Tabelle 5.7.<br />
b3<br />
GkompiωL � z� � GkompUN � z� � (5.37)<br />
fTast� kHz a0 a1 a2 a3 b1 b2 b3<br />
1.1 4.004 1.704 -1.485 -0.5999 2.483 2.019 0.5348<br />
1.4 5.175 0.8831 -2.124 -0.5533 2.369 1.818 0.4472<br />
1.65 6.222 -0.04812 -2.516 -0.4599 2.28 1.667 0.3833<br />
2.0 7.79 -1.716 -2.824 -0.2819 2.164 1.477 0.3058<br />
Tabelle 5.7.: Koeffizienten der Übertragungsfunktion der Laststromkompensation<br />
5.7. Vergleich der digitalen Regler anhand der Sprungantwort des<br />
geschlossenen Regelkreises<br />
(5.38)<br />
In diesem Abschnitt wird das Regelverhalten der digitalen PI-, PID 2 - und Deat Beat Regler an Hand der Sprungantworten<br />
der geregelten Systeme miteinander verglichen. Die Simulation geschieht mit Matlab. In Abbildung<br />
5.8 sind die Sprungantworten des geschlossenen Regelkreises für die verschiedenen digitalen Regler dargestellt.<br />
Auffällig ist, daß die drei Regler nach etwa der gleichen Zeit eingeschwungen sind. Sowohl der Dead Beat Regler<br />
als auch der digitale PI-Regler nähern sich dem Sollwert ohne Überschwingen. Der Dead Beat Regler erreicht<br />
der Theorie folgend nach ca. vier Abtastschritten den Sollwert. Der PID2-Regler schwingt sich dagegen mit einer<br />
Frequenz von ca. fTast<br />
2 ein. In der Praxis und in der Simulation wird sich später zeigen, daß der PID2-Regler trotz<br />
einer ausreichend hohen Phasenreserve instabil ist. Er schwingt sich genau mit dieser Frequenz auf. Ein System<br />
wird instabil, obwohl es eine ausreichend hohe Phasenreserve aufweist, wenn die Frequenz mit der es sich bei<br />
einem Sprung der Führungsgröße einschwingt, in dem Bereich der Eigenfrequenz liegt.<br />
41
Abbildung 5.8.: Vergleich der drei Reglerentwürfe anhand der Sprungantwort des Gesamtsystems mit realen Abtastfrequenzen<br />
5.8. Simulation des Regelkreises mit Simulink<br />
Um die drei in den vorangegangenen Abschnitten entworfenen digitalen Regler, den PI-, den PID 2 - und den Dead<br />
Beat Regler, auf praxisnahes Regelverhalten zu untersuchen, ist das aktive Filter mit jeweils einem der Regler<br />
mittels Simulink nachgebildet worden (vgl. Anhang B.3). Die Kopplungsinduktivität ist gemäß Gleichung 5.10,<br />
der Wechselrichter gemäß 5.13 und die Messeinrichtung gemäß 5.16 berücksichtigt worden.<br />
Das vollständige System kann im Anhang B.3 gefunden werden.<br />
Eine Schwachstelle der Simulation ist, daß der Wechselrichter nur durch ein Verzögerungsglied zweiter Ordnung<br />
nachgebildet wird. Ein vollständiges Modell des Wechselrichters ist jedoch unter Simulink auf Grund des Umfangs<br />
nicht zu realisieren. Auch verwendet das Modell die dq-Transformation nach 3.13 und nicht nach 3.19, da<br />
es nicht möglich ist, die Transformation nach 3.19 in Simulink nachzubilden. Die zweite, ungenauere Transformation<br />
wird jedoch in dem mittels Controller realisierten Regler verwendet, da sie ohne zusätzliche pll o.ä. zur<br />
Erfassung des Winkels θ auskommt.<br />
Trotz dieser beiden Einschränkungen hat das Modell eine sehr gute Übereinstimmung mit der Praxis gezeigt.<br />
5.8.1. Vergleich der Regler in der Simulation<br />
Um die Qualität der digitalen Regler beurteilen zu können, werden in der Simulation die Netzspannung, der<br />
Laststrom und der Sollstrom gemäß Tabelle 5.8 verwendet.<br />
In der Simulation hat sich gezeigt, daß sich der PID 2 -Regler mit der Frequenz aufschwingt, mit der er sich in<br />
Abbildung 5.8 einschwingt. Da der PID 2 -Regler auch in der Praxis instabil ist, wird im folgenden auf eine<br />
simulative und meßtechnische Untersuchung verzichtet.<br />
Die Abbildungen 5.9 und 5.10 verdeutlichen das unterschiedliche Regelverhalten und zeigen, wie auch schon<br />
42
� t� t� uN� isoll� t�<br />
Laststrom iLast Netzspannung Sollstrom<br />
Amplitude der Grundschwingung 10 A 565 V 10 A<br />
Amplitude der 5. Oberschwingung 2 A 18.8 V (= 565V/30) 0 A<br />
Amplitude der 7. Oberschwingung<br />
Phasenwinkel zur Netzspannung<br />
1,42 A – 0 A<br />
2π<br />
7 – 0�<br />
Tabelle 5.8.: Von der Simulation verwendete Werte<br />
der Vergleich der Sprungantworten gezeigt hat, daß der Dead Beat Regler gegenüber dem PI-Regler das bessere<br />
Regelverhalten aufweist.<br />
a) PI-Regler fTast � 2� 0kHz b) Dead Beat Regler fTast � 1� 65kHz<br />
Abbildung 5.9.: Vergleich der Reglerentwürfe an Hand des Netzstroms<br />
Bei der Bewertung der beiden Abbildungen ist jedoch darauf zu achten, daß die Aufnahme mit Laststromkompensation<br />
erfolgte. Sie geben also nur bedingt das tatsächliche dynamische Verhalten wieder. Trotz Kompensation<br />
ist deutlich die 5. Oberschwingung zu erkennen.<br />
a) PI-Regler fTast � 2� 0kHz b) Dead Beat Regler fTast � 1� 65kHz<br />
Abbildung 5.10.: Vergleich der Reglerentwürfe an Hand des Spektrums des Netzstroms<br />
5.8.2. Einfluss der Störgrößenkompensation<br />
Um die Wichtigkeit der Störgrößenkompensation hervorzuheben, werden für den Dead Beat Regler die Netzströme<br />
für einen Regelkreis mit und ohne Laststromkompensation und mit und ohne Kompensation der Kopplungs-<br />
43
terme ermittelt.<br />
Zum Zeitpunkt T=0,03s wird die Laststromkompensation ausgeschaltet und liefert das Spektrum aus Ab-<br />
�<br />
bildung 5.11 b).<br />
Zum Zeitpunkt T=0,07s wird die Lastsromkompensation wieder eingeschaltet und die Kompensation für<br />
�<br />
die Kopplungsterme des ωLId� Stroms q ausgeschaltet, diesmal ergibt sich das Spektrum aus Abbildung<br />
5.10 b).<br />
Das Ergebnis ist das gleiche für den PI-Regler.<br />
a) Netzstrom für verschiedene Kompensationen b) Spektrum des Netzstromes ohne Kompensation<br />
Abbildung 5.11.: Einfluß der Laststromkompensation auf die Qualität der Regelung<br />
5.8.3. Auswertung der Simulation mit Simulink<br />
Aus der Simulation lassen sich zwei wesentliche Erkenntnisse ziehen:<br />
1. Der Einfluß der Kompensation der Kopplungsterme ist vernachlässigbar.<br />
2. Es ist zu erkennen, daß für beide Regler die Durchtrittsfrequenz zu klein ist, also keine Dämpfung der<br />
Oberschwingungen stattfindet. Im Gegenteil, die Oberschwingungen werden sogar noch verstärkt.<br />
Die später durchgeführten Messungen auf der 50V Ebene zeigen, wie auch schon die Simulation, daß die unzureichende<br />
Dynamik keinen großen Einfluß auf die Qualität des Netzstroms hat. Wird jedoch mit Nennspannung<br />
gearbeitet, so ist die Netzspannung stark oberschwingungsbehaftet. Die Regler werden nicht mehr oder zumindest<br />
nur noch sehr schlecht arbeiten. Wird hingegen mit einer rein sinusförmigen Netzspannung gearbeitet, so ist<br />
hier ebenfalls ein gutes Regelverhalten zu erwarten.<br />
Bei oberschwingungsbehafteter Netzspannung schafft der PID 2 -Regler Abhilfe. Er neigt jedoch bei der maximal<br />
erreichbaren Abtastfrequenz zum Schwingen.<br />
In Kapitel 5.9 wird daher untersucht, ob der Dead Beat Regler und der PID 2 -Regler durch Erhöhung der Abtastfrequenz<br />
gute Ergebnisse liefern können. Eine höhere Abtastfrequenz ließe sich u.a. durch einen schnelleren<br />
Prozessor realisieren.<br />
44
5.9. Einfluß einer höheren Abtastfrequenz<br />
In diesem Abschnitt soll der Einfluß einer höheren Abtastfrequenz fTast � 5� 6kHz untersucht werden, wie sie<br />
z.B. mit einem schnelleren Prozessor erreicht werden könnte. Da der kontinuierliche PI-Regler eine Durchtrittsfrequenz<br />
unterhalb der 5. Oberschwingung hat, ist nicht zu erwarten, daß der digitale PI-Regler ein besseres<br />
Verhalten zeigt, auch nicht mit erhöhter Abtastfrequenz. Von daher beschränkt sich dieses Kapitel auf den Dead<br />
Beat Regler und den digitalen PID 2 -Regler. Für diese beiden Regler wird untersucht, ob es möglich ist, die<br />
Durchtrittsfrequenz ausreichend weit nach rechts zu hohen Frequenzen zu verschieben. Die Bodediagramme für<br />
den Dead Beat Regler und den PID 2 -Regler sind Abbildung 5.12 und die Sprungantworten Abbildung 5.13 zu<br />
entnehmen.<br />
Abbildung 5.12.: Bodediagramme für den offenen Regelkreis mit Dead Beat Regler und mit PID 2 -Regler für eine<br />
optimierte Abtastfrequenz von fTast � 5� 6kHz<br />
Wie zu erwarten war, ist die Durchtrittsfrequenz des Dead Beat Reglers deutlich zu höheren Frequenzen verschoben.<br />
Genau wie der digitale PID 2 -Regler wird auch der Dead Beat Regler in der Lage sein, auf Oberschwingungen<br />
zu reagieren. In der Sprungantwort fällt auf, daß sich der digitale PID 2 -Regler nicht mehr mit einer<br />
eindeutigen Frequenz einschwingt. Wie den Abbildungen 5.14 a) und b) zu entnehmen ist, ist er jetzt stabil und<br />
zeigt das erwartete gute Regelverhalten auch bei oberschwingungsbehafteten Strömen und Spannungen mit und<br />
ohne Laststromkompensation.<br />
Der Eindruck, daß der Oberschwingungsgehalt mit und ohne Laststromkompensation gegenüber einer langsameren<br />
Abtastfrequenz verringert wird, zeigt sich in Abbildung 5.15.<br />
5.10. Zusammenfassung des Kapitels 5<br />
In diesem Kapitel wurden drei verschiedene digitale Regler entworfen und analysiert sowie ein praxisnahes<br />
Modell zum Vergleich der Regeleigenschaften entwickelt. Mittels Simulation unter Matlab/Simulink wurden die<br />
Regler auf Stabilität sowie Regelverhalten untersucht.<br />
45
Abbildung 5.13.: Sprungantworten des geschlossenen Regelkreises mit Dead Beat Regler und mit digitalem<br />
PID 2 -Regler für eine optimierte Abtastfrequenz von fTast � 5� 6kHz<br />
a) mit Laststromkompensation b) ohne Laststromkompensation<br />
Abbildung 5.14.: Netzstrom ohne Laststromkompensation für eine Abtastfrequenz fTast � 5� 6kHz mit digitalem<br />
PID 2 -Regler<br />
Der PI- und PID 2 -Regler wurden in der s-Ebene entworfen und anschließend diskretisiert. Der Dead Beat Regler<br />
ist ein digitaler Regler, der aus einem rein digitalen Entwurfsverfahren hervorgeht.<br />
Die Schwäche des PI- und Dead Beat Reglers liegt in der Kompensation von Oberschwingungen, da jeweils ihre<br />
Dynamik nicht ausreicht. Dies ist auf die zu langsame Abtastung, bedingt durch den verwendeten Controller,<br />
zurückzuführen. Zieht man jedoch in Betracht, daß die Regler in einem aktiven Filter, das zur Vermeidung von<br />
Flicker und zur Korrektur eines Phasenwinkels φ dient, zum Einsatz kommen, so erfüllen sie diesen Zweck. Jedoch<br />
kann die unzureichende Dynamik in Netzen mit starkem Oberschwingungsgehalt zu einem sehr schlechten<br />
Verhalten, bis hin zu Instabilitäten führen.<br />
46
a) mit Laststromkompensation b) ohne Laststromkompensation<br />
Abbildung 5.15.: Spektrum des Netzstromes für eine Abtastfrequenz von fTast � 5� 6kHz mit digitalem PID 2 -<br />
Regler<br />
Die Möglichkeit, ein auch unter dynamischen Gesichtspunkten sehr gutes Regelverhalten mittels Dead Beat<br />
Regler und PID 2 -Regler zu erreichen, wurde gezeigt. Die Abtastfrequenz muß ausreichend hoch gewählt werden,<br />
z.B. durch den Einsatz eines schnelleren Microcontrollers.<br />
47
6. Realisierung der Regelung mit einem Microcontroller<br />
Um die im vorangegangenen Abschnitt theoretisch hergeleiteten Regelungen in der Praxis zu untersuchen, wird<br />
ein aktives Filter gemäß Abbildung 1.2 aufgebaut. Die Ansteuerung der IGBT’s des Pulswechselrichters sowie<br />
die Regelung mit jeweils einem der entwickelten Algorithmen übernimmt der Microcontroller SAB 80C167 von<br />
Siemens.<br />
Die in diesem Kapitel beschriebenen Programmteile bauen auf den in [2] entworfenen und in [3] sowie [4]<br />
erweiterten Programmen auf und modifizieren und erweiteren diese.<br />
Im Anhang A ist das Gesamtprogramm dargestellt.<br />
6.1. Übergang aus dem z- in den Zeitbereich<br />
Die im Kapitel 5.6.2 abgeleiteten Beziehungen in der z-Ebene müssen, damit sie auf dem Controller realisiert<br />
werden können, in den Zeitbereich überführt werden. Die notwendige Vorgehensweise wird anhand eines Beispiels<br />
exemplarisch gezeigt und ist dann auf die interessierenden Gleichungen übertragbar.<br />
Wenn G� z� eine beliebige Übertragungsfunktion eines diskreten Systems in der z-Ebene darstellt und durch<br />
z� � G� Y z� �<br />
� z� U<br />
�<br />
a1z� � a0<br />
1 �<br />
a2z� 2<br />
1 � b1z� 1 � b2z� 2 (6.1)<br />
beschrieben wird, so wird der Ausgangswert y� kT � � yk zum Zeitpunkt kT gewonnen, indem die Gleichung 6.1<br />
ausmultipliziert und nach Y � z� umgestellt wird. So erhält man<br />
�<br />
� �<br />
� z� � z� z� z� Y a0U a1U 1 �<br />
z� � z� a2U 2 �<br />
z� � z� b1Y 1 �<br />
z� � z� b2Y 2� (6.2)<br />
Unter Zuhilfenahme des Verschiebungssatzes folgt dann der gesuchte Zusammenhang<br />
yk � � �<br />
a0uk a1uk 1 a2uk 2 � �<br />
� �<br />
b1yk 1 b2yk 2� (6.3)<br />
� �<br />
Mit anderen Worten, der Ausgangswert des Systems zum Zeitpunkt kT berechnet sich aus dem aktuellen Eingangswert<br />
sowie den zwei vorangegangenen Eingangswerten und den zwei vorangegangenen Ausgangswerten,<br />
jeweils mit einem Faktor (a0� a1� a2� b1� b2) gewichtet.<br />
Mit den Beziehungen 5.29, 5.30, 5.31, 5.36 und 5.38 folgt für<br />
1. den Regler<br />
a) PI<br />
b) PID 2<br />
c) Dead Beat<br />
yRk � a0uk<br />
yRk � � �<br />
K1uk K2uk 1 yk 1 (6.4)<br />
� �<br />
� � � � � �<br />
a1uk 1 a2uk 2 a3uk 3 b1yk 1 b2yk 2 b3yk� 3 (6.5)<br />
� � � � �<br />
yRk � � � � � � � � �<br />
p0uk p1uk 1 p2uk 2 p3uk 3 p4uk 4 q1yk 1 q2yk 2 q3yk 3 q4yk� 4� (6.6)<br />
� � � � � � �<br />
48
wobei die Eingangsgrößen ui, mit i � k����� k � 5, die Fehler aus dem Vergleich des Stromsollwerts mit dem<br />
Stromistwert zu den Zeitpunkten i sind,<br />
2. die Kompensation der Netzspannung<br />
yUkompk � � � � �<br />
a0uk a1uk 1 a2uk 2 b1yk 1 b2yk 2� (6.7)<br />
� � � �<br />
wobei die Eingangsgrößen ui, mit i � k����� k � 2, die dq-Transformierten der Netzspannung zum Zeitpunkt i<br />
sind,<br />
3. die Kompensation des Laststromes<br />
yLkompk � a0uk<br />
� � � � � �<br />
a1uk 1 a2uk 2 a3uk 3 b1yk 1 b2yk 2 b3yk� 3� (6.8)<br />
� � � � �<br />
wobei die Eingangsgrößen ui, mit i � k����� k � 3, die dq-Transformierten des Laststroms zum Zeitpunkt i<br />
sind.<br />
Die Addition der Gleichungen 6.4, 6.5 bzw. 6.6 und 6.7 sowie 6.8<br />
ygesk � yRk<br />
� �<br />
yUkompk yLkompk (6.9)<br />
gibt dann die Spannung, die zu jedem Zeitpunkt kT von dem Wechselrichter bereitgestellt werden muß, damit<br />
ein bestimmter Laststrom zu diesem Zeitpunkt zu einem gewünschten Wert ergänzt wird.<br />
6.2. Abweichungen der realisierten Regelalgorithmen von der Theorie<br />
Bei der Realisierung der entworfenen Regelalgorithmen auf einem Microcontroller muß, um eine ausreichend<br />
hohe Abtastfrequenz zu erhalten, an zahlreichen Stellen von Vereinfachungen Gebrauch gemacht werden. So ist<br />
es bei diesem Controller aus Zeitgründen nicht möglich, mit Gleitkommazahlen zu rechnen, da der Prozessor<br />
nicht über eine “floating point arithmetic unit” verfügt. Durch die ausschließliche Verwendung von Integer-<br />
Zahlen (Quantisierung) kommt es unvermeidbar zu Rechenungenauigkeiten.<br />
Der eingesetzte Prozessor SAB 80C167 verfügt über eine 20MHz schnelle CPU und ermöglicht nach [24] eine<br />
Ganzzahladdition in 100ns, eine Ganzzahlmultiplikation in 500ns und eine Ganzzahldivision in 1µs. Diese Werte<br />
sind nur Richtlinien und gelten für 16bit Zahlen (int). Es ist aber unvermeidbar, aus Gründen der Genauigkeit bei<br />
zahlreichen Berechnungen auf 32bit Zahlen (long int) zurückzugreifen. Damit verlängern sich die angegebenen<br />
Berechnungen z.T. erheblich. Wird eine Abtastfrequenz von mindestens 2kHz angestrebt, so bleiben dem Controller<br />
500µs für die Durchführung sämtlicher AD-Wandlungen, Berechnungen, Beschreiben der PW-Register,<br />
etc. Folglich ist es notwendig, die Anzahl der Additionen und Multiplikationen in den jeweiligen Algorithmen<br />
zu beschränken, auch wenn dabei die Genauigkeit sinkt.<br />
Die Vereinfachungen und Abänderungen sind im Einzelnen:<br />
1. Vereinfachung der Störgrößenaufschaltung für die Netzspannung<br />
Durch Messungen hat sich gezeigt, daß die errechnete Störgrößenaufschaltung vereinfacht werden kann,<br />
ohne merklich an Wirkung zu verlieren. Anstelle von Gleichung 5.36 wird die Netzspannung direkt in den<br />
αβ-Koordinaten zum Reglerausgang hinzuaddiert. Dies macht sich durch einen schnelleren Regler positiv<br />
bemerkbar.<br />
2. Verzicht auf die Störgrößenaufschaltung für den Laststrom<br />
Obwohl die Simulation eindeutig ergeben hat, daß das Regelverhalten durch eine Laststromkompensation<br />
verbessert wird, muß in dem realisierten Regler zu Gunsten eines schnelleren Regelalgorithmus darauf<br />
verzichtet werden. Es hat sich gezeigt, daß die Abtastfrequenz mit vollständiger Störgrößenaufschaltung<br />
auf ca. 1,1kHz statt der sonst möglichen 2kHz sinkt, eine Regelung daher praktisch unmöglich wird.<br />
Abhilfe kann hier ein schnellerer Prozessor schaffen.<br />
49
3. Wie im Folgenden noch gezeigt werden wird, kann es für den Dead Beat Regler durchaus sinnvoll sein,<br />
die Koeffizienten p4 und q4 zugunsten eines schnelleren Regelalgorithmus zu vernachlässigen. Der Geschwindigkeitsgewinn<br />
gleicht den Genauigkeitsverlust aus.<br />
6.3. Das Programm<br />
Wie schon erwähnt, bauen die in diesem Kapitel beschriebenen Programmteile auf bereits vorhandenen C-<br />
Programmen auf. Die vorhandenen Sourcecodes werden an zahlreichen Stellen modifiziert bzw. ergänzt, zum<br />
einen um die maximal mögliche Abtastfrequenz zu erhöhen, zum anderen um die neuen Regelalgorithmen zu<br />
implementieren. Die Struktur des gesamten Projektes wurde jedoch nur an wenigen Stellen verändert, so daß<br />
für eine ausführliche Darstellung der Funktionsweise auf [3] verwiesen wird. Aus diesem Grund werden im<br />
Folgenden die Programmteile sehr knapp erläutert.<br />
Das gesamte Projekt ist modular aufgebaut. Die Module werden durch das Compilieren statisch gelinkt. Wie im<br />
Anhang A zu erkennen ist, gehört zu jedem C-Programm eine entsprechende Headerdatei, in der die notwendigen<br />
Deklarationen etc. erfolgen.<br />
6.3.1. globals.h<br />
In der Headerdatei globals.h werden die für die Regelung spezifischen Größen, wie z.B. Reglerkoeffizienten,<br />
Normierungsfaktoren, etc. definiert.<br />
Durch das Setzten des Parameters “Reglertyp” wird entschieden, welcher Regelalgorithmus, also Zustandsregler<br />
(siehe [3]), PI-Regler oder Dead Beat Regler, verwendet werden soll. Damit ist es sehr einfach möglich, die<br />
verschiedenen Regelalgorithmen miteinander zu vergleichen. Eine weitere für das Regelverhalten entscheidende<br />
Größe, die Taktfrequenz des Reglers, wird ebenfalls hier eingestellt.<br />
6.3.2. main.c<br />
In der main.c finden alle notwendigen Initialisierungen, das Erstellen der verwendeten Tabellen sowie die Berechnung<br />
der normierten Regelparameter statt. Dieser Programmteil ist der einzige, in dem “floats” verwendet<br />
werden. Dieses ist zulässig, da die Erstellung der Tabellen, die Berechnung der Reglerkoeffizienten etc. zu Beginn<br />
des Programms stattfinden, bevor das Filter bzw. dessen Regelung aktiviert wird. Sind alle Initialisierungen<br />
abgeschlossen, so erfolgt durch “IEN=1 1 ” eine globale Interruptfreigabe und die Regelung nimmt den Betrieb<br />
auf.<br />
6.3.3. adc.c<br />
In der adc.c finden alle AD-Wandlungen statt. Der 10bit AD-Wandler 2 wird mit der Frequenz fTast durch einen<br />
“timer interrupt” (von T4) aufgerufen und durch den PEC 3 bedient. Die Abtastfrequenz variiert in Abhängigkeit<br />
vom Reglertyp.<br />
Es werden zwei verkettete Netzspannungen, zwei Wechselrichterströme sowie zwei Phasenströme gemessen.<br />
Der eigenliche Regelalgorithmus ist in der Funktion “filtere_netz” enthalten. Die Funktion “filtere_netz” wird<br />
nach der Beendigung der AD-Wandlungen aufgerufen und berechnet die neue Wechselrichterausgangsspannung.<br />
Zunächst werden die gemessenen Größen mittels Transformation 3.7, 3.9 und 3.10 in die αβ-Koordinaten transformiert,<br />
dann mittels 3.17 und 3.19 in die dq-Koordinaten. Anschließend werden sowohl die Regelalgorithmen<br />
1 interrupt enable<br />
2 Analog/Digital Wandler<br />
3 peripheral event controller<br />
50
als auch die Störgrößenaufschaltungen (soweit aus Zeitgründen möglich) durchgeführt, bevor abschließend eine<br />
� Rücktransformation gemäß 3.20 erfolgt. Der so erhaltene Raumzeiger der Wechselrichterausgangsspannung in<br />
αβ-Koordinaten wird nach erfolgter Sektoridentifikation mittels Gleichung 2.2, 2.3 und 2.4 in die Stellzeiten der<br />
einzelnen IGBT’s umgerechnet. Mit dem Beschreiben der PW-Register ist der Regelalgorithmus beendet und<br />
eine erneute AD-Wandlung ist möglich.<br />
51
7. Meßergebnisse<br />
In diesem Kapitel werden die für den PI- und den Dead Beat Regler erzielten Ergebnisse dargestellt und mit<br />
dem in [2] und [3] entworfenen Zustandsregler verglichen. Da der Zustandsregler bei Erstellung dieser Arbeit<br />
nicht einwandfrei funktionierte, wenn Lastströme zu kompensieren waren, konnte er zum Vergleich nur für den<br />
laststromfreien Fall herangezogen werden.<br />
Das Filter mit den verschiedenen Regelalgorithmen wird schrittweise in Betrieb genommen.<br />
1. verminderte Netz- und Zwischenkreisspannung<br />
a) Einspeisung eines Stroms in das Netz ohne Laststrom<br />
b) Einspeisung eines Stroms in das Netz mit sinusförmigem Laststrom<br />
c) Einspeisung eines Stroms in das Netz mit B6 Brücke als Last<br />
2. Nennwerte für Netz- und Zwischenkreisspannung<br />
a) Erzeugung eines Stroms durch drei in Stern geschaltete Widerstände, mit und ohne oberschwingungsbehafteter<br />
Netzspannung<br />
b) Einspeisung eines Stromes in das Netz ohne Laststrom, mit und ohne oberschwingungsbehafteter<br />
Netzspannung<br />
Um die gemessenen Stromverläufe besser bewerten zu können, wird mittels Messung das Spektrum des Stroms<br />
bestimmt. So ist es möglich, als Bewertungskriterium den Grundschwingungsgehalt gemäß<br />
zu erhalten.<br />
I1 � IGrundschwingung<br />
∑ N n� 0 I2 n<br />
7.1. Reduzierte Netz- und Zwischenkreisspannung<br />
Die reduzierte Zwischenkreisspannung ist UZKred � 50V und die reduzierte Netzspannung ist UNredU� V� W � 15� 1V�<br />
Der Netzsollstrom soll in jedem Fall 5,7A betragen. Der Sollstrom und die Sollphase werden über zwei Potentiometer<br />
getrennt voneinander vorgegeben. Später werden diese Werte von dem Energiemanagement vorgegeben.<br />
7.1.1. PI-Regler<br />
Zunächst wird das Regelverhalten des Filters mit PI-Regler untersucht.<br />
Der PI-Regler ist so weit optimiert, daß eine Tastfrequenz von fTast � 2kHz möglich ist.<br />
In der “globals.h” muß “Reg_Typ_Netz=2” und “ABT_FREQ=2000” gesetzt werden.<br />
52<br />
(7.1)
UWR<br />
U<br />
UWR V<br />
PWR<br />
UWR<br />
W<br />
U N U<br />
U N V<br />
U N W<br />
Abbildung 7.1.: Anschluß des Wechselrichters bei Stromeinspeisung in das Netz mit reduzierten Spannungen,<br />
ohne Laststrom<br />
7.1.1.1. Stromeinspeisung in das Netz ohne Laststrom<br />
In einem ersten Schritt wird der Strom in das Netz eingespeist, ohne daß Lastströme fließen (vgl. Abbildung 7.1).<br />
Dabei wird ein Phasenwinkel φ � 0 0 angestrebt.<br />
Die gemessenen Ströme sind Abbildung 7.2 zu entnehmen.<br />
Abbildung 7.2.: Phasenströme bei Einspeisung in das Netz ohne Laststrom mit PI-Regler<br />
Deutlich ist in der Netzspannung die 5. Oberschwingung zu erkennen.<br />
Eine zweite Messung ergab einen Effektivwert der Grundschwingungen von I1 � 5� 7A und einen Grundschwingungsgehalt<br />
von I1 � 99� 5%�<br />
Zu beachten ist, daß nicht nur die Netzspannung die 5. Oberschwingung enthält sondern auch der Laststrom.<br />
7.1.1.2. Stromeinspeisung in das Netz mit sinusförmigem Laststrom<br />
In diesem Schritt wird der Regelalgorithmus auf seine Fähigkeit hinsichtlich Laststromkompensation eines sich<br />
langsam ändernden Laststroms (mit Flicker vergleichbar) untersucht und, wie in Abbildung 7.3 dargestellt, angeschlossen.<br />
Der Netzstrom wird mit verschiedenen Phasenwinkeln eingeprägt. Der Phasenwinkel kann nur in<br />
einem Bereich von � 90 o geändert werden, da das Netzgerät, das die Zwischenkreisspannung erzeugt, nicht in<br />
der Lage ist, Energie aufzunehmen.<br />
53
UWR<br />
U<br />
UWR V<br />
PWR<br />
UWR<br />
W<br />
Last<br />
U N U<br />
U N V<br />
U N W<br />
Abbildung 7.3.: Anschluß des Wechselrichters bei Stromeinspeisung in das Netz mit reduzierten Spannungen,<br />
mit Laststrom<br />
Die gemessenen Ströme sind Abbildung 7.4a), b) und c) zu entnehmen.<br />
a) φ ��� 90 0 b) φ � 0 0 c) φ � � 90 0<br />
Abbildung 7.4.: Phasenströme bei Einspeisung in das Netz mit sinusförmigem Laststrom mit PI-Regler<br />
In jedem der drei Fälle beträgt der Effektivwert der Grundschwingung I1 � 5� 7A. Es findet eine eindeutige<br />
Trennung von Betrag und Phase in dem Regelalgorithmus statt.<br />
Deutlich ist der Einfluß des Phasenwinkels in Bezug auf die Güte des Reglers zu erkennen. Für eine Phasenverschiebung<br />
von -90� ist der Grundschwingungsgehalt I1 � 97� 7%, für eine Phasenverschiebung von 0� ist der<br />
Grundschwingungsgehalt I1 � 99� 4%, also nahezu identisch mit dem lastfreien Fall. Für eine Phasenverschiebung<br />
von +90� ist der Grundschwingungsgehalt I1 � 98� 8%.<br />
7.1.1.3. Stromeinspeisung in das Netz mit einer B6 Brücke mit angeschlossener Induktivität als Last<br />
In diesem Schritt wird der Regelalgorithmus auf seine Fähigkeit hinsichtlich Laststromkompensation eines sich<br />
schnell ändernden Laststroms untersucht und gemäß Abbildung 7.3 angeschlossen.<br />
Der Netzstrom soll einen Phasenwinkel von 0� und einen Effektivwert von 4,8A haben. Eine höherer Betrag ist<br />
in diesem Fall nicht möglich, da das den Zwischenkreis speisende Netzgerät keine höheren Ströme liefern kann.<br />
Die gemessenen Ströme sind Abbildung 7.5 zu entnehmen.<br />
Es ergibt sich der Effektivwert der Grundschwingung I1 � 4� 8A und ein Grundschwingungsgehalt von I1 �<br />
93� 6%.<br />
Deutlich ist zu erkennen, daß die im Laststrom enthaltenen Oberschwingungen im allgemeinen verstärkt anstatt<br />
geschwächt werden. Dieses ist schon im Abschnitt 5.6.1 mit der zu niedrigen Durchtrittsfrequenz begründet<br />
worden. Es ist aber auch die Fähigkeit des Filters mit PI-Regler zu erkennen, einen sinusförmigen Netzstrom mit<br />
beliebigem Winkel für einen beliebigen Laststrom zu erzeugen.<br />
54
Abbildung 7.5.: Phasenströme bei Einspeisung in das Netz mit B6 Brücke mit angeschlossener Induktivität als<br />
Last mit PI-Regler, mit reduzierten Spannungen<br />
7.1.2. Dead Beat Regler<br />
In diesem Abschnitt wird das Regelverhalten des Filters mit Dead Beat Regler untersucht.<br />
Der Algorithmus wurde so weit optimiert, daß eine Abtastfrequenz von fTast � 1� 4kHz möglich ist. Um den<br />
Konflikt bei realen digitalen Regelungen zwischen Genauigkeit und Geschwindigkeit hervorzuheben, werden zu<br />
Vergleichszwecken in einer zweiten Meßreihe die beiden sehr kleinen Koeffizienten p4 und q4 (vgl. Abschnitt<br />
7.1.2.1) für eine Messung weggelassen. In diesem Fall ist eine Abtastfrequenz von fTast � 1� 65kHz möglich.<br />
In der “globals.h” muß “Reg_Typ_Netz=4” und “ABT_FREQ=1650” bzw. “ABT_FREQ=1400” gesetzt werden.<br />
7.1.2.1. Stromeinspeisung in das Netz ohne Laststrom<br />
In einem ersten Schritt wird der Strom in das Netz eingespeist, ohne daß Lastströme fließen. Dabei wird ein<br />
Phasenwinkel φ � 0 0 angestrebt. Der Anschluß erfolgt wiederum gemäß Abbildung 7.1. Insgesamt werden zwei<br />
Messungen durchgeführt. Zunächst wird der vollständige Regelalgorithmus gemäß Gleichung 5.34 verwendet,<br />
was zu einer Abtastfrequenz von fTast � 1� 4kHz führt. Das Ergebnis ist Abbildung 7.6 a) zu entnehmen. Dann<br />
werden die beiden sowieso sehr kleinen Koeffizienten p4 und q4 zu Gunsten eines schnelleren Algorithmus<br />
vernachlässigt. Dies führt zu einer Abtastfrequenz von fTast � 1� 65kHz. Das Ergebnis ist Abbildung 7.6 b) zu<br />
entnehmen.<br />
Wiederum ist in der Netzspannung und im Laststrom die 5. Oberschwingung zu erkennen.<br />
Für den vollständigen, aber langsameren Algorithmus ergibt sich ein Effektivwert der Grundschwingung von I1 �<br />
5� 7A und ein Grundschwingungsgehalt von I1 � 99� 4%. Für den schnelleren, aber ungenaueren Algorithmus<br />
ergibt sich ebenfalls ein Effektivwert der Grundschwingung von I1 � 5� 7A und ein Grundschwingungsgehalt von<br />
I1 � 99� 4%.<br />
Anhand dieser Messung wird deutlich, daß bei der Realisierung digitaler Algorithmen ein Kompromiß zwischen<br />
Genauigkeit und Geschwindigkeit zu schließen ist. Nachträglich wird nun auch die Rechtfertigung für die<br />
Vernachlässigung der Laststromkompensation geliefert. Sie erhöht die Genauigkeit, verlangsamt den Regelalgorithmus<br />
aber so nachhaltig, daß das Resultat verschlechtert statt verbessert wird.<br />
Im Folgenden wird von der Übertragungsfunktion aus Gleichung 5.35 mit den beiden Koeffizienten p4 und q4<br />
ausgegangen.<br />
55
a) fTast � 1� 4kHz b) fTast � 1� 65kHz ohne p4, q4<br />
Abbildung 7.6.: Phasenströme bei Einspeisung in das Netz ohne Laststrom mit Dead Beat Regler, mit reduzierten<br />
Spannungen<br />
7.1.2.2. Stromeinspeisung in das Netz mit sinusförmigem Laststrom<br />
In diesem Schritt wird der Regelalgorithmus auf seine Fähigkeit hinsichtlich Laststromkompensation eines sich<br />
langsam ändernden Laststroms untersucht und gemäß Abbildung 7.3 angeschlossen. Der Netzstrom wird mit<br />
veschiedenen Phasenwinkeln eingeprägt, wiederum nur in einem Bereich von φ � � 90 0 .<br />
Die gemessenen Ströme sind Abbildung 7.7 a), b) und c) zu entnehmen.<br />
a) φ ��� 90 0 b) φ � 0 0 c) φ � � 90 0<br />
Abbildung 7.7.: Phasenströme bei Einspeisung in das Netz mit sinusförmigem Laststrom mit Dead Beat Regler,<br />
mit reduzierten Spannungen<br />
In jedem der drei Fälle beträgt der Effektivwert der Grundschwingung I1 � 5� 7A. Es findet also wiederum eine<br />
eindeutige Trennung von Betrag und Phase in der Regelung statt.<br />
Deutlich ist der Einfluß des Phasenwinkels in Bezug auf die Güte des Reglers zu erkennen. Für eine Phasenverschiebung<br />
von -90� ist der Grundschwingungsgehalt I1 � 97� 5%, für eine Phasenverschiebung von 0� ist der<br />
Grundschwingungsgehalt I1 � 99� 3%, also nahezu identisch mit dem lastfreien Fall, und für eine Phasenverschiebung<br />
von +90� ist der Grundschwingungsgehalt I1 � 99� 4%.<br />
Zu beachten ist wiederum, daß die Netzspannung Oberschwingungen enthält.<br />
56
7.1.2.3. Stromeinspeisung in das Netz mit einer B6 Brücke mit angeschlossener Induktivität als Last<br />
In diesem Schritt wird der Regelalgorithmus auf seine Fähigkeit hinsichtlich Laststromkompensation eines sich<br />
schnell ändernden Laststroms untersucht und gemäß Abbildung 7.3 angeschlossen.<br />
Der Netzstrom soll einen Phasenwinkel von 0� und einen Effektivwert von 4,8A haben. Ein höherer Betrag ist in<br />
diesem Fall nicht möglich, da das den Zwischenkreis speisende Netzgerät keine höheren Ströme liefern kann.<br />
Die gemessenen Ströme sind Abbildung 7.8 zu entnehmen.<br />
Abbildung 7.8.: Phasenströme bei Einspeisung in das Netz mit B6 Brücke mit angeschlossener Induktivität als<br />
Last mit Dead Beat Regler, mit reduzierten Spannungen<br />
Es ergeben sich der Effektivwert der Grundschwingung I1 � 4� 3A und der Grundschwingungsgehalt I1 � 89� 1%.<br />
Deutlich ist zu erkennen, daß die im Laststrom enthaltenen Oberschwingungen im Allgemeinen verstärkt anstatt<br />
geschwächt werden. Dieses ist schon im Abschnitt 5.6.1 mit der zu niedrigen Durchtrittsfrequenz begründet<br />
worden. Es ist aber auch die Fähigkeit des Filters zu erkennen, einen sinusförmigen Netzstrom mit beliebigem<br />
Winkel für einen beliebigen Laststrom zu erzeugen.<br />
7.1.3. Zustandsregler ohne Laststrom<br />
In der “globals.h” muß “Reg_Typ_Netz=1” und “ABT_FREQ=2200” gesetzt werden. Außerdem ist auf die<br />
richtigen Werte für den Widerstand der Kopplungsinduktivität zu achten.<br />
Wie schon erwähnt, wird der Zustandsregler nur für einen Vergleich im laststromfreien Fall herangezogen, da er<br />
zum Zeitpunkt der Fertigstellung dieser Arbeit die Laststromamplitude falsch berechnet hat. Für eine Abtastfrequenz<br />
von fTast � 2� 2kHz ergibt sich Abbildung 7.9.<br />
Eine zweite Messung ergab einen Effektivwert der Grundschwingung von I1 � 5� 7A und einen Grundschwingungsgehalt<br />
von I1 � 99� 5%�<br />
7.1.4. Zusammenfassung der Meßergebnisse mit reduzierten Spannungen<br />
Die Messungen haben ergeben, daß der PI- und der Dead Beat Regler insgesamt vergleichbare Ergebnisse erzielen,<br />
obwohl der Dead Beat Regler eigentlich dem PI-Regler überlegen ist (vgl. z.B. Abbildung 5.8). Dieses läßt<br />
sich mit dem 30% schnelleren Algorithmus des PI-Reglers erklären. Der PI-Regler erreicht eine Abtastfrequenz<br />
fTast � 2� 0kHz gegenüber der Abtastfrequenz fTast � 1� 65kHz des Dead Beat Reglers. Dies ist erneut ein Hinweis<br />
auf den Konflikt von Genauigkeit und Geschwindigkeit und für den ggf. notwendigen Einsatz eines schnelleren<br />
Controllers.<br />
57
Abbildung 7.9.: Netzstrom mit Zustandsregler ohne Laststrom, mit reduzierten Spannungen<br />
Für den Fall der Stromeinprägung ohne Laststrom sowie für den Fall eines sinusförmigen Laststroms zeigen beide<br />
Regler ein sehr gutes Regelverhalten. Der Netzstrom weist im Wesentlichen eine 5. Oberschwingung auf. Diese<br />
ist auf die oberschwingungsbehaftete Netzspannung des TU-Netzes und auf die unzureichende Regeldynamik<br />
zurückzuführen.<br />
Für den Fall einer B6 Brücke mit angeschlossener Induktivität zeigen beide Regler ein mäßiges Regelverhalten<br />
mit einer Verstärkung der Oberschwingungen. Es läßt sich erneut mit der deutlich zu niedrigen Durchtrittsfrequenz<br />
und mit der damit verbundenen unzureichenden Regeldynamik erklären. Daß der Dead Beat Regler<br />
schlechter als der PI-Regler reagiert, zeigt den für einen digitalen Regler entscheidenden Faktor auf: die Abtastfrequenz<br />
fTast� Mit einer Tastfrequenz von nur 1,4kHz tastet der Dead Beat Regler nur viermal schneller ab<br />
als die 7. Oberschwingung und nur 5,6 mal schneller ab als die 5. Oberschwingung. Das ist zwar rechnerisch<br />
ausreichend schnell 1 , in der Praxis jedoch zu langsam. Das schlechtere Regelverhalten des Dead Beat Reglers<br />
bei schnell veränderlichen Lastströmen (B6 Brücke) erklärt auch, warum er eine kleinere Grundschwingungsamplitude<br />
erzeugt als der PI-Regler. Sie folgt auch wieder der Sollvorgabe, diese mußte jedoch reduziert werden, da<br />
das schlechtere Regelverhalten des Dead Beat Reglers zu großen Stromspitzen führte, die von der die Zwischenkreisspannung<br />
bereitstellenden Spannungsquelle nicht geliefert werden konnten.<br />
Das Regelverhalten des Zustandsreglers ist im lastfreien Fall mit dem des PI- und des Dead Beat Reglers vergleichbar,<br />
sogar noch etwas besser. Dieses liegt daran, daß der Algorithmus der schnellste der drei Regler ist und<br />
ein Zustandsregler den qualitativ hochwertigsten der drei Regler darstellt. Daß er nicht noch bessere Ergebnisse<br />
erzielt, liegt daran, daß für einen optimalen Zustandsregler die Strecke sehr genau bekannt sein muß, anderenfalls<br />
besteht die Gefahr, daß er sogar schlechte Ergebnisse erzeugt.<br />
Abschließend läßt sich feststellen, daß die verschiedenen Algorithmen ihre volle Leistungsfähigkeit bewiesen<br />
haben und es möglich ist, einen sinusförmigen Netzstrom mit beliebigem Winkel für einen beliebigen Laststrom<br />
zu erzeugen. Geht man von der eigentlichen Anforderung an das Filter aus - die Vermeidung von Flicker und<br />
Blindleistungskompensation - so erfüllt es diese Aufgaben vollständig. Schwächen zeigen die Algorithmen auf<br />
Grund ihrer unzureichenden Dynamik bei der Oberschwingungskompensation.<br />
Tabelle 7.1 stellt die wichtigsten Eigenschaften der entworfenen und in der Praxis getesteten Regler zusammen.<br />
1 Nach Nyquist/Shannon muß die Abtastung mit der doppelten Frequenz des Signals erfolgen.<br />
58
PI-Regler Dead Beat Regler<br />
fTastmax / kHz 2,0 1,4<br />
Qualität des Stroms bei in Stern geschalteten Widerständen + + + +<br />
Einstellbarkeit des Phasenwinkels des Netzstroms + + + +<br />
Kompensation von Flicker + +<br />
Kompensation eines sinusförmigen Laststroms (50 Hz) + 0<br />
Kompensation eines schnell veränderlichen Laststroms (B6 Brücke) - - -<br />
Qualität des Regelverhaltens bei Erhöhung der Abtastfrequenz 0 + + +<br />
Tabelle 7.1.: Experimenteller Vergleich von PI- und Dead Beat Regelung mit reduzierten Spannungen<br />
Aus Tabelle 7.1 läßt sich erkennen, daß das Verhalten des PI- und des Dead Beat Reglers vergleichbar ist. Der<br />
Dead Beat Regler stellt zwar einen sehr viel exakteren Entwurf dar, dagegen ist aber der Algorithmus des PI-<br />
Reglers, auf Grund seiner wenigen Additionen und Multiplikationen mit dem verwendeten Controller um ca.<br />
30% schneller.<br />
7.2. Nennbetrieb<br />
Im Nennbetrieb betragen die Zwischenkreisspannung UZK � 650V und die Netzspannung UNU� NV� NW � 230V�<br />
Die im Institut vorhandene Netzspannung ist stark oberschwingungsbehaftet, so daß mit einem schlechten Regelverhalten<br />
des PI- und des Dead Beat Reglers zu rechnen ist, da diese, wie die bisherigen Messungen mit<br />
reduzierten Spannungen und die Simulation ergeben haben, eine unzureichende Dynamik (vgl. z.B Abschnitt<br />
5.8.2) besitzen. Wegen des Oberschwingungsgehalts der Netzströme war nur ein eingeschränkter experimenteller<br />
Betrieb mit Nennspannungen möglich.<br />
Um das Regelverhalten dennoch untersuchen zu können, werden die Messungen nicht nur mit der oberschwingungsbehafteteten<br />
Netzspannung des TU-Netzes sondern auch mit einer Spannungsquelle durchgeführt, die mittels<br />
Leistungselektronik eine reine Sinusspannung zur Verfügung stellt. Der Nachteil dieser Spannungsquelle<br />
ist, daß sie keine Energie aufnehmen kann und nur einen sehr kleinen Leistungsbereich (bis 6kVA) hat. Um bei<br />
Messungen mit dieser Spannungsquelle Stromeinspeisung in das Netz nachzubilden, wird die Quelle mit Widerständen<br />
gemäß Abbildung 7.10 belastet, so daß durch die Widerstände ein konstanter Strom von 5,7A fließt.<br />
Wird Strom von dem Filter zur Einspeisung erzeugt, so übernimmt das Filter einen Teil des Stroms durch die<br />
Widerstände. Die Spannungsquelle liefert dann entsprechend weniger.<br />
Sinusspannungsquelle<br />
i NU,NV,NW<br />
5.7Α<br />
Filter<br />
aktiv<br />
i LU,LV,LW<br />
Windenergieanlage<br />
Abbildung 7.10.: Meßaufbau mit Spannungsquelle mit Sinusspannung<br />
Als großes Problem hat sich bei den Messungen ergeben, daß es zu starken Wechselwirkungen zwischen der<br />
Spannungsquelle und dem Filter kommt. Dadurch ist der maximal mögliche Filterstrom auf 4A beschränkt<br />
und Messungen mit Laststromkompensation sind nicht möglich, da bei Laststromkompensation die maximal<br />
möglichen 4A kurzzeitig überschritten werden. Auch war es nur möglich, den Phasenwinkel φ in einem sehr<br />
kleinen Bereich zu verändern, da die Spannung der Spannungsquelle bei Winkeln � 0 0 zusammenbrach.<br />
Da auf Grund dieser zahlreichen Probleme nur wenige Messungen durchgeführt wurden, insbesondere in jeder<br />
Messung das Verhalten des PI- mit dem des Dead Beat Reglers ähnlich ist, sind die folgenden Kapitel nicht nach<br />
Reglertyp, sondern nach durchgeführter Messung gegliedert.<br />
59
�<br />
Bei den Messungen mit Nennspannung ist der Programmcode des PI-Reglers weiter optimiert, so daß eine Abtastfrequenz<br />
fTast � 2� 2kHz möglich ist. Der Programmcode des Dead Beat Reglers ist so optimiert, daß die<br />
Abtastfrequenz fTast � 1� 65kHz für den vollständigen Algorithmus und fTast � 1�<br />
p4 und q4 beträgt.<br />
8kHz für den Algorithmus ohne<br />
7.2.1. Oberschwingungsbehaftete Netzspannung<br />
Die in diesem Abschitt dargestellten Messungen erfolgen mit der stark oberschwingungsbehafteten Netzspannung<br />
des TU-Netzes. Die Spannung setzt sich gemäß Tabelle 7.2 zusammen.<br />
Frequenz / Hz Effektivwert / V<br />
Grundschwingung: 50 230<br />
5. Oberschwingung: 250 8<br />
7. Oberschwingung: 350 3.5<br />
Tabelle 7.2.: Frequenzen der Netzspannung<br />
7.2.1.1. Laststrom durch zum Stern geschaltete Widerstände mit Netzspannung<br />
In einem ersten Schritt wird ein Strom durch drei in Stern geschaltete 14 Ω Widerstände erzeugt. Es wird ein<br />
Sollstrom von 7,5 A vorgegeben. Der in einer Phase fließende Strom ist Abbildung 7.11 a) für den PI-Regler und<br />
b) für den Dead Beat Regler zu entnehmen.<br />
a) PI-Regler b) Dead Beat Regler<br />
Abbildung 7.11.: Strom durch drei in Stern geschaltete Widerstände mit oberschwingungsbehafteter Netzspannung<br />
Trotz der deutlich zu erkennenden Oberschwingung in der Netzspannung ist der Strom mit beiden Regelalgorithmen<br />
oberschwingungsfrei. Dies ist auch der Fall, wenn der Phasenwinkel verändert wird. Der Effektivwert<br />
der Grundschwingung beträgt in beiden Fällen I1 � 7� 5A und der Grundschwingungsgehalt ist I1 � 99� 9%�<br />
Wie schon die Messungen mit reduzierten Spannungen ergeben haben, so zeigt sich auch bei Nennbetrieb die<br />
Entkopplung von Betrag und Phase in den Regelalgorithmen.<br />
60
7.2.1.2. Stromeinspeisung in das Netz ohne Laststrom<br />
In diesem Schritt wird das Filter mit dem Netz verbunden und das Filter soll einen Nullstrom erzeugen, der<br />
Raumzeiger der Wechselrichterausgangsspannung muß also identisch mit dem der Netzspannung sein. Der sich<br />
einstellende Strom ist Abbildung 7.15 a) für den PI-Regler und b) für den Dead Beat Regler zu entnehmen.<br />
a) PI-Regler b) Dead Beat Regler<br />
Abbildung 7.12.: Nullstrom bei Anschluß des Filters an das oberschwingungsbehaftete Netz<br />
Deutlich ist bei beiden Regelalgorithmen in dem Strom die fünfte Oberschwingung zu erkennen, sie hat einen<br />
Effektivwert von über 1,5A. Auch die siebte Oberschwingung ist noch deutlich enthalten, fällt aber auf Grund<br />
der Dominanz der fünften kaum auf. Dieses schlechte Ergebnis ist auf die fehlende Dynamik der Regler und<br />
die damit verbundene Fähigkeit, auf Oberschwingungen reagieren zu können, zurückzuführen. In den Meßergebnissen<br />
aus Abschnitt 7.2.1.1 ist ein rein sinusförmiger Strom durch drei zum Stern geschaltete Widerstände<br />
zu erkennen, die Wechselrichterausgangsspannung ist folglich sinusförmig. Wird diese sinusförmige Spannung<br />
über die Kopplungsinduktivitäten mit der oberschwingungsbehafteteten Netzspannung verbunden, so bilden sich<br />
Ströme entsprechend dem Oberschwingungsgehalt der Netzspannung aus. Ein Regler mit einer höheren Durchtrittsfrequenz<br />
würde diese Probleme beseitigen. In diesem Fall wäre der Regler in der Lage durch eine entsprechend<br />
oberschwingungsbehaftete Wechselrichterausgangsspannung der Entstehung von Oberschwingungen in<br />
dem Strom entgegenzuwirken. Deutlicher noch als bei den Messungen mit 50V zeigt sich die Notwendigkeit für<br />
eine höhere Abtastfrequenz.<br />
Noch gravierender ist das Problem der unzureichenden Dynamik, wenn ein Strom mit einem vorgegebenen Effektivwert<br />
von 7,5A in das Netz eingespeist werden soll. Es ergibt sich Abbildung 7.13. In dieser Abbildung ist<br />
nur der Strom für den Dead Beat Regler dargestellt, da sich der Strom beim PI-Regler nicht davon unterscheidet.<br />
Der Effektivwert der Grundschwingung beträgt wiederum I1 � 7� 5A, der Effektivwert der fünften Oberschwingung<br />
liegt aber bei I5 � 3� 5A, also bei fast 50% der Grundschwingung.<br />
Aus dieser Messung folgt als Konsequenz, daß die Regler nicht in der Lage sein werden, schnell veränderliche<br />
Lastströme in oberschwingungsbehafteteten Netzen zu kompensieren, da den Reglern die dazu notwendige<br />
Dynamik fehlt.<br />
7.2.2. Sinusspannung<br />
Um die Qualität der Regler hinsichtlich Vermeidung von Flicker und Kompensation von Blindleistung untersuchen<br />
zu können, wird die Netzspannung durch eine Spannungsquelle mit idealer Sinusspannung ersetzt. Diese<br />
ist gemäß Abbildung 7.10 angeschlossen und hat einen Grundschwingungsgehalt von 100%.<br />
61
Abbildung 7.13.: Netzstrom bei oberschwingungsbehafteter Netzspannung mit Dead Beat Regler<br />
7.2.2.1. Laststrom durch zum Stern geschaltete Widerstände mit Sinusspannung<br />
In einem ersten Schritt wird ein Strom durch drei in Stern geschaltete 14Ω Widerstände gebildet. Erneut wird<br />
ein Sollstrom von 7,5A vorgegeben. Der in einer Phase fließende Strom ist Abbildung 7.14 für den PI-Regler<br />
zu entnehmen. Für den Dead Beat Regler ist das Ergebnis identisch, weshalb auf eine gesonderte Darstellung<br />
verzichtet wird.<br />
Abbildung 7.14.: Strom durch drei in Stern geschaltete Widerstände, mit Sinusspannung, mit PI-Regler<br />
Erneut ist der Effektivwert der Grundschwingung I1 � 7� 5A mit einem Grundschwingungsgehalt von I1 �<br />
62
9%. Dieses zeigt einmal mehr die hohe Qualität der Regler, wenn keine Oberschwingungen in der Span-<br />
99�<br />
� nung oder im Laststrom enthalten sind.<br />
7.2.2.2. Stromeinspeisung in ein Netz mit Sinusspannung ohne Laststrom<br />
In diesem Schritt wird das Filter gemäß Abbildung 7.10 angeschlossen und es soll ein Nullstrom erzeugt werden,<br />
der Raumzeiger der Wechselrichterausgangsspannung muß also identisch mit dem der Netzspannung sein. Der<br />
sich einstellende Strom ist Abbildung 7.15 a) für den PI-Regler und b) für den Dead Beat Regler zu entnehmen.<br />
a) PI-Regler b) Dead Beat Regler<br />
Abbildung 7.15.: Nullstrom bei Anschluß des Filters an eine Sinusspannung<br />
Auch in diesem Fall ist der Netzstrom für beide Regelalgorithmen von Null verschieden, er ist jedoch nicht<br />
mehr mit einer eindeutigen Oberschwingung behaftet. Vielmehr schwankt er in einem Bereich von wenigen<br />
Ampere um Null. Daß der Strom nicht genau Null ist, liegt daran, daß auf dieser hohen Spannungsebene bereits<br />
kleinste Abweichungen zwischen der Wechselrichterausgangs- und der Netzspannung reichen, um hohe Ströme<br />
fließen zu lassen. Solche Abweichungen treten durch die gestufte Bereitstellung der Ausgangsspannung durch<br />
den Wechselrichter und durch Rechenungenauigkeiten unvermeidbar auf.<br />
Im nächsten Schritt wird sowohl für den PI- als auch für den Dead Beat Regler ein Sollstrom von 4 A mit variablem<br />
Phasenwinkel vorgegeben. Wie zu Beginn dieses Kapitels bereits erwähnt wurde, ist ein höherer Strom und<br />
ein Phasenwinkel φ � 0 0 nicht möglich, da dieses zum Zusammenbrechen der Spannung der Spannungsquelle<br />
führt. Da es sich bei der Spannungsquelle im Gegensatz zum direkten Netzanschluß um eine leistungselektronisch<br />
geregelte Spannungsquelle handelt, reagiert diese mit unerwünschten Spannungsänderungen, wenn kurzzeitige<br />
Stromschwankungen auftreten. Dadurch kommt es zu unerwünschten Wechselwirkungen mit dem Filter.<br />
In Abbildung 7.16 ist ein deutlicher Einbruch in der Spannung zu erkennen.<br />
Die mit diesen Einschränkungen (Strom < 4A, φ � 0 0 ) vorgenommenen Messungen sind für einen Phasenwinkel<br />
von 0 0 Abbildung 7.17 a) für den PI-Regler und b) für den Dead Beat Regler zu entnehmen, für einen Phasenwinkel<br />
von 90 0 Abbildung 7.18 a) für den PI-Regler und b) für den Dead Beat Regler.<br />
Für einen Phasenwinkel von φ � 0 0 ergibt sich für den PI-Regler ein Effektivwert der Grundschwingung von<br />
I1 � 4A und ein Grundschwingungsgehalt von I1 � 94� 7%� Für den Dead Beat Regler ergibt sich ein Effektivwert<br />
der Grundschwingung von I1 � 4A und ein Grundschwingungsgehalt von I1 � 96%� Es zeigt sich an dieser<br />
Messung erneut das überlegene Regelverhalten des Dead Beat Reglers gegenüber dem PI_Regler.<br />
Für einen Phasenwinkel von φ ��� 90 0 ergibt sich für den PI-Regler ein Effektivwert der Grundschwingung von<br />
I1 � 4A und ein Grundschwingungsgehalt von I1 � 93� 6%� Für den Dead Beat Regler ergibt sich ein Effektivwert<br />
der Grundschwingung von I1 � 4A und ein Grundschwingungsgehalt von I1 � 94%�<br />
63
Abbildung 7.16.: Wechselwirkung zwischen dem Filter und der Spannungsquelle mit Sinusspannung<br />
a) PI-Regler b) Dead Beat Regler<br />
Abbildung 7.17.: Netzstrom mit φ � 0 0 bei Anschluß des Filters an eine Sinusspannung<br />
Insgesamt sind die Ergebnisse zufriedenstellend, aber auffällig schlechter als auf der 50V Ebene. Im Gegensatz<br />
zu den vergleichenden Messungen mit Netzspannung ist der Netzstrom wiederum oberschwingungsbehaftet,<br />
jedoch mit keiner ausgeprägten Oberschwingung, vielmehr mit einer Vielzahl von Oberschwingungen. Dieses<br />
läßt sich wie bei der Messung mit Nullstrom damit begründen, daß auf dieser hohen Spannungsebene bereits<br />
kleinste Abweichungen zwischen der Wechselrichterausgangs- und der Netzspannung reichen, um hohe Ströme<br />
fließen zu lassen. Solche Abweichungen sind auf Grund der gestuften Bereitstellung der Ausgangsspannung<br />
durch den Wechselrichter und durch Rechenungenauigkeiten unvermeidbar.<br />
64
a) PI-Regler b) Dead Beat Regler<br />
Abbildung 7.18.: Netzstrom mit φ ��� 90 0 bei Anschluß des Filters an eine Sinusspannung<br />
7.2.3. Zusammenfassung der Meßergebnisse mit Nennspannung<br />
An Hand der Messung an zum Stern geschalteten Widerständen haben sowohl der PI-Regler als auch der Dead<br />
Beat Regler ihre Leistungsfähigkeit unter Beweis gestellt. Beide Regler sind in der Lage, nahezu oberschwingungsfrei<br />
Ströme mit beliebigem Phasenwinkel zu erzeugen, wenn nicht gegen ein oberschwingungsbehaftetes<br />
Netz gearbeitet wird.<br />
Wird der Strom in ein Netz eingespeist, so ist der Netzstrom von einer schlechten Qualität, wenn die Netzspannung<br />
oberschwingungsbehaftet ist. Ist sie jedoch oberschwingungsfrei, so lassen sich zufriedenstellende<br />
Ergebnisse mit beiden Reglern erzielen. Im Vergleich zu den Messergebnissen mit reduzierten Spannungen ist<br />
das Ergebnis erwartungsgemäß schlechter, da auf dieser hohen Spannungsebene bereits kleinste Rechenfehler<br />
oder andere Abweichungen von der theoretisch notwendigen Wechselrichterausgangsspannung zu sehr hohen<br />
Strömen führen. Diese Abweichungen sind aber mit dem verwendeten Controller unvermeidbar. Zum einen ist<br />
die maximal erreichbare Abtastfrequenz zu niedrig, zum anderen verfügt der Controller nicht über eine Floating<br />
Point Einheit, sämtliche Rechnungen müssen also mit Integer-Zahlen stattfinden, um eine ausreichend schnelle<br />
Regelung zu gewährleisten, so daß Rundungs- und damit Rechenfehler unvermeidbar sind.<br />
Eine weitere Fehlerquelle liegt darin, daß durch den Wechselrichter keine kontinuierliche Spannung mit beliebig<br />
feiner Aufteilung bereitgestellt werden kann. Durch diese gestufte Wechselrichterausgangsspannung kommt<br />
es zu kleinen Abweichungen der errechneten Wechselrichterausgangsspannung und der Netzspannung, so daß<br />
Ausgleichsströme fließen.<br />
Abhilfe für die meisten hier aufgeführten Schwierigkeiten schafft ein schnellerer Prozessor, der durch größere<br />
Rechenleistung nicht nur eine schnellere Abtastung, sondern auch eine präzisere Berechnung ermöglicht.<br />
Wegen der starken Wechselwirkungen zwischen dem Filter und der die Sinusspannung erzeugenden Spannungsquelle<br />
war es nicht möglich, die Filter hinsichtlich ihrer Fähigkeit, Lastströme zu kompensieren, zu untersuchen.<br />
Es ist aber zu erwarten, daß die Ergebnisse mit denen bei reduzierten Spannungen vergleichbar sind, unter der<br />
Einschränkung, daß allgemein der Oberschwingungsgehalt bei Nennspannung vergrößert ist.<br />
Abschließend läßt sich feststellen, daß die verschiedenen Algorithmen trotz ihrer Schwächen bei der Oberschwingungskompensation<br />
ihre Leistungsfähigkeit bewiesen haben und es möglich ist, einen sinusförmigen Netzstrom<br />
mit beliebigem Winkel bei Sinusspannung zu erzeugen. Eine der Anforderungen an das Filter - die Blindleistungskompensation<br />
- wird zufriedenstellend erfüllt. Die andere Anforderung - Vermeidung von Flicker - ließ<br />
sich auf Grund der beschriebenen Probleme bei den Messungen nicht nachweisen.<br />
65
Soweit es die Messungen ermöglichten, sind in Tabelle 7.3 die wichtigsten Eigenschaften der entworfenen und<br />
in der Praxis bei Nennspannung getesteten Regler zusammengestellt. Um bessere Vergleichsmöglichkeiten zu<br />
schaffen, ist die Tabelle identisch zu der Tabelle 7.1 aufgebaut, obwohl einzelne Messungen nicht möglich waren.<br />
SINUSSPANNUNG PI-Regler Dead Beat Regler<br />
fTastmax / kHz 2,2 1,65<br />
Qualität des Stroms bei in Stern geschalteten Widerständen + + + +<br />
Einstellbarkeit des Phasenwinkels des Netzstroms (soweit möglich) + + + +<br />
Kompensation von Flicker entfällt entfällt<br />
Kompensation eines sinusförmigen Laststroms (50 Hz) entfällt entfällt<br />
Kompensation eines schnell veränderlichen Laststroms (B6 Brücke) entfällt entfällt<br />
OBERSCHWINGUNGSBEHAFTETE NETZSPANNUNG<br />
Qualität des Stroms bei in Stern geschalteten Widerständen + + + +<br />
Einstellbarkeit des Phasenwinkels (soweit möglich) entfällt entfällt<br />
Kompensation von Flicker entfällt entfällt<br />
Kompensation eines sinusförmigen Laststroms (50 Hz) entfällt entfällt<br />
Kompensation eines schnell veränderlichen Laststroms (B6 Brücke) entfällt entfällt<br />
Qualität des Regelverhaltens bei Erhöhung der Abtastfrequenz 0 + + +<br />
Tabelle 7.3.: Experimenteller Vergleich von PI- und Dead Beat Regelung mit Nennspannungen<br />
Aus Tabelle 7.3 ist zu erkennen, daß beide Regler ein vergleichbares Regelverhalten haben. Allerdings verbessert<br />
sich das Regelverhalten des Dead Beat Reglers signifikant, wenn dessen Abtastfrequenz erhöht wird, das<br />
Regelverhalten des PI-Reglers verändert sich dagegen nur wenig, wenn die Abtastfrequenz erhöht wird.<br />
66
Teil III.<br />
Multi-Controller-System<br />
67
8. Anforderungen und Aufgabenstellung<br />
Das aktive Filter und dessen Regelung, die in den vorangegangenen Kapiteln hergeleitet wurde, sind Teil eines<br />
umfassenderen Gesamtsystems. Ein einzelner Controller ist mit der gesamten Berechnung überfordert, da<br />
die in jedem der drei Teilsysteme stattfindenden Berechnungen sehr komplex sind. Aus diesem Grund werden<br />
insgesamt drei Controller eingesetzt, die für jeweils ein Teilsystem zuständig sind.<br />
Das zu kontrollierende Gesamtsystem besteht aus folgenden drei Blöcken:<br />
1. Energiemanagement (in Controller I)<br />
2. Batterieladeregler und Batterieentladeregler (in Controller II)<br />
3. Regelung des netzseitigen Wechselrichters (in Controller III)<br />
Die in Bild 8.1 dargestellte Struktur ergibt sich, da das Verhalten des netzseitigen Wechselrichters und das des<br />
Batterieladereglers von den Vorgaben des Energiemanagements abhängig sind und das Energiemanagement auf<br />
die Daten (so z.B. Ladezustand der Batterien, Zwischenkreisspannung, etc.) der beiden anderen Controller angewiesen<br />
ist.<br />
Zwischenkreisspannung Netzstrom<br />
Ladezustand der Batterien<br />
Energiemanagement<br />
Netzspannung<br />
Controller II<br />
Batterieladeregler<br />
Controller I<br />
Vorgabe, ob Vorgabe, ob<br />
Puffern oder Laden Wechsel- oder<br />
Gleichrichten<br />
Controller III<br />
netzseitiger<br />
Pulswechselrichter<br />
Abbildung 8.1.: Datenfluß im Multi-Controller-System<br />
Eine Teilaufgabe dieser <strong>Diplomarbeit</strong> bestand darin, die Kommunikation der drei Controller untereinander zu<br />
entwickeln und zu implementieren.<br />
Bei dem verwendeten Controller, dem “Siemens SAB 80C167”, gibt es drei Möglichkeiten, die für das Gesamtprojekt<br />
notwendige Kommunikation zu realisieren (vgl. [23, S. 275-293]):<br />
1. über die asynchrone serielle Schnittstelle (ASC0)<br />
2. über sie synchrone serielle Schnittstelle (SSC)<br />
3. über den CAN (Controller Area Network) Bus<br />
Die ASC0 ist allerdings bereits belegt, da die Controller im sogenannten “bootstrap modus” betrieben werden,<br />
also über die ASC0 mit den Rechnern verbunden sind, auf denen die Entwicklungssoftware läuft.<br />
68
Der Einsatz des CAN Busses ist mit sehr viel Aufwand verbunden, der für die Kommunikation zwischen drei<br />
Controllern<br />
� nicht gerechtfertigt ist.<br />
Damit bleibt die synchrone serielle Schnittstelle zur Kommunikation zwischen den Controllern.<br />
Die gesamte Kommunikation ist so abzusichern, daß auch für den Fall des Ausfalls der Kommunikation ein<br />
sicheres Herunterfahren der gesamten Anlage gewährleistet ist. Mit anderen Worten, wenn ein Controller auf<br />
Grund eines Fehlers (zum Beispiel im Wechselrichter) den von ihm kontrollierten Teil der Anlage herunterfährt,<br />
muß sichergestellt sein, daß auch die restliche Anlage unverzüglich sicher heruntergefahren wird. Dies geschieht<br />
durch die Einführung einer zusätzlichen Kontrolleitung über Pin P7.0. Wenn an dieser der Pegel auf low fällt, so<br />
wird in allen Controllern ein Interrupt ausgelöst, der den zugehörigen Teil der Anlage sicher herunterfahren läßt.<br />
8.1. Die synchrone serielle Schnittstelle SSC<br />
Die in dem 80C167 integrierte synchrone serielle Schnittstelle kann nach [23, S. 275] und [24, 11-1 - 11-14] sehr<br />
flexibel programmiert werden.<br />
Bei der oben beschriebenen Aufgabenstellung handelt es sich um eine Master-/Slave-Struktur. Dabei wird ein<br />
Controller im Master-Modus konfiguriert, der Takt wird intern erzeugt und ausgesendet. Alle weiteren Controller<br />
werden im Slave-Modus konfiguriert, der Takt wird also von extern vorgegeben. Der Takt wird über den<br />
mit SCLK bezeichneten Pin ausgegeben bzw. empfangen, und die Daten werden über die mit MTSR (Master<br />
Transmit, Slave Receive) bzw. MRST (Master receive, Slave Transmit) bezeichneten Pins übertragen.<br />
Die grundsätzliche Funktionsweise wird in Abbildung 8.2 dargestellt und ist [23, S. 275] entnommen.<br />
f CPU /2<br />
Sendebuffer<br />
SSCTB<br />
SSCBR<br />
Baudratengenerator<br />
SSCCON<br />
Master Takt<br />
>=1<br />
16bit Schieberegister<br />
=<br />
&<br />
&<br />
Empfangsbuffer<br />
SSCRB<br />
Port Latch<br />
Slave Takt<br />
SSCBIC<br />
SSCTIC<br />
SSCRIC<br />
Abbildung 8.2.: Blockschaltbild der SSC<br />
Port Latch<br />
P3.13 / SCLK<br />
Interrupt<br />
Anforderung<br />
Interrupt<br />
Anforderung<br />
Interrupt<br />
Anforderung<br />
P3.9 / MTSR<br />
P3.8 / MRST<br />
Darin ist SSCCON das “special function register” (SFR), mit dem die SSC initialisiert wird, und SSCBR bezeichnet<br />
das Baudraten-Register, mit dem die Baudrate gewählt wird. Die Konfiguration des SSCCON ist im<br />
Kapitel 8.1.2 näher erläutert. Die Baudrate berechnet sich nach<br />
SSCBaudrate �<br />
�<br />
� 1�<br />
�<br />
fCPU<br />
2<br />
SSCRB<br />
und ist zu 100 KBaud (also SSCRB = 0063h) gewählt worden. Damit ist eine für diese Anwendung ausreichend<br />
69
hohe Übertragungsgeschwindigkeit vorhanden und gleichzeitig ist die Wahrscheinlichkeit für Übertragungsfehler<br />
minimiert,<br />
� denn je höher die Baudrate ist, desto fehleranfälliger ist die Kommunikation.<br />
8.1.1. Die Funktionsweise der SSC<br />
Für die Kommunikation über die SSC stehen am Controller gemäß Abbildung 8.2 drei Pins zur Verfügung, deren<br />
jeweilige Bedeutung und Wert Tabelle 8.1 entnommen werden können.<br />
Modus Portpin Funktion Port Latch Port Richtung<br />
Master<br />
Slave<br />
P3.13/SCLK Takt-Ausgang P3.13=’1’ DP3.13=’1’<br />
P3.9/MTSR Daten-Ausgang P3.9=’1’ DP3.13=’1’<br />
P3.8/MRST Daten-Eingang P3.8=’x’ DP3.8=’0’<br />
P3.13/SCLK Takt-Eingang P3.13=’x’ DP3.13=’0’<br />
P3.9/MTSR Daten-Eingang P3.9=’x’ DP3.13=’0’<br />
P3.8/MRST Daten-Ausgang P3.8=’1’ DP3.8=’1’<br />
Tabelle 8.1.: Konfiguration der Sende-, Empfangs- und Taktleitung der SSC<br />
Dabei ist für einige Port Latches der Wert ’x’ angegeben, d.h. an dieser Stelle kann beliebig, entweder eine ’1’<br />
oder eine ’0’ stehen.<br />
Zu Beginn des Programms müssen zuerst das SFR SSCCON beschrieben werden, die Port Latches gemäß Tabelle<br />
8.1 gesetzt und die Baudrate durch das Setzten von SSCBR gewählt werden. Dieses geschieht wie alle anderen<br />
Initialisierungen auch in der main.c durch Aufruf der ensprechenden Initialisierungsfunktion. Im Anhang A<br />
sind sowohl in der “master.c” als auch in der “slave.c” jeweils “main” Funktionen enthalten. Diese dürfen im<br />
Gesamtprojekt nicht mehr enthalten sein. Die dort stehenden Initialisierungsaufrufe sind entsprechend in die<br />
“main.c” zu übertragen.<br />
Nach der Freigabe der SSC wird ein Sende-/und Empfangsvorgang ausgelöst, indem die zu sendenden Daten<br />
in den Sendepuffer SSCTB des Masters geschrieben werden und von dort automatisch in das Schieberegister<br />
übertragen werden. Dieser sendet gleichzeitig mit den Daten das Clock-Signal, woraufhin die Slaves die Daten,<br />
die zu diesem Zeitpunkt in ihrem Sendepuffer stehen, ebenfalls aussenden; Senden und Empfangen findet immer<br />
gleichzeitig statt. Daraus resultieren drei Probleme:<br />
1. Es muß sichergestellt sein, daß immer nur ein Slave Daten sendet.<br />
2. Es muß sichergestellt sein, daß immer nur der Slave die Daten empfängt, die für ihn bestimmt sind.<br />
3. Nur der Master kann den Sende-/Empfangsvorgang auslösen und empfängt immer die Daten, die zu diesem<br />
Zeitpunkt im Sendepuffer des Slaves stehen, egal ob der Sendepuffer sinnvolle Werte enthält oder nicht.<br />
Ist die Anzahl der zuvor gewählten bits (hier:16) empfangen, so werden die Daten aus dem Schieberegister in<br />
das Empfangsregister SSCRB übertragen und der “receive interrupt” SSCRIR ausgelöst. In der zugehörigen<br />
“interrupt service routine” können dann z.B. die Daten, die im Empfangspuffer stehen, ausgelesen werden.<br />
Die oben beschriebene Übertragungsart wird auch als Vollduplex Übertragung bezeichnet.<br />
Davon unterscheidet man die Halbduplex Übertragung, bei der das Senden und Empfangen nacheinander stattfindet.<br />
Die Vollduplexübertragung hat den Vorteil, daß ein Sende-/und Empfangsvorgang schneller abgeschlossen<br />
ist, der Controller also weniger belastet wird.<br />
70
8.1.2. Realisierung der Datenübertragung<br />
Die beiden in Kapitel 8.1.1 zuerst genannten Probleme können gelöst werden, indem eine zusätzliche Kontrollleitung<br />
eingefügt wird, die bestimmt, welcher Slave Daten an den Master senden, bzw. vom Master empfangen<br />
soll. Dies geschieht durch die Pins P7.1 und P7.2, die sogenannte “slave select line”. Wenn kein Sendevorgang<br />
stattfindet, sind beide Leitungen durch die “pull-up” Widerstände auf high gesetzt. Wenn der Master den<br />
Sendevorgang startet, so wählt er durch das Setzen einer der beiden Leitungen auf low den Slave, mit dem der<br />
Datenaustausch stattfinden soll. Am Ende des Sendevorgangs werden wieder alle Leitungen auf high gesetzt.<br />
Damit die beiden Sendekanäle P3.8 und P3.9 sowie die Clock P3.13 einen definierten Zustand haben, werden sie<br />
entweder durch Widerstände mit der Masse oder mit +5V verbunden. Werden sie wie in diesem Fall mit +5V<br />
verbunden, so muß das “clock polarity bit” der SSCCON auf “1” gesetzt werden.<br />
Damit ergibt sich Abbildung 8.3.<br />
Master<br />
+5V<br />
2.2kΩ<br />
2.2kΩ<br />
Schieberegister<br />
P3.9/MTSR<br />
P3.8/MRST<br />
+5V<br />
2.2kΩ<br />
Slave 1<br />
P3.9/MTSR<br />
P3.8/MRST<br />
Schieberegister<br />
Takt<br />
P3.13/SCLK<br />
P3.13/SCLK<br />
Takt<br />
P7.0 Notfall P7.1/2 slave select<br />
P7.0 Notfall P7.1/2 slave select<br />
Slave 2<br />
P3.9/MTSR<br />
P3.8/MRST<br />
P3.13/SCLK<br />
P7.0 Notfall<br />
Schieberegister<br />
Takt<br />
P7.1/2 slave select<br />
Abbildung 8.3.: Vollduplex Datenübertragung über die SSC<br />
Die Wahl der “heading control” und “phase” ist bei dieser Anordnung beliebig und zu “1” für die “heading<br />
control” und zu “0” für die “phase” gewählt. Zusammen mit der Baudrate, der “clock polarity” und der “master”<br />
bzw. “slave” Wahl ergibt sich die Konfiguration des SFR SSCCON gemäß Tabelle 8.2.<br />
Das Problem, daß der Master immer einen Sende-/und Empfangsvorgang auslöst, egal ob im Sendepuffer des<br />
Slave sinnvolle Werte stehen oder nicht, ist nicht hardwaremäßig zu lösen, sondern erfordert eine Softwarelösung,<br />
insbesondere einen sehr kritischen Umgang mit dem Level des “receive interrupts” des Slave. Er muß eine<br />
möglichst hohe Priorität haben und das Senderegister muß unmittelbar nach dem Auslesen des Empfangspuffers<br />
mit einem sinnvollen Wert beschrieben werden. In diesem Fall ist es nahezu ausgeschlossen, daß der Master<br />
einen erneuten Sende-/ Empfangsvorgang auslöst, ohne daß der Slave einen sinnvollen Wert zum Senden in dem<br />
Senderegister hat. Daraus folgt aber, daß insgesamt keine zu schnelle Abfolge der Sende-/ Empfangsvorgänge<br />
zulässig ist. Wie in den vorangegangenen Kapiteln ausführlich dargelegt wurde, ist es notwendig, daß der Regelalgorithmus<br />
mit maximaler Geschwindigkeit ausgeführt wird. Auch aus diesem Grund dürfen die Sende-/und<br />
Empfangszyklen nicht zu häufig erfolgen. Es findet alle halbe Sekunde ein Sende-/und Empfangsvorgang statt.<br />
Aus demselben Grund wird auch auf den “Transmit Error Interrupt” verzichtet. Es ist sinnvoller, einmal eine<br />
fehlerhafte Kommunikation zu riskieren als durch langwierige Interruptabarbeitung den Regler zu verlangsamen.<br />
Ein einmaliger Fehler bedeutet lediglich, daß z.B. der Netzwechselrichter eine Sendeperiode länger einen alten<br />
Sollstrom und eine alte Sollphase behält anstelle des neuen Wertes. Um jedoch sicher zu gehen, daß die beiden<br />
Slaves nicht zu lange ohne sinnvolle Werte weiterarbeiten, ist ein Kontrolltimer vorgesehen, der ähnlich wie der<br />
71
Bedeutung Master Slave<br />
c25fh 825fh<br />
15 SSCEN SSC Enable Bit 1 1<br />
14 SSCMS SSC Master Select Bit 1 0<br />
13 - 0 0<br />
12 SSCAREN SSC Automatic Reset Enable Bit 0 0<br />
11 SSCBEN SSC Baudrate Error Enable Bit 0 0<br />
10 SSCPEN SSC Phase Error Enable Bit 0 0<br />
9 SSCREN SSC Receive Error Enable Bit 1 1<br />
8 SSCTEN SSC Transmit Error Enable Bit 0 0<br />
7 - 0 0<br />
6 SSCPO SSC Clock Polarity Control Bit 1 1<br />
5 SSCPH SSC Clock Phase Control Bit 0 0<br />
4 SSCHB SSC Heading Control Bit 1 1<br />
3 1 1<br />
2 SSC SSC Data Width 1 1<br />
1 BM Selection Bit 1 1<br />
0 1 1<br />
Tabelle 8.2.: Konfiguration des Registers SSCCON<br />
“Watchdog Timer” einen Programmabbruch hervorruft, wenn er zu lange (die Zeit ist sinnvoll zu wählen, ca. 5s)<br />
nicht zurückgesetzt wird.<br />
Um eine möglichst hohe Sicherheit für die Kommunikation zu gewährleisten, wird jeder Wert zweimal übertragen.<br />
Die für die Kommunikation notwendigen Programme sind im Anhang A.6, A.7 und A.8 aufgelistet.<br />
72
9. Zusammenfassung und Ausblick<br />
Die installierte Leistung regenerativer Energiequellen, vor allem der Windenergie, hat in den letzten Jahren<br />
stark zugenommen. Die Leistungsabgabe dieser Energieerzeuger ist sowohl kurzeitigen als auch längerfristigen<br />
Schwankungen unterworfen wodurch die Gefahr negativer Beeinflussung Dritter durch z.B. Flicker steigt.<br />
Weiterhin sind regenerative Energieerzeuger im Allgemeinen nicht in der Lage, gezielt Blindleistung zu produzieren<br />
bzw. aufzunehmen. Es kommt so zu einer zusätzlichen Belastung der Mittel- und Niederspannungsnetze.<br />
In dieser Arbeit wurden erfolgreich drei verschiedene Regelverfahren - ein PI-, ein PID 2 - und ein Dead Beat<br />
Regler - für ein aktives Netzfilter zur Kompensation von Netzrückwirkungen entworfen, simuliert und in der<br />
Praxis getestet. Ein Entwurf in der s-Ebene mit anschließender Diskretisierung liegt dem PI- und dem PID 2 -<br />
Reglerentwurf zu Grunde. Das dritte Verfahren, der Dead Beat Regler, ist als rein digitales Regelverfahren in der<br />
z-Ebene entworfen worden.<br />
Die unter Matlab entworfenen Regler wurden mittels einer sehr praxisnahen Simulation unter Simulink getestet,<br />
wodurch erste Aussagen hinsichtlich der zu erwartenden Reglerqualitäten gewonnen wurden. Der PI- und der<br />
Dead Beat Regler wurden auf einem Microcontroller implementiert und es wurden Meßergebnisse aufgenommen.<br />
Der PID 2 -Regler konnte in der Praxis nicht zum Einsatz kommen, da er, wie auch in der Simulation ersichtlich,<br />
zum Schwingen neigte.<br />
Der PI- und der Dead Beat Regler haben sowohl in der Simulation als auch in der Praxis mit reduzierten Spannungen<br />
ihre Fähigkeit bewiesen, langsam veränderliche Störungen auszugleichen und einen sinusförmigen Strom<br />
mit beliebig einstellbarem Phasenwinkel zu erzeugen.<br />
Wurde ein Strom in das stark oberschwingungsbelastete TU-Netz eingespeist, so führte die unzureichende Dynamik<br />
der Regler und die Rechenungenauigkeit, die durch die ausschließliche Verwendung von Integer-Zahlen<br />
bei der Berechnung bedingt war, zu einem sehr schlechten Betriebsverhalten. Wurde die Netzspannung durch<br />
eine reine Sinusspannung ersetzt, zeigte sich ein gutes Regelverhalten, jedoch waren nach wie vor Fehler durch<br />
Rechenungenauigkeiten auf Grund der ausschließlichen Verwendung von Integer-Zahlen vorhanden. Die unzureichende<br />
Dynamik der Regler ist auf die zu niedrige maximale Abtastfrequenz des eingesetzten Controllers<br />
zurückzuführen. Wird die Abtastfrequenz hoch genug gewählt, besitzt der Dead Beat Regler eine ausreichend<br />
hohe Dynamik und auch der PID 2 -Regler ist stabil. Dieses wurde durch Simulation gezeigt. Eine zweite Möglichkeit,<br />
die unzureichende Dynamik auszugleichen, ist die Störgrößenaufschaltung. In der Simulation wurde<br />
gezeigt, daß die Störgrößenaufschaltung auch für langsame Regelalgorithmen zu sehr guten Ergebnissen führt.<br />
In der Praxis war dieses Vorgehen wegen der zu geringen Rechenleistung des eingesetzten Controllers nicht<br />
möglich.<br />
Auf Grund der zu geringen Rechenleistung der verwendeten Controller war es nicht möglich, die gesamte Anlage,<br />
also die Regelung des netzseitigen Wechselrichters, das Energiemanagement und die Regelung des Batterieladereglers<br />
mit nur einem Controller zu realisieren. Es wurden daher drei Controller eingesetzt. Da jeder Controller<br />
auf Rechenergebnisse der anderen angewiesen war, wurde in dieser Arbeit erfolgreich eine Multi Controller<br />
Kommunikation entwickelt und getestet.<br />
In der Arbeit wurden verschiedene Regelalgorithmen entwickelt, simuliert und getestet. Das untersuchte aktive<br />
Filter mit den implementierten Algorithmen ist in der Lage, langsam veränderliche Störungen zu kompensieren<br />
und Blindleistung bereitzustellen. Es ist darüber hinaus mit einem qualitativ hochwertigeren Betriebsverhalten<br />
des aktiven Netzfilters an beliebigen Netzen zu rechnen, wenn die Regelung mit ausreichend schnellen Prozessoren<br />
durchgeführt wird. Die Prozessoren müssen außerdem in der Lage sein, mit Gleitkommazahlen zu<br />
73
arbeiten. Es ist daher die Verwendung von digitalen Signalprozesoren (allg. DSP) zu empfehlen. Nur so wird<br />
� eine ausreichend hohe Abtastfrequenz, eine ausreichend präzise Berechnung und die Möglichkeit der Störgrößenaufschaltung<br />
erreicht.<br />
74
Teil IV.<br />
Anhang<br />
75
A. Sourcecode<br />
A.1. globals.h<br />
// letzte Aenderung: 28.04.00 von: Jan Hanno Carstens<br />
// prinzipielle Aenderungen:<br />
// um: - neue Spannungsnormierung Batteriespannung und Kondensatorspannung (22.12.99)<br />
// um: - expliziter Sollwert fuer Kondensatorspannung (17.11.99)<br />
// Ergaenzungen von Christoph Saniter am 26.05.00<br />
// um die Koeffizienten des Reglers und der Stoergroessenaufschaltungen<br />
// sowie die zugehoerigen Normierungen<br />
// Zwischenkreisspannung<br />
#define SPANNUNGSEBENE 600 // niedrige Spannungsebene: 50 (V) (Test, 1 Batt.)<br />
// -> Netzspannung 30 V<br />
// hohe Spannungsebene: 600 (Vl) (18 Batt.)<br />
// -> Netzspannung 400 V<br />
// Netzregler<br />
#define REG_TYP_NETZ 5 // 1 == Zustandsregler mit Stoergroessenaufschaltung<br />
// 2 == PI Regler (Christoph)<br />
// 3 == Zustandsregler mit PI-Anteil<br />
// 4 == DeadBeat-Regler (Christoph)<br />
// 5 == PID Regler (Christoph)<br />
// Allgemeines<br />
#define ABT_FREQ 2000 // Abtastfrequenz AD-Wandler [Hz]<br />
// Batterie und Zwischenkreis<br />
#define FREQ_BATT 20 // Batterie PWM - Frequenz = 20 [kHz]<br />
#define C_KOND 1.65 // Kapazitaet (Kond. Zwischenkreis) = 1.65 [mF]<br />
#define C_BATT_INIT 40 // nominale Batterie_Kapazitaet [Ah]<br />
#define LADE_FAKTOR 1.2 // Nenn-Ladefaktor (sollte mit Alter erhoeht werden)<br />
#define I_B_0 -51.7 // Anfang des Messbereichs des Batterie-Stroms [A]<br />
#define I_B_1 51.7 // Ende des Messbereichs des Batterie-Stroms [A]<br />
#define LAD_REG_FREQ 1000 // Frequenz des Ladereglers [Hz]<br />
#define PUF_REG_FREQ 100 // Frequenz des Pufferreglers [Hz]<br />
#define LAD_U_K_R 100 // K_r fuer PI-Regler Konstantspannung Batterie<br />
#define LAD_U_T_R 1.e-4 // T_r fuer PI-Regler Konstantspannung Batterie<br />
//#define LAD_I_K_R 100 // K_r fuer PI-Regler Konstantstrom Batterie<br />
//#define LAD_I_T_R 1.e-4 // T_r fuer PI-Regler Konstantstrom Batterie<br />
#define LAD_I_K_R 50 // K_r fuer PI-Regler Konstantstrom Batterie<br />
#define LAD_I_T_R 1.e-4 // T_r fuer PI-Regler Konstantstrom Batterie<br />
#define PUF_U_K_R 1.e2 // K_r fuer PI-Regler Konstantspannung Zwischenkreis<br />
#define PUF_U_T_R 1.e-2 // T_r fuer PI-Regler Konstantspannung Zwischenkreis<br />
#define FLAG_REFLEX 1 // 1 == Reflex eingeschaltet, 0 == nicht eingesch.<br />
#define T_REFL_A 0.1 // Reflex: Zeit fuer Phase A [ms]<br />
#define T_REFL_B 0.1 // Reflex: Zeit fuer Phase B [ms]<br />
#define T_REFL_C 0.1 // Reflex: Zeit fuer Phase C [ms]<br />
#define T_REFL_D 0.1 // Reflex: Zeit fuer Phase D [ms]<br />
#define PW_REFLEX 100 // PW des Reflexes[200=2A 300=4 400=7 500=10.5 600=15<br />
// mehr nicht!]<br />
#define REFLEX_FREQ 0.1 // Frequenz des Reflexes [Hz]<br />
#define LADEZEIT 90 // Ladezeit [min]<br />
76
#define LADESTROM 86 // Ladestrom[26=4A 36=5 66=8 86=10 136=15 183=20]<br />
#if SPANNUNGSEBENE == 50<br />
#define BATT_NUM 1 // Anzahl eingesetzter Batterien<br />
#define L_BATT 5 // Indukt. = 5 [mueH] (selbstgebastelte Spule)<br />
#define U_B_0 8.3 // Anfang des Messbereichs der Batterie-Spannung [V]<br />
#define U_B_1 15.8 // Ende des Messbereichs der Batterie-Spannung [V]<br />
#define U_K_0 43.18 // Anfang des Messbereichs der Kondensator-Spannung [V]<br />
#define U_K_1 57.11 // Ende des Messbereichs der Kondensator-Spannung [V]<br />
#define U_KOND_P_MIN 47.5 // Kond.Sp. Einschalten Pufferbetrieb [V]<br />
#define U_KOND_P 47.9 // Soll-Mindestspannung im Pufferbetrieb [V]<br />
#define U_KOND_P_MAX 48.3 // Obergrenze Pufferspann._band [V]<br />
#define U_KOND_SOLL 49.0 // Sollspannung des Kondensators [V]<br />
#define U_KOND_L_MIN 51.0 // Untergrenze fuer Ladebetrieb [V]<br />
#define U_KOND_L 53.0 // Einschaltwert fuer Ladebetrieb [V]<br />
#define U_KOND_ERROR 56.5 // Einschaltwert fuer Bremswiderstand [V]<br />
#endif<br />
#if SPANNUNGSEBENE == 600<br />
#define BATT_NUM 18 // Anzahl eingesetzter Batterien<br />
#define L_BATT 100 // Indukt. = 100 [mueH] (Nieke-Spule)<br />
#define U_B_0 161.8 // Anfang des Messbereichs der Batterie-Spannung [V]<br />
#define U_B_1 325.7 // Ende des Messbereichs der Batterie-Spannung [V]<br />
#define U_K_0 532.7 // Anfang des Messbereichs der Kondensator-Spannung [V]<br />
#define U_K_1 731.0 // Ende des Messbereichs der Kondensator-Spannung [V]<br />
#define U_KOND_P_MIN 560.0 // Kond.Sp. Einschalten Pufferbetrieb [V]<br />
#define U_KOND_P 590.0 // Soll-Mindestspannung im Pufferbetrieb [V]<br />
#define U_KOND_P_MAX 600.0 // Obergrenze Kond. f. Pufferspann._band [V]<br />
#define U_KOND_SOLL 620.0 // Sollspannung des Kondensators [V]<br />
#define U_KOND_L_MIN 630.0 // Kond.Sp. Ausschalten Ladebetrieb [V]<br />
#define U_KOND_L 650.0 // Kond.Sp. Einschalten Ladebetrieb [V]<br />
#define U_KOND_ERROR 684.6 // Kond.Sp. Einschaltwert fuer Bremswiderstand [V]<br />
#endif<br />
#define U_BATT_END 14.3 // Ladeschluss-Spannung [V] / Batt<br />
#define U_BATT_ERROR 16.0 // Ueber-Spannung [V] / Batt<br />
#define U_BATT_HOLD 13.3 // Erhaltungsladung_Spannung [V] / Batt<br />
#define U_BATT_NOM 12.0 // Nominal_Spannung 12.0 V / Batt<br />
#define U_BATT_MIN 10.0 // Entlade_Spannung 10.0 V / Batt<br />
#define I_BATT_ERROR 48 // zul. Maximalstrom (Error_Ausloesung) [A]<br />
#define I_BATT_MAX 0.25 // maximaler Ladestrom (Hauptladung_1, Anteil von c_batt_init)<br />
#define C_BATT_W_EIN 40 // Batterie_Kapazitaet [%], bei der die W-Ladung beginnt<br />
#define C_BATT_W_0 110 // Batterie_Kapazitaet [%], bei der der W-Strom 0 ist (fiktiv)<br />
// Netzstromrichter<br />
#define PP_NETZ 1024 // Periodenregister fuer PWM1..PWM3 (Netz) -> 19.53 kHz<br />
#define PWM_OPT 0 // Pulsmuster-Optimierung, 0 = aus, 1 = ein<br />
#define T_S_2 50 // halbe Schutzzeit (plus Zuschlag) geteilt durch 50ns<br />
#define T_S_4 25 // 1/2 * T_S_2<br />
#define L_SRN 1.1e-3 // Induktivitaet der Drossel / Leitung des Netzstromrichters<br />
// nur Drossel: 1,3mH bei 120Hz (1mH bei 1kHz)<br />
// Widerstand: 0,135mH<br />
#define R_SRN 1.8 // Widerstand (600 V)<br />
#define PHI_UI 0 // Phasenverschiebung Spannung - Strom in Grad<br />
#define I_NETZ_S 0 // Effektivwert Netzstrom in Ampere<br />
// Wechselstroeme<br />
// Messbereich: -50 A .. +50 A (ausgemessen am 10.03.00)<br />
#define I_SRN_MIN 409 // AD-Wert, entspricht -10A<br />
#define I_SRN_MAX 614 // AD-Wert, entspricht 10A<br />
77
�<br />
#define I_LAST_MIN 409 // AD-Wert, entspricht -10A<br />
#define I_LAST_MAX 614 // AD-Wert, entspricht 10A<br />
#define LIMIT 8 // max. Fehlerpunkte -> adc.c<br />
#if REG_TYP_NETZ == 2<br />
//fuer die von Christoph entworfene Regelung<br />
//fuer den PI Regler<br />
// #define RPI_E_0 1.087 //IDEAL fuer T=1/1400<br />
// #define RPI_E_1 -0.72 //IDEAL fuer T=1/1400<br />
// #define RPI_E_0 1.052 //IDEAL fuer T=1/1650<br />
// #define RPI_E_1 -0.748 //IDEAL fuer T=1/1650<br />
// #define RPI_E_0 1.028 //IDEAL fuer T=1/1950<br />
// #define RPI_E_1 -0.778 //IDEAL fuer T=1/1950<br />
// #define RPI_E_0 1.014 //IDEAL fuer T=1/2200<br />
// #define RPI_E_1 -0.7864//IDEAL fuer T=1/2200<br />
// 5 Ohm<br />
// #define RPI_E_0 3.418 //IDEAL fuer T=1/2200<br />
// #define RPI_E_1 0.2182 //IDEAL fuer T=1/2200<br />
// 1,5 Ohm<br />
#define RPI_E_0 2.515 //IDEAL fuer T=1/2200<br />
#define RPI_E_1 -1.151 //IDEAL fuer T=1/2200<br />
//Koeffizienten der Laststromkompensation<br />
//Koeffizienten fuer die Eingangsgroessen<br />
// #define L_E_0 5.175<br />
// #define L_E_1 0.883<br />
#define L_E_2 -2.124<br />
#define L_E_3 -0.5533<br />
//Koeffizienten fuer die Ausgangsgroessen<br />
// #define L_A_1 -2.369<br />
#define L_A_2 -1.818<br />
#define L_A_3 -0.4472<br />
#define L_E_0 3.103<br />
#define L_E_1 -2.223<br />
#define L_A_1 -0.4674<br />
#endif<br />
#if REG_TYP_NETZ == 5 //PID<br />
/* //0.6 Ohm<br />
#define RPID_E_0 5.433<br />
#define RPID_E_1 -3.694<br />
#define RPID_E_2 -0.2095<br />
#define RPID_A_1 0.1651<br />
#define RPID_A_2 0.8349<br />
*/<br />
// 1.5 Ohm<br />
#define RPID_E_0 4.025<br />
#define RPID_E_1 -1.078<br />
#define RPID_E_2 -0.1694<br />
#define RPID_A_1 0.1481<br />
#define RPID_A_2 0.8519<br />
/*<br />
78
*/<br />
#endif<br />
// 5 Ohm<br />
#define RPID_E_0 14.84<br />
#define RPID_E_1 4.978<br />
#define RPID_E_2 0.4171<br />
#define RPID_A_1 0.1318<br />
#define RPID_A_2 0.8682<br />
#if REG_TYP_NETZ == 4<br />
//fuer die von Christoph entworfene Regelung<br />
//1.Koeffizienten des Dead-Beat-Reglers<br />
/*<br />
//0 Ohm<br />
//Koeffizienten fuer die Eingangsgroessen fuer 1650 Hz<br />
#define R_E_0 2.29<br />
#define R_E_1 -1.798<br />
#define R_E_2 114.3e-3<br />
#define R_E_3 -1650e-6<br />
#define R_E_4 3.3e-6<br />
//Koeffizienten fuer die Ausgangsgroessen fuer 1650 Hz<br />
#define R_A_1 397.83e-3<br />
#define R_A_2 563.25e-3<br />
#define R_A_3 38.8e-3<br />
#define R_A_4 126.64e-6<br />
*/<br />
/*<br />
//1,5 Ohm<br />
//Koeffizienten fuer die Eingangsgroessen fuer 1650 Hz<br />
#define R_E_0 3.068<br />
#define R_E_1 -1.347<br />
#define R_E_2 0.081<br />
#define R_E_3 -1.15e-3<br />
#define R_E_4 2.26e-6<br />
//Koeffizienten fuer die Ausgangsgroessen fuer 1650 Hz<br />
#define R_A_1 0.45<br />
#define R_A_2 0.52<br />
#define R_A_3 0.031<br />
#define R_A_4 9.59e-5<br />
*/<br />
/* //0 Ohm<br />
//Koeffizienten fuer die Eingangsgroessen fuer 1800 Hz<br />
#define R_E_0 2.518<br />
#define R_E_1 -2.089<br />
#define R_E_2 0.173<br />
#define R_E_3 -3.49e-3<br />
#define R_E_4 11.02e-6<br />
//Koeffizienten fuer die Ausgangsgroessen fuer 1800 Hz<br />
#define R_A_1 0.364<br />
#define R_A_2 0.586<br />
#define R_A_3 0.05<br />
#define R_A_4 225.67e-6<br />
*/<br />
//1,5 Ohm<br />
//Koeffizienten fuer die Eingangsgroessen fuer 1800 Hz<br />
#define R_E_0 3.125<br />
#define R_E_1 -1.433<br />
#define R_E_2 0.11<br />
#define R_E_3 -2.17e-3<br />
79
#endif<br />
#define R_E_4 6.81e-6<br />
//Koeffizienten fuer die Ausgangsgroessen fuer 1800 Hz<br />
#define R_A_1 0.415<br />
#define R_A_2 0.544<br />
#define R_A_3 0.041<br />
#define R_A_4 1.69e-4<br />
#if REG_TYP_NETZ == 3<br />
//fuer den PI Regler a-Anteil<br />
#define R_I_N_A 0.01 // Integralanteil<br />
#define R_P_N_A 1 // Proportionalanteil<br />
//fuer den PI Regler b-Anteil<br />
#define R_I_N_B 0.01 // Integralanteil<br />
#define R_P_N_B 1 // Proportionalanteil<br />
#endif<br />
// Haeufig benoetigte Zahlen<br />
#define PI 3.141592654<br />
// Normierung<br />
/************************************************************************************************<br />
* *<br />
* Normierungen (Carsten): Umrechnungsfaktoren: *<br />
* *<br />
* Stroeme: 50 A -> 2^15 655.36/ A *<br />
* Spannungen: 4000 V -> 2^15 8.192 / V *<br />
* Widerstaende: 80 Ohm -> 2^16 819.2 / Ohm *<br />
* *<br />
* Umrechnungen fuer AD-Werte (in Carsten’s Regelung wird mit jeweils den in der ersten Zeile *<br />
* rechts stehenden Werten gerechnet): *<br />
* *<br />
* Stroeme: +/- 50 A -> 0 ... 1024 -> +/- 32768 *<br />
* Umrechnung durch Subtraktion von 512 (+/- 50 A -> -512 .. 512) *<br />
* und Multiplikation mit 64 (+/- 50 A -> -32768 ... 32768) *<br />
* (64 = 32768/512) *<br />
* Netzspannung 50 V: (+/- 600/13 V -> 0 ... 1024) -> (+/- 4000 V -> +/- 32768) *<br />
* Umrechnung durch Subtraktion von 512 (+/- 600/13 V -> +/- 512) *<br />
* und Multiplikation mit 3/4 (+/- 4000 V -> +/- 32768) *<br />
* 512 32768 48 *<br />
* k * ---------- = -------- => k = ---- (ungefaehr 3/4) *<br />
* 600/13 V 4000 V 65 *<br />
* Netzspannung 400 V: (+/- 607 V -> 0 ... 1024) -> (+/- 4000 V -> +/- 32768) *<br />
* Umrechnung durch Subtraktion von 512 (+/- 600/13 V -> +/- 512) *<br />
* und Multiplikation mit 39/4 (+/- 4000 V -> +/- 32768) *<br />
* 512 32768 39 *<br />
* k * ------- = -------- => k = ---- *<br />
* 607 V 4000 V 4 *<br />
* *<br />
* Kond.-Spg. 50 V: (43,18 V ... 57,11 V -> 0 ... 1024) -> (+/- 4000 V -> +/- 32768) *<br />
* Umrechnung durch Addition von (0 ... 43,18 -> 0 ... ) *<br />
* (var_u_kond=3174 = 1024 * 43,18 V / (57,11 V - 43,18 V)) *<br />
* und Multiplikation mit 7/64 (+/- 4000 V -> +/- 32768) *<br />
* 3174 32768 7 *<br />
* k * ---------- = -------- => k = ---- *<br />
* 43,18 V 4000 V 64 *<br />
* Wird 2/3 der Kondensatorspannung benoetigt, dann: *<br />
* 5 *<br />
80
* k = ---- *<br />
* 64 *<br />
* Kond.-Spg. 600 V: (532,7 V ... 731,0 V -> 0 ... 1024) -> (+/- 4000 V -> +/- 32768) *<br />
* Umrechnung durch Addition von (0 ... 526,5 -> 0 ... 2738) *<br />
* (var_u_kond = 2751 = 1024 * 532,7 / (731,0 - 532,7)) *<br />
* und Multiplikation mit 51/32 (+/- 4000 V -> +/- 32768) *<br />
* 2751 32768 51 *<br />
* k * ------- = -------- => k = --- *<br />
* 532,7 V 4000 V 32 *<br />
* Wird 2/3 der Kondensatorspannung benoetigt, dann: *<br />
* 34 *<br />
* k = --- *<br />
* 32 *<br />
* *<br />
* Batt.-Spg. 50 V: (8,3 V ... 15,8 V -> 0 ... 1024) -> (+/- 4000 V -> +/- 32768) *<br />
* Umrechnung durch Addition von (0 ... 8,15 -> 0 ... 1110 ) *<br />
* (1133 = 1024 * 8,3 V / (15,8 V - 8,3 V)) *<br />
* und Multiplikation mit 1/16 (+/- 4000 V -> +/- 32768) *<br />
* 1133 32768 1 *<br />
* k * ---------- = -------- => k = ---- *<br />
* 8,3 V 4000 V 16 *<br />
* *<br />
* Batt.-Spg. 600 V: (161,8 V ... 325,7 V -> 0 ... 1024) -> (+/- 4000 V -> +/- 32768) *<br />
* Umrechnung durch Addition von (0 ... 161,8 -> 0 ... 1010 ) *<br />
* (1010 = 1024 * 161,8 V / (325,7 V - 161,8 V)) *<br />
* und Multiplikation mit 42/32 (+/- 4000 V -> +/- 32768) *<br />
* 1010 32768 42 *<br />
* k * ---------- = -------- => k = ---- *<br />
* 161,8 V 4000 V 32 *<br />
* *<br />
* Rechenregeln: Bei der Multiplikation von Strom und Widerstand muss das Ergebnis *<br />
* durch 2^16 geteilt werden. *<br />
* bei der Division von Spannung und Strom oder Spannung und Widerstand *<br />
* muss der Dividend mit 2^16 multipliziert werden. *<br />
* Fuer Zwischenergebnisse long int’s verwenden! *<br />
* *<br />
************************************************************************************************/<br />
#if SPANNUNGSEBENE == 50<br />
// Fuer niedrige Spannungen (hier stehende Werte sind Faktoren im Zaehler, hinzu kommen<br />
// immer noch im Komm. stehende Werte als Schiebewerte im Nenner)<br />
#define NORM_UKZ 7 // Normierungsfaktor Kondensatorspannung: 7/64<br />
#define NORM_UKN 6 // Zaehler 7, Nenner 2^6<br />
#define NORM_UKZ_23 5 // Normierungsfaktor 2/3 * Kondensatorspannung: 5/64<br />
#define NORM_UKN_23 6 // Zaehler 5, Nenner 2^6<br />
#define NORM_UNZ 3 // Normierungsfaktor Netzspannung 3/4 (Naeherung fuer 48/65)<br />
#define NORM_UNN 2 // Zaehler 3, Nenner 2^2<br />
#define NORM_R_12 12 //Normierung fuer die Reglerkoeffizienten<br />
#define NORM_R_14 14 //Normierung fuer die Reglerkoeffizienten<br />
#define NORM_R_15 15 //Normierung der Reglerkoeffizienten<br />
#define NORM_L 9 //Normierung der Koeffizienten der Laststromkompensation<br />
#define NORM_N 9 //Normierung der Koeffizienten der Netzspannungskompensation<br />
#endif<br />
#if SPANNUNGSEBENE == 600<br />
// Fuer hohe Spannungen (hier stehende Werte sind Faktoren im Zaehler, hinzu kommen<br />
// immer noch im Komm. stehende Werte als Schiebewerte im Nenner)<br />
#define NORM_UKZ 51 // Normierungsfaktor Kondensatorspannung: 50/32<br />
#define NORM_UKN 5 // Zaehler 50, Nenner 2^5<br />
#define NORM_UKZ_23 34 // Normierungsfaktor 2/3 * Kondensatorspannung: 34/32<br />
#define NORM_UKN_23 5 // Zaehler 34, Nenner 2^5<br />
81
�<br />
#define NORM_UNZ 39 // Normierungsfaktor Netzspannung: 39/4<br />
#define NORM_UNN 2 // Zaehler 39, Nenner 2^2<br />
#define NORM_R_12 12 //Normierung fuer die Reglerkoeffizienten<br />
#define NORM_R_14 14 //Normierung fuer die Reglerkoeffizienten<br />
#define NORM_R_15 15 //Normierung der Reglerkoeffizienten<br />
#define NORM_L 9 //Normierung der Koeffizienten der Laststromkompensation<br />
#define<br />
#endif<br />
NORM_N 9 //Normierung der Koeffizienten der Netzspannungskompensation<br />
82
A.2. main.c<br />
#include // fuer Sinus-Berechnung und Exp.-Fkt.<br />
#include // fuer Absolut-Wert-Berechnung<br />
#include "Main.h"<br />
//letzte Aenderung von Christoph am 15.4.00, um die Normierung der Regler-,<br />
//Laststromkompensations- und Netzspannungskompensationskoeffizienten in der init()<br />
/*************************************************************************************************<br />
* *<br />
* main: Hauptprogramm *<br />
* init: Initialisierung aller Interrupts, Setzen von Startwerten, ... *<br />
* Schleife: enthaelt alle Routinen die permanent abgearbeitet werden sollen *<br />
* *<br />
* adc_isr: PEC-Transfer der 16 AD-Kanaele in Feld AD_dat[], nach letzter Wandlung: *<br />
* Neu-Initialisierung des PEC-Transfers *<br />
* check_batterie(): *<br />
* Uebertragen der AD-Wandler-Resultate *<br />
* Error-Abfragen *<br />
* Pruefen der Kondensatorspannung und des Batterie-Modes (Laden, Puffern, Standby) *<br />
* Freigabe (bzw. Sperren) von Interrupts: *<br />
* Puffern: pwm_isr -> PIE0 = 1 *<br />
* Laden: t2_isr -> T2R = 1 (0) *<br />
* *<br />
* pwm_isr: Interrupt fuer alle 4 PWM-Kanaele *<br />
* Kanal 0: -> einmalige Abarbeitung *<br />
* Loeschen der IR-Anforderung (PIR0) und der Freigabe (PIE0) *<br />
* puffere_kondensator(): Berechnung der Pulsweite || standby *<br />
* *<br />
* t2_isr: Abarbeitung alle 1.0 Sekunden; Freigabe in ad_isr; Sperren in ad_isr || hier *<br />
* Neu-Initialisieren des Timer Registers *<br />
* lade_batterie(): Batterie_Ladung entsprechend Kennlinie *<br />
* *<br />
*************************************************************************************************/<br />
/*t2_isr<br />
/*************************************************************************************************/<br />
/*************************************************************************************************/<br />
interrupt (0x22) void t2_isr(void)<br />
/*************************************************************************************************/<br />
/*************************************************************************************************/<br />
/* Interrupt fuer Timer 2, wird benutzt zum Aktivieren der PWM-Regelung<br />
letzte Aenderung: 19.05.00 von Jan Hanno Carstens<br />
erstellt von: Jan Hanno Carstens<br />
*/<br />
{<br />
T2IE = 0;<br />
T2 = 0;<br />
_putbit(0,P7,6); // Freigabe fuer PWM 1-3 (Signal invertiert)<br />
// (Signal geht an Platine fuer Verzoegerungsschaltung)<br />
} // Ende t2_isr<br />
/*t4_isr<br />
/*************************************************************************************************/<br />
/*************************************************************************************************/<br />
interrupt (0x24) void t4_isr(void)<br />
/*************************************************************************************************/<br />
/*************************************************************************************************/<br />
/* Interrupt fuer Timer 4, wird benutzt zum Aufruf der AD-Wandlung<br />
letzte Aenderung: 15.05.00 von Jan Hanno Carstens<br />
83
erstellt von: Jan Hanno Carstens<br />
*/<br />
{<br />
_putbit(1,P8,5);<br />
ADCIE = 1; // AD-Interrupt wieder ermoeglichen<br />
ADST = 1; // Starting conversion<br />
T4 = t4_freq; // Zeit bis zum naechsten Timer-Aufruf<br />
T4R = 1; // Timer-4 Run-Bit soll neu loslaufen<br />
_putbit(0,P8,5);<br />
} // Ende t4_isr<br />
/*main<br />
/*************************************************************************************************/<br />
/*************************************************************************************************/<br />
void main(void)<br />
/*************************************************************************************************/<br />
/*************************************************************************************************/<br />
/* Hauptprogramm fuer gesamte Regelung von Controller 1<br />
letzte Aenderung: 02.03.00 von Jan Hanno Carstens<br />
erstellt von: Thomas Sadowski (1997)<br />
erweitert: - Carsten Riefle (1998)<br />
- Christoph Saniter<br />
*/<br />
{<br />
maketables(); // erstelle Kosinus- und Wurzeltabelle<br />
init(); // konfiguriere und initialisiere Register, Interrupts, ...<br />
for(;;) // Endlos-Schleife mit Hauptprogrammm<br />
{ // Abarbeitung ohne IR auf niedrigstem IR-Level (0)<br />
// ausgelesen und zurueckgesetzt)<br />
}<br />
} // Ende main<br />
/*init<br />
/*************************************************************************************************/<br />
/*************************************************************************************************/<br />
static void init(void)<br />
/*************************************************************************************************/<br />
/*************************************************************************************************/<br />
/* Initialisierung fuer Controller<br />
letzte Aenderung: 20.03.00 von Jan Hanno Carstens<br />
Aufruf in: ’main’<br />
erstellt von: Thomas Sadowski (1997)<br />
erweitert: - Carsten Riefle (1998)<br />
- Christoph Saniter (2000)<br />
*/<br />
{<br />
/********************************* Variablendefinition *******************************************/<br />
// Variablen fuer Batterie und Zwischenkreis<br />
float u_k_0, u_k_1;<br />
float dummy;<br />
float abt_freq;<br />
float kr_n_z_a, tr_n_z_a, kr_n_z_b, tr_n_z_b;<br />
float trottel; // Zaehler fuer AD-Wandler<br />
// Folgende Variablen sind in *.h-Dateien deklariert<br />
extern int AD_dat[];<br />
extern int var_u_kond;<br />
// Variablen fuer Netzstromrichter<br />
float T_tast; // effektive Abtastzeit fuer Netzfilterung<br />
84
�<br />
float rlt; // rlt = R_SRN / L_SRN * T_tast<br />
float r_srn, l_srn;<br />
float wT; // 50Hz * 2 * PI * T_tast<br />
float H_srn; // Eingangsmatrix des Netzstromrichters<br />
float Phi_srn; // Rueckkopplungsmatrix des Netzstromrichters<br />
float u_phase; // Phasenverschiebung durch Spannungsmessung<br />
extern long int V_srn; // Vorfiltermatrix des Netzstromrichters<br />
extern long int Reg1_srn; // Reglermatrix des Netzstromrichters, Parameter fuer u_srn<br />
extern long int Reg2_srn; // Reglermatrix des Netzstromrichters, Parameter fuer i_srn<br />
extern long int M_srn_a; // Stoergroessenkompensation Realteil<br />
extern long int M_srn_b; // Stoergroessenkompensation Imaginaerteil<br />
extern long int Reg_srn; // Reglermatrix des Netzstromrichters (Test)<br />
extern long int fak_e_a, fak_e_a_alt, fak_e_b, fak_e_b_alt;<br />
//fuer die von Christoph entworfene Regelung<br />
//1.Koefizienten des Dead-Beat-Reglers<br />
extern int q0, q1, q2, q3, q4; //Koeffizienten fuer die Ausgangsgroessen<br />
extern int p1, p2, p3, p4; //Koeffizienten fuer die Eingangsgroessen<br />
//2.Koefizienten des PI Reglers<br />
//Koeffizienten fuer die Eingangsgroessen<br />
extern int RE0, RE1; //Koeffizienten fuer die Eingangsgroessen<br />
extern int RE0_PID, RE1_PID, RE2_PID, RA1_PID, RA2_PID; //Koeffizienten fuer die Eingangsgroessen<br />
//Koeffizienten der Netzspannungskompensation<br />
extern int NE0, NE1, NE2; //Koeffizienten fuer die Eingangsgroessen<br />
extern int NA1, NA2; //Koeffizienten fuer die Ausgangsgroessen<br />
//Koeffizienten der Laststromkompensation<br />
extern int LE0, LE1, LE2, LE3; //Koeffizienten fuer die Eingangsgroessen<br />
extern int LA1, LA2, LA3; //Koeffizienten fuer die Ausgangsgroessen<br />
extern int wL;<br />
extern int i_netz_s; // Amplitude Netzstrom<br />
/************************ Waehrend INIT keine Interrupts ***************************************/<br />
IEN = 0;<br />
/************************************** Batterie-Ports *******************************************/<br />
// (Modi und Laempchen)<br />
_putbit(1,DP7,4); // Direction Port 7, Kanal 4 -> Ausgang<br />
_putbit(1,DP7,5); // Direktion Port 7, Kanal 5 -> Ausgang<br />
_putbit(1,ODP7,4); // Open Drain mode Port 7, Kanal 4 -> open<br />
_putbit(1,ODP7,5); // Open Drain mode Port 7, Kanal 5 -> open<br />
_putbit(1,P7,4); // standby-mode fuer Batterie-charger<br />
_putbit(1,P7,5); // standby-mode fuer Batterie-charger<br />
_putbit(1,ODP7,7); // Open Drain mode Port 7.7 -> open<br />
// (genereller Error) (Eingang)<br />
// (Notaus-Modus f. Akku-Ladung)<br />
_putbit(1,DP8,2); // Direction Port 7, Kanal 4 -> Ausgang<br />
_putbit(1,DP8,3); // Direktion Port 7, Kanal 5 -> Ausgang<br />
_putbit(0,P8,2);<br />
_putbit(0,P8,3);<br />
/********************************* PWM-Netz-Ports ************************************************/<br />
_putbit(1,DP7,0); // Direction select Port 7, Kanal 0 -> Ausgang<br />
_putbit(1,DP7,1); // Direction select Port 7, Kanal 1 -> Ausgang<br />
_putbit(1,DP7,2); // Direction select Port 7, Kanal 2 -> Ausgang<br />
_putbit(1,DP7,3); // Direction select Port 7, Kanal 3 -> Ausgang<br />
_putbit(1,P7,0); // PWM-Signal (P7.0) invertieren<br />
_putbit(1,P7,1); // PWM-Signal (P7.1) invertieren<br />
_putbit(1,P7,2); // PWM-Signal (P7.2) invertieren<br />
_putbit(1,P7,3); // PWM-Signal (P7.3) invertieren<br />
85
�<br />
// PWM-Signal kann nicht gesetzt, nur invertiert werden!<br />
// Freigabe PWM 1-3<br />
_putbit(1,P7,6); // zunaechst keine Freigabe fuer PWM 1-3 (Signal invertiert)<br />
// (Signal geht an Platine fuer Verzoegerungsschaltung)<br />
// Nimmt der das jetzt ueberhaupt schon an?<br />
// Lieber unten noch einmal.<br />
_putbit(1,DP7,6); // Direction select Port 7, Bit 6 -> Ausgang<br />
_putbit(1,P7,6); // zunaechst keine Freigabe fuer PWM 1-3 (Signal invertiert)<br />
// (Signal geht an Platine fuer Verzoegerungsschaltung)<br />
_putbit(1,DP8,5);<br />
_putbit(0,P8,5);<br />
//nur fuer Kontrollzwecke in der Funktion filtere_netz<br />
_putbit(1,DP8,6);<br />
_putbit(0,P8,6);<br />
//nur fuer Kontrollzwecke in der Funktion adc.c<br />
/******************************* Bremse-Ports ***************************************************/<br />
_putbit(1,DP8,1); // Direction select Port 8, Bit 1 -> Ausgang<br />
_putbit(0,P8,1); // Bremse aus<br />
/**************************** Peripherie-Fehlersignal-Ports *************************************/<br />
_putbit(1, DP8,0); // Direction select Port 8, Bit 0 -> Ausgang<br />
_putbit(1, P8,0); // Fehler-Reset-Signal (bisher nur an Steuerplatine) geben<br />
/************************************<br />
// allgemein<br />
PWM-Init **************************************************/<br />
PWMCON0 = PWMCON1 = 0; // Init (nur fuer Simulator notwendig)<br />
// PWM 0 (Batterie)<br />
PP0 = 20000 / FREQ_BATT; // Perioden-Register (PTI0 = 1): PP0 = 20 MHz / f[kHz]<br />
PW0 = 0; // Pulsweiten-Register<br />
PEN0 = 1; // Pwm output ENable<br />
PTI0 = 0; // Pwm Timer Inputselect bit (0=CPU-Takt,1=CPU/64)<br />
PTR0 = 1; // Pwm Timer Run bit (1=run)<br />
PIE0 = 0; // Pwm Interrupt ENable Kanal 0<br />
// PWM 1 (Netz Phase U)<br />
PP1 = PP_NETZ; // Perioden-Register (PTI1 = 1) -> 19.53 kHz<br />
PT1 = 0; // Zaehlregister initialisieren<br />
PEN1 = 1; // Pwm output ENable<br />
PTI1 = 0; // Pwm Timer Inputselect bit (0=CPU-Takt,1=CPU/64)<br />
PIE1 = 0; // Pwm Interrupt ENable Kanal 1<br />
PM1 = 1; // center alligned, wenn 1<br />
// PWM 2 (Netz Phase V)<br />
PP2 = PP_NETZ; // Perioden-Register (PTI2 = 1) -> 19.53 kHz<br />
PT2 = 0; // Zaehlregister initialisieren<br />
PEN2 = 1; // Pwm output ENable<br />
PTI2 = 0; // Pwm Timer Inputselect bit (0=CPU-Takt,1=CPU/64)<br />
PIE2 = 0; // Pwm Interrupt ENable Kanal 2<br />
PM2 = 1; // center alligned, wenn 1<br />
// PWM 3 (Netz Phase W)<br />
PP3 = PP_NETZ; // Perioden-Register (PTI3 = 1) -> 19.53 kHz<br />
PT3 = 0; // Zaehlregister initialisieren<br />
PEN3 = 1; // Pwm output ENable<br />
PTI3 = 0; // Pwm Timer Inputselect bit (0=CPU-Takt,1=CPU/64)<br />
PIE3 = 0; // Pwm Interrupt ENable Kanal 3<br />
PM3 = 1; // center alligned, wenn 1<br />
// PWM auf 512 vorbelegen<br />
PW1 = 0x200; // Pulsweiten-Register<br />
PW2 = 0x200; // Pulsweiten-Register<br />
PW3 = 0x200; // Pulsweiten-Register<br />
// PWM 1-3 Runbits<br />
86
PWMCON0 = PWMCON0 | 0xE; // Runbits (PTR1,2,3) fuer PWM 1-3 gleichzeitig auf 1 setzen<br />
// (Synchronisation)<br />
// allgemein (PWM-Interrupt-Control.Reg.)<br />
PWMIC = 0x48; // IR enabled, priority=2, group=0)<br />
/************************************ T2 Init ****************************************************/<br />
T2IC = 0x45; // Timer2: IR enabled, priority=1, group=1)<br />
T2CON = 0x00C7; // Timer2: Konfiguration: s. unten<br />
/* T2UD = 1; // abwaerts<br />
T2UDE = 0; // keine externe Richtungssteuerung<br />
T2I = 7; // f_CPU/1024<br />
T2M = 0; // Mode : einfacher Timer<br />
T2R = 1; // Run-Bit, 1 = gestartet<br />
T2 = 19530; // 1s<br />
*/<br />
T2 = 10000;<br />
/************************************ T4 Init ****************************************************/<br />
T4IC = 0x48; // Timer4: IR enabled, priority=2, group=1)<br />
T4CON = 0x00C1; // Timer4: Konfiguration: s. unten<br />
/* T4UD = 1; // abwaerts<br />
T4UDE = 0; // keine externe Richtungssteuerung<br />
T4I = 1; // f_CPU/16<br />
T4M = 0; // Mode : einfacher Timer<br />
T4R = 1; // Run-Bit, 1 = gestartet<br />
T4 = 1250000; // 1s<br />
*/<br />
dummy = 1250000*((1./ABT_FREQ)-5.0e-6); // T4-IR beruecksichtigt<br />
t4_freq = (int)dummy;<br />
T4 = t4_freq;<br />
/**************************** Batterie- und Kondensator-Variablen *******************************/<br />
dummy = 1024*U_K_0 / (U_K_1-U_K_0); // Variable fuer Netzregelung<br />
var_u_kond = (int)dummy; // Variable fuer Netzregelung<br />
r_srn = R_SRN;<br />
l_srn = L_SRN;<br />
u_k_0 = U_K_0;<br />
u_k_1 = U_K_1;<br />
abt_freq = ABT_FREQ;<br />
/********************************* AD-Wandler, PEC0 Init *****************************************/<br />
SRCP0 = (int)&ADDAT; // SourcePointer PEC Kanal 0<br />
DSTP0 = (int)&AD_dat[0]; // Dest.Pointer -> AD-Kanal 15 nach ad_dat[0], 14 nach [1], ...<br />
////PECC0 = 0x0210; // INC=01 (DSTP0++), COUNT=16, word transfer<br />
ADCIC = 0x78; // IR enabled, PEC0(priority=14, group=0)<br />
////ADCON = 0x2bf; // Kanal 0 - 15, auto scan continuous conversion<br />
//ADCON = 0x22f; // Kanal 0 - 15, auto scan single conversion<br />
// 0010 0010 1111<br />
PECC0 = 0x020c; // INC=01 (DSTP0++), COUNT=14<br />
ADCON = 0x2bb; // Kanal 0 - 13<br />
/*********************** Variablen fuer Netzstromrichter-Regelung *******************************/<br />
// allgemeine Groessen<br />
T_tast = 1./abt_freq; // effektive Regler-Abtastzeit (Zeit, nach der der Netzfilterung<br />
// neue Werte zur Verfuegung gestellt werden<br />
rlt = r_srn / l_srn * T_tast; // Hilfsgroesse, einheitenlos<br />
wT = 50.0 * 2.0 * PI * T_tast; // Hilfsgroesse, einheitenlos<br />
#if REG_TYP_NETZ == 1<br />
/********************* Zustandsregler mit Stoergroessenaufschaltung ***************************/<br />
// Regelparameter Zustandsregler als Dead-Beat-Regler<br />
// Rueckkopplungsmatrix der Regelstrecke (Netzstromrichter)<br />
// Phi_srn = (float) (exp(-rlt) * exp(-rlt/2));<br />
Phi_srn = (float) (exp(-rlt)); // = 0.766 bei 1.75 Ohm, 1mH, 150us<br />
// = 0.991 bei 30mOhm, 1mH, 300us<br />
87
Rueckkopplungsmatrix des Netzstromrichters<br />
// Typ float, Groessen unnormiert und einheitenlos<br />
// Eingangsmatrix der Regelstrecke (Netzstromrichter)<br />
// H_srn = (float) (1/R_SRN * (1 - exp(-rlt) * exp(-rlt/2)));<br />
// H_srn = (float) (1/R_SRN * (1 - Phi_srn));<br />
dummy = 1./r_srn;<br />
dummy = dummy * (1.-Phi_srn);<br />
H_srn = dummy; // = 0.133 bei 1.75 Ohm, 1mH, 150us<br />
// = 0.299 bei 30mOhm, 1mH, 300us<br />
// Eingangsmatrix des Netzstromrichters<br />
// Typ float, Groessen unnormiert, Einheit Siemens<br />
// alte Version fuer Sinusstrom durch Widerstand<br />
Reg_srn = (long) (Phi_srn* 819.2/H_srn);<br />
// = 4704 bei 1.75 Ohm, 1mH, 150us<br />
// Reglermatrix des Netzstromrichters<br />
// 819.2: Widerstandsnormierung<br />
// Typ int, Groessen normiert, Einheit Ohm<br />
V_srn = (long) (819.2/H_srn); // = 6137 bei 1.75 Ohm, 1mH, 150us<br />
// = 2743 bei 30mOhm, 1mH, 300us<br />
// Vorfiltermatrix des Netzstromrichters<br />
// Typ int, Groessen normiert, Einheit Ohm<br />
// neue Version fuer Netzfilter<br />
// Sollstrom (wenn in pwm.c entsprechend eingebunden)<br />
// momentan ueber Poti (ADC) eingegeben<br />
// i_netz_s = I_NETZ_S * 1.414 * 655.36;<br />
// Sollstrom Netz, Amplitude, normiert<br />
// z.Z. aus Globals, spaeter aus Energiebilanz<br />
// Phasenwinkel (Nur gueltig bei entsprechender Variablendeklaration)<br />
// phi_ui = -PHI_UI * PI / 180;<br />
// Phasenwinkel PHI_UI im Bogenmass<br />
// cos_phi_ui = (float) (cos(phi_ui) * 16384.0);<br />
// Kosinus des Phasenwinkels, normiert<br />
// z.Z. aus Globals, spaeter aus Energiebilanz<br />
// einheitenlos, normiert auf 2^15<br />
// sin_phi_ui = (float) (sin(phi_ui) * 16384.0);<br />
// Sinus des Phasenwinkels, normiert<br />
// z.Z. aus Globals, spaeter aus Energiebilanz<br />
// einheitenlos, normiert auf 2^15<br />
// Reglerrueckfuehrungsmatrix<br />
Reg1_srn = (long) (Phi_srn * 16384.0);<br />
// Reglermatrix, Parameter fuer u_srn, normiert, einheitenlos<br />
// = 16237 bei 30mOhm, 1mH, 300us, auf 2^14 normiert<br />
dummy = 819.2 * Phi_srn;<br />
if (Phi_srn < 1.e-3) // Sicherheitsabfrage muss,<br />
dummy = 0; // sonst Compilermuell<br />
else<br />
dummy = dummy * Phi_srn;<br />
Reg2_srn = (long) (dummy / H_srn);<br />
// Reglermatrix, Parameter fuer i_srn, normiert, Einheit Ohm<br />
// Reg2_srn = (long) (Phi_srn * Phi_srn / H_srn * 819.2);<br />
// Reglermatrix, Parameter fuer i_srn, normiert, Einheit Ohm<br />
// = 3284 bei 30mOhm, 1mH, 300us<br />
// Stoergroessenkompensation (Netzspannung)<br />
// Bei der rechnerischen Ermittlung von M muss die Phasenverschiebung durch die Spannungs-<br />
// messplatinen (11 Grad) mitberuecksichtigt werden.<br />
//M_srn_a = (cos(wT/2.0) * (cos(wT) + (float) Reg1_srn / 16384.0) - sin(wT) * sin(wT/2.0)) * 16384.0;<br />
// Stoergroessenkompensation, Realteil<br />
88
�<br />
// einheitenlos, normiert auf 2^14<br />
//M_srn_b = ((cos(wT) + (float) Reg1_srn / 16384.0) * sin(wT/2.0) + sin(wT) * cos(wT/2.0)) * 16384.0;<br />
// Stoergroessenkompensation, Imaginaerteil<br />
// einheitenlos, normiert auf 2^14<br />
// mit Phasenverschiebung:<br />
// Optimumfuer 50 V:<br />
//u_phase = 3; //Phase in Grad<br />
// Optimum fuer 600 V:<br />
u_phase = 2; //Phase in Grad<br />
u_phase = u_phase*PI/180; //Phase in Bogenmass<br />
M_srn_a = (cos(wT/2.0+u_phase) * (cos(wT) + (float) Reg1_srn / 16384.0) - sin(wT) *<br />
sin(wT/2.0+u_phase)) * 16384.0;<br />
M_srn_b = ((cos(wT) + (float) Reg1_srn / 16384.0) * sin(wT/2.0+u_phase) + sin(wT) *<br />
cos(wT/2.0+u_phase)) * 16384.0;<br />
// M_srn_a = 21980; // siehe Mathcad, (z + R1/2) * z^0.5 * exp(jw*600us)<br />
// M_srn_b = 7258; // siehe Mathcad, (z + R1/2) * z^0.5 * exp(jw*600us)<br />
// M_srn_a = 28570; // siehe Mathcad, (z + R1) * z^0.5 * exp(jw*600us)<br />
// M_srn_b = 8889; // siehe Mathcad, (z + R1) * z^0.5 * exp(jw*600us)<br />
// M_srn_a = 25970; // (z + R1) * z^0.5 * exp(jw*600us) / 1.1<br />
// M_srn_b = 8081; // (z + R1) * z^0.5 + exp(jw*600us) / 1.1<br />
// M_srn_a = 26016; // experimentell ermittelt fuer R = 1 Ohm<br />
// M_srn_b = 4752; // experimentell ermittelt fuer R = 1 Ohm<br />
// M_srn_a = 30152; // experimentell ermittelt fuer R = 0 Ohm<br />
//<br />
#endif<br />
M_srn_b = 5288; // experimentell ermittelt fuer R = 0 Ohm<br />
#if REG_TYP_NETZ == 2<br />
/***************************** PI-Regler in d/q-Koordinaten ********************/<br />
//Koeffizientes des Reglers<br />
RE0=RPI_E_0*819.2;<br />
RE1=RPI_E_1*819.2;<br />
//Koeffizienten der Laststromkompensation<br />
//Koeffizienten fuer die Eingangsgroessen<br />
LE0=L_E_0*819.2;<br />
LE1=L_E_1*819.2;<br />
LE2=L_E_2*819.2;<br />
LE3=L_E_3*819.2;<br />
//Koeffizienten fuer die Ausgangsgroessen<br />
LA1=L_A_1*(1
p1=R_A_1*1024;<br />
p2=R_A_2*1024;<br />
p3=R_A_3*1024;<br />
trottel=(R_A_4*1024);<br />
p4=trottel*16384;<br />
#endif<br />
#if REG_TYP_NETZ == 3<br />
/***************************** Zustandsregler mit PI-Regler ***********************************/<br />
//fuer den PI Regler a-Anteil<br />
kr_n_z_a = R_I_N_A;<br />
tr_n_z_a = R_P_N_A/R_I_N_A;<br />
fak_e_a = (long int) (819.2 *(kr_n_z_a*T_tast + kr_n_z_a*tr_n_z_a));<br />
fak_e_a_alt = (long int) (819.2 *(-kr_n_z_a*tr_n_z_a));<br />
//fuer den PI Regler b-Anteil<br />
kr_n_z_b = R_I_N_B;<br />
tr_n_z_b = R_P_N_B/R_I_N_B;<br />
fak_e_b = (long int) (819.2 *(kr_n_z_b*T_tast + kr_n_z_b*tr_n_z_b));<br />
fak_e_b_alt = (long int) (819.2 *(-kr_n_z_b*tr_n_z_b));<br />
// Regelparameter Zustandsregler als Dead-Beat-Regler<br />
// Rueckkopplungsmatrix der Regelstrecke (Netzstromrichter)<br />
// Phi_srn = (float) (exp(-rlt) * exp(-rlt/2));<br />
Phi_srn = (float) (exp(-rlt)); // = 0.766 bei 1.75 Ohm, 1mH, 150us<br />
// = 0.991 bei 30mOhm, 1mH, 300us<br />
// Rueckkopplungsmatrix des Netzstromrichters<br />
// Typ float, Groessen unnormiert und einheitenlos<br />
// Eingangsmatrix der Regelstrecke (Netzstromrichter)<br />
// H_srn = (float) (1/R_SRN * (1 - exp(-rlt) * exp(-rlt/2)));<br />
// H_srn = (float) (1/R_SRN * (1 - Phi_srn));<br />
dummy = 1./r_srn;<br />
dummy = dummy * (1.-Phi_srn);<br />
H_srn = dummy; // = 0.133 bei 1.75 Ohm, 1mH, 150us<br />
// = 0.299 bei 30mOhm, 1mH, 300us<br />
// Eingangsmatrix des Netzstromrichters<br />
// Typ float, Groessen unnormiert, Einheit Siemens<br />
// Reglerrueckfuehrungsmatrix<br />
Reg1_srn = (long) (Phi_srn * 16384.0);<br />
// Reglermatrix, Parameter fuer u_srn, normiert, einheitenlos<br />
// = 16237 bei 30mOhm, 1mH, 300us, auf 2^14 normiert<br />
dummy = 819.2 * Phi_srn;<br />
if (Phi_srn < 1.e-3) // Sicherheitsabfrage muss,<br />
dummy = 0; // sonst Compilermuell<br />
else<br />
dummy = dummy * Phi_srn;<br />
Reg2_srn = (long) (dummy / H_srn);<br />
// Reglermatrix, Parameter fuer i_srn, normiert, Einheit Ohm<br />
// Reg2_srn = (long) (Phi_srn * Phi_srn / H_srn * 819.2);<br />
// Reglermatrix, Parameter fuer i_srn, normiert, Einheit Ohm<br />
// mit Phasenverschiebung:<br />
u_phase = 5; //Phase in Grad<br />
u_phase = u_phase*PI/180; //Phase in Bogenmass<br />
M_srn_a = (cos(wT/2.0+u_phase) * (cos(wT) + (float) Reg1_srn / 16384.0) - sin(wT)<br />
* sin(wT/2.0+u_phase)) * 16384.0;<br />
M_srn_b = ((cos(wT) + (float) Reg1_srn / 16384.0) * sin(wT/2.0+u_phase) + sin(wT)<br />
* cos(wT/2.0+u_phase)) * 16384.0;<br />
// = 3284 bei 30mOhm, 1mH, 300us<br />
#endif<br />
/********************************* ok, and go ****************************************************/<br />
90
IEN = 1; // Interrupt mode ENabled (general)<br />
} // Ende init<br />
/*ad_10_bit<br />
/*************************************************************************************************/<br />
/*************************************************************************************************/<br />
static int ad_10_bit(float Anfang, float Ende, float Wert)<br />
/*************************************************************************************************/<br />
/*************************************************************************************************/<br />
/* Routine zum Umwandeln reeller Werte in Digits<br />
letzte Aenderung: 19.2.99 von Jan Hanno Carstens<br />
Aufruf in: ’init’<br />
erstellt von: Thomas Sadowski (1997)<br />
erweitert: - Jan Hanno Carstens<br />
*/<br />
{<br />
return((Wert - Anfang) / (Ende - Anfang) * 0x3ff);<br />
} // Ende ad_10_bit<br />
/*maketables<br />
/*************************************************************************************************/<br />
/*************************************************************************************************/<br />
static void maketables()<br />
/*************************************************************************************************/<br />
/*************************************************************************************************/<br />
/* Routine zum Erstellen von Kosinus- und Wurzeltabellen<br />
letzte Aenderung: 02.02.00 von Jan Hanno Carstens<br />
Aufruf in: ’main’<br />
erstellt von: Carsten Riefle (1998)<br />
erweitert: - Jan Hanno Carstens<br />
*/<br />
{<br />
int i; // Zaehlvarible<br />
float hilf; // Hilfsvariable zur Erstellung der Sinustabelle<br />
extern int costabl[256]; // Kosinustabelle (dekl. in pwm.h)<br />
extern int sqrttabl[1024]; // Wurzeltabelle (dekl. in pwm.h)<br />
//extern int sqrttab2[4096]; // Wurzeltabelle (dekl. in batterie.h)<br />
/****************************** Erstellen der Kosinustabelle *************************************/<br />
for (i=0; i 2^5 -> 2^9 ==> * 2^4 = 0x10<br />
sqrttabl[i] = hilf;<br />
}<br />
#endif<br />
// #if SPANNUNGSEBENE == 600<br />
// for (i=0; i 1000V ==> 2^5 -> 2^13 ==> * 2^8 = 0x100<br />
// sqrttabl[i] = hilf;<br />
// }<br />
// #endif<br />
91
� // 29.05.00<br />
/* #if SPANNUNGSEBENE == 600<br />
for (i=0; i 1000V ==> 2^5 -> 2^12 ==> * 2^7<br />
sqrttabl[i] = hilf;<br />
}<br />
#endif<br />
*/<br />
/*for (i=0; i
A.3. main.h<br />
#include <br />
#include "./Globals.h"<br />
int t4_freq;<br />
void main(void);<br />
static void init(void);<br />
static int ad_10_bit(float, float, float);<br />
static void maketables(void);<br />
93
A.4. adc.c<br />
#include "adc.h"<br />
/*adc_isr<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
interrupt(0x28) void adc_isr(void)<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/*Interrupt-Routine fuer AD-Wandlung<br />
(Wird aufgerufen, nachdem der PEC alle x Kanaele gewandelt hat)<br />
letzte Aenderung: 17.05.00 von Jan Hanno Carstens<br />
erstellt von: Thomas Sadowski (1997)<br />
Aufruf Akkumulator/Zwischenkreis U und I<br />
erweitert: - Carsten Riefle (1998)<br />
um: Aufruf Netzanbindung dreiphasig<br />
- Jan Hanno Carstens<br />
um:<br />
- Christoph Saniter<br />
*/<br />
{<br />
// Interrupt vorerst ausschalten<br />
ADCIE = 0;<br />
//TEST<br />
_putbit(1,P8,5);<br />
/***************************** PEC-Restart ********************************/<br />
DSTP0 = (int)&AD_dat[0]; // Dest.Pointer<br />
PECC0 = 0x020c; // INC=01 (DSTP0++), COUNT=12<br />
// Anweisungen in Wert 0x... enthalten<br />
/******************************* Netz- Routine ****************************/<br />
check_netz(); // Daten lesen<br />
filtere_netz(); // Daten bearbeiten -> Regelung<br />
//TEST<br />
_putbit(0,P8,5);<br />
} // Ende adc_isr<br />
/*notaus<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
void notaus(int typ)<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/*<br />
Fkt. zum Ausschalten des Batteriebetriebs<br />
aufgerufen durch check_batterie<br />
letzte Aenderung: 23.12.99 von Jan Hanno Carstens<br />
erstellt von: Jan Hanno Carstens (1999)<br />
*/<br />
{<br />
int dummy = 0;<br />
if(typ == 1) // Strom zu hoch<br />
{<br />
_putbit(1,P8,2);<br />
_putbit(1,P8,3);<br />
}<br />
if(typ == 2) // Kond.-Ueberspannung<br />
{<br />
94
_putbit(0,P8,2);<br />
_putbit(1,P8,3);<br />
}<br />
if(typ == 3) // Batt.-Ueberspannung<br />
{<br />
_putbit(1,P8,2);<br />
_putbit(0,P8,3);<br />
}<br />
if(typ == 4) // Externer Stopp<br />
{<br />
_putbit(0,P8,2);<br />
_putbit(0,P8,3);<br />
}<br />
exit(dummy); // Programm beenden<br />
} // Ende notaus<br />
/*check_netz<br />
/******************************************************************************/<br />
/********************************************************************************/<br />
static void check_netz(void)<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/*<br />
hier alles, was das Netz AD-Wandlermaessig betrifft<br />
aufgerufen durch adc_isr<br />
letzte Aenderung: 19.05.00 von Jan Hanno Carstens<br />
erstellt von: Carsten Riefle (1998)<br />
Netz-, Lastleitungen U und I<br />
erweitert: - Jan Hanno Carstens<br />
- Christoph Saniter<br />
*/<br />
{<br />
static int pointer = 0; // Zaehlvariable<br />
// fuer 12 gelesene Kanaele<br />
// U bzw. U - V<br />
u_netz_uv = (AD_dat[6] & 0x3ff)+3;// AD-Kanal 5, untere 10 Bit<br />
i_srn_u = (AD_dat[2] & 0x3ff); // AD-Kanal 9, untere 10 Bit<br />
i_last_u = (AD_dat[4] & 0x3ff); // AD-Kanal 7, untere 10 Bit<br />
// V bzw. V - W<br />
u_netz_vw = (AD_dat[7] & 0x3ff)+3;// AD-Kanal 4, untere 10 Bit<br />
i_srn_v = (AD_dat[3] & 0x3ff); // AD-Kanal 8, untere 10 Bit<br />
i_last_v = (AD_dat[5] & 0x3ff); // AD-Kanal 6, untere 10 Bit<br />
// Kondensator<br />
u_kond = (AD_dat[9] & 0x3ff); // AD-Kanal 2<br />
// Sollstromeffektivwert<br />
i_netz_poti = (AD_dat[11] & 0x3ff)
i_srn_u_buf[pointer] = i_srn_u;<br />
// i_srn_v_buf[pointer] = i_srn_v;<br />
// pointer = pointer+1;<br />
// if (pointer >= 36) pointer = 0;<br />
// u_netz_vw = u_n_vw_buf[pointer];<br />
// u_netz_uv = u_n_uv_buf[pointer];<br />
// i_srn_u = i_srn_u_buf[pointer];<br />
// i_srn_v = i_srn_v_buf[pointer];<br />
/********************* Netzstromrichter abschalten bei Error-Signal ***********/<br />
if (_getbit(P7, 7) == 0) // Fehler, IGBT gibt Fehlermeldung (Waerme, Strom)<br />
_putbit(1,P7,6); // PWM 1-3 sperren<br />
// (Signal geht an Platine fuer Verzoegerungsschaltung)<br />
/********************************************************************************/<br />
} // Ende check_netz<br />
/*filtere_netz<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
static void filtere_netz(void)<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/* Berechnet Pulsweiten fuer Netzwechselrichter<br />
letzte Aenderung: 31.05.00 von Jan Hanno Carstens<br />
Aufruf in ’pwm_isr’<br />
erstellt von: Carsten Riefle (1998)<br />
erweitert: - Jan Hanno Carstens<br />
um: - Laststrom negiert mit 2 Windungen gegenueber Carsten’s Version<br />
- andere Spannungsmess-Platine bei 50 V -> andere Normierung (19.08.99)<br />
- andere Spannungsmess-Platine bei 600V -> andere Normierung (22.12.99)<br />
erweitert: - Christoph Saniter (11.4.00)<br />
um: -den Teil, der die Regelung betrifft<br />
*/<br />
{<br />
int u_c_23; // normierte Kondensatorspannung * 2/3<br />
int sektor; // Sektor (1 - 6)<br />
int u_netz_a, u_netz_b; // normierte Netzspannung<br />
// a (alpha): Realteil, b (beta): Imaginaerteil<br />
int u_netz; // Betrag der Netzspannung<br />
//long int quadsum; // Hilfsgroesse zur Berechnung von u_netz<br />
//int betrag_o, betrag_u; // Hilfsgroessen zur Berechnung von u_netz<br />
//unsigned int rest; // Hilfsgroesse zur Berechnung von u_netz<br />
long int u_netz_ae, u_netz_be; // normierte Netzspannung, auf Einheitskreis projeziert<br />
// Wenn nicht long int, dann auf keinen Fall auf 2^15<br />
// normieren, sonst Ueberlauf bei Rundungsfehler!<br />
static long int u_srn_a = 0, // normierte Stellspannung fuer Stromrichter<br />
u_srn_b = 0; // static, weil alte Werte in Berechnung eingehen<br />
long int u_srn_bn; // Index n bedeutet: um Faktor sqrt(3) verringert<br />
// Rechenaufwand dann insgesamt geringer<br />
int i_s_a, i_s_b; // normierte Sollstroeme in ab<br />
int i_srn_a, i_srn_b; // normierter Strom durch Netzstromrichter in ab<br />
int i_last_a, i_last_b; // normierter Laststrom in ab<br />
#if REG_TYP_NETZ == 1 // ZUSTANDSREGLER<br />
long int u_srn_a1, u_srn_a2, u_srn_a3; // Hilfsgroessen zur Berechnung von u_srn_a<br />
long int u_srn_b1, u_srn_b2, u_srn_b3; // Hilfsgroessen zur Berechnung von u_srn_b<br />
#endif<br />
#if REG_TYP_NETZ == 3 // ZUSTANDSREGLER MIT PI<br />
long int u_srn_a1, u_srn_a2, u_srn_a3; // Hilfsgroessen zur Berechnung von u_srn_a<br />
long int u_srn_b1, u_srn_b2, u_srn_b3; // Hilfsgroessen zur Berechnung von u_srn_b<br />
long int e_i_srn_a, e_i_srn_b;<br />
static long int e_i_srn_a_alt=0, e_i_srn_b_alt=0;<br />
96
static long int u_srn_a2_alt=0, u_srn_b2_alt=0;<br />
#endif<br />
�<br />
#if REG_TYP_NETZ == 2 //PI<br />
static long int u_srn_d3=0; // Hilfsgroessen zur Berechnung von u_srn_d<br />
static long int u_srn_q3=0; // Hilfsgroessen zur Berechnung von u_srn_q<br />
static long int ein_d_k_1=0, aus_d_k_1=0;<br />
static long int ein_d_k=0, ein_q_k=0;<br />
static long int ein_q_k_1=0, aus_q_k_1=0;<br />
static long int i_s_d, i_s_q; // normierte Sollstroeme in dq<br />
static long int u_srn_d=0, u_srn_q=0;<br />
#endif // REG_TYP_NETZ PI<br />
#if REG_TYP_NETZ == 5 //PID<br />
static long int u_srn_d3=0; // Hilfsgroessen zur Berechnung von u_srn_d<br />
static long int u_srn_q3=0; // Hilfsgroessen zur Berechnung von u_srn_q<br />
static long int ein_d_k_2=0, ein_d_k_1=0, aus_d_k_2=0, aus_d_k_1=0;<br />
static long int ein_d_k=0, ein_q_k=0;<br />
static long int ein_q_k_2=0, ein_q_k_1=0, aus_q_k_2=0, aus_q_k_1=0;<br />
static long int i_s_d, i_s_q; // normierte Sollstroeme in dq<br />
static long int u_srn_d=0, u_srn_q=0;<br />
#endif // REG_TYP_NETZ PID<br />
#if REG_TYP_NETZ == 4 //DEAD BEAT<br />
static long int u_srn_d3=0; // Hilfsgroessen zur Berechnung von u_srn_d<br />
static long int u_srn_q3=0; // Hilfsgroessen zur Berechnung von u_srn_q<br />
long int u_srn_d3_ein=0, u_srn_q3_ein=0, u_srn_d3_aus=0, u_srn_q3_aus=0;<br />
// zurueckliegende Werte fuer den Regler<br />
static long int u_srn_d=0, u_srn_q=0;<br />
static long int ein_d_k_4=0, ein_d_k_3=0, ein_d_k_2=0, ein_d_k_1=0, ein_d_k=0;<br />
static long int aus_d_k_4=0, aus_d_k_3=0, aus_d_k_2=0, aus_d_k_1=0;<br />
static long int ein_q_k_4=0, ein_q_k_3=0, ein_q_k_2=0, ein_q_k_1=0, ein_q_k=0;<br />
static long int aus_q_k_4=0, aus_q_k_3=0, aus_q_k_2=0, aus_q_k_1=0;<br />
#endif // REG_TYP_NETZ DEAD BEAT<br />
int t0_2, t_1, t_2; // Schaltzeiten (1 = 50ns)<br />
int pwm1, pwm2, pwm3; // Hilfsgroessen zur Berechnung von PW 1-3<br />
int cos_phi_ui, sin_phi_ui; // Phase Spannung - Strom<br />
static int i = 0; // fuer Sinustabelle<br />
/********************************************************************************/<br />
/************************************* Netzspannung *****************************/<br />
/********************************************************************************/<br />
// Raumzeiger der Netzspannung<br />
u_netz_a = (((long int)((u_netz_uv > NORM_UNN;<br />
// Realteil Netzspannung, normiert<br />
// (1536 = 3 * Offsetkorrektur)<br />
u_netz_b = ((long int)((u_netz_vw - 512) * 37) * NORM_UNZ) >> (6 + NORM_UNN);<br />
// Imaginaerteil Netzspannung<br />
// * 37/64 fuer sqrt(3)/3<br />
// Ohne Offset und Normierungen sieht das so aus:<br />
// u_netz_a = 2/3 * u_netz_uv + 1/3 * u_netz_vw,<br />
// u_netz_b = sqrt(3)/3 * u_netz_vw, Quelle: Michel<br />
//quadsum = (u_netz_a * u_netz_a + u_netz_b * u_netz_b);<br />
// Hilfsgroesse fuer u_netz<br />
/********************************************************************************/<br />
// Betrag der Netzspannung<br />
/*<br />
#if SPANNUNGSEBENE == 50<br />
betrag_u = sqrttabl[quadsum >> 8];<br />
97
Tabellenwert, untere Grenze fuer u_netz<br />
� betrag_o = sqrttabl[(quadsum >> 8) + 1];<br />
// naechster Tabellenwert, obere Grenze fuer u_netz<br />
// 62,5V abgebildet auf 2^9, Quadrat 2^18,<br />
// 2^10 Werte in sqrttabl -> durch 2^8 teilen<br />
// lineare Interpolation fuer Netzspannung<br />
rest = quadsum & 0xff; // Rest sind untere 8 Bit, weil durch quadsum >> 8<br />
// untere 8 Bit rausgeschoben werden.<br />
u_netz = (((betrag_o - betrag_u) * (long int) rest + 128) >> 8) + betrag_u;<br />
// Betrag der Netzspannung<br />
// zum kleineren Tabellenwert wird die gewichtete Differenz<br />
// addiert (Strahlensatz)<br />
// 128 (128 >> 256 = 1/2) dient zur Reduzierung des Rundungsfehlers<br />
// (zur naechsten ganzen Zahl statt abrunden)<br />
#endif<br />
#if SPANNUNGSEBENE == 600<br />
betrag_u = sqrttabl[quadsum >> 14];<br />
// Tabellenwert, untere Grenze fuer u_netz<br />
betrag_o = sqrttabl[(quadsum >> 14) + 1];<br />
// naechster Tabellenwert, obere Grenze fuer u_netz<br />
// 1000V abgebildet auf 2^13, Quadrat 2^26,<br />
// 2^12 Werte in sqrttabl -> durch 2^14 teilen<br />
// lineare Interpolation fuer Netzspannung<br />
rest = quadsum & 0x3fff; // Rest sind untere 14 Bit, weil durch quadsum >> 14<br />
// untere 14 Bit herausgeschoben werden.<br />
// rest = (unsigned int) quadsum;<br />
// Rest sind untere 16 Bit, weil durch quadsum >> 16<br />
// untere 16 Bit herausgeschoben werden.<br />
// u_netz = (((betrag_o - betrag_u) * (long int) rest + 32768) >> 16)<br />
//+ betrag_u;<br />
u_netz = (((betrag_o - betrag_u) * (long int) rest + 8192) >> 14) + betrag_u;<br />
// Betrag der Netzspannung<br />
// zum keineren Tabellenwert wird die gewichtete Differenz<br />
// addiert (Strahlensatz)<br />
// 32768 (32768 >> 16 = 1/2) dient zur Reduzierung des Rundungsfehlers<br />
// (zur naechsten ganzen Zahl statt abrunden)<br />
#endif<br />
*/<br />
u_netz = 2675;<br />
/********************************************************************************/<br />
// Raumzeiger der Netzspannung auf Einheitskreis projizieren<br />
u_netz_ae = ((long int) u_netz_a 2^14<br />
u_netz_be = ((long int) u_netz_b
************************************* Laststrom ********************************/<br />
/********************************************************************************/<br />
// Raumzeiger des Laststromes<br />
//i_last_a = (long int)(i_last_u - 512) * 64 / 2;<br />
i_last_a = (long int)(i_last_u - 512) -2^15..2^15)<br />
// Durch zwei teilen wegen zwei LEM-Windungen<br />
i_last_b = (((long int)i_last_u + (long int)(i_last_v > 1;<br />
// 37 = sqrt(3)/3 * 64 (64 = Normierungsfaktor, faellt wieder raus)<br />
// Imaginaerteil Laststrom (0..1023 -> -2^15..2^15)<br />
// Durch zwei teilen wegen zwei LEM-Windungen<br />
/********************************************************************************/<br />
/************************************* Sollstrom ********************************/<br />
/********************************************************************************/<br />
// Raumzeiger des Sollstromes (Netz ! -> Spaeter auf SR-Stroeme umrechnen)<br />
// Sollstrom soll um phi_ui voreilen. Winkelfunktionen werden aus Tabelle ausgelesen<br />
// AD-Werte: 0 ... 1023, costabl: 0 .. 255 (0 .. 255 entsprechen 0 .. 360 Grad)<br />
// interessanter Bereich: -90 .. +90 Grad (128 Werte), sonst Speisung aus Netz -><br />
// Ueberspannung am Kondensator<br />
// ^ 1024 Werte -> 128 Werte => durch 8 teilen<br />
// entspricht in costabl: 0 .. 63 und 192 .. 255 bzw. (-64 .. 63) & 0xff fuer Kosinus<br />
// und 128 .. 255 fuer Sinus<br />
// Daraus folgt: Kosinus: (AD-Wert/8 - 64) & 0xff<br />
// Sinus: AD-Wert/8 + 128<br />
//<br />
// Wegen der Signalverzoegerung bei der Spannungsmessung, der Regelzeit und der Daempfung<br />
// durch die Induktivitaet und dem Widerstand zwischen SR und Netz muss eine positive<br />
// Phasenverschiebung zu der gewuenschten hinzugezaehlt werden. Allein durch die Spannungs-<br />
// messung ergeben sich 11 Grad. Ohne zusatzliche Widerstaenden ergeben sich insgesamt<br />
// 14 Grad. Bei 3 x 1 Ohm Widerstand ergeben sich ca. 30 Grad. (experimentell ermittelt)<br />
// Es muss also folgende Zahl addiert werden: Winkel in Grad / 360 * 256.<br />
//<br />
// positiver Winkel -> Strom voreilend<br />
//<br />
//<br />
// Ohne Beruecksichtigung der o.a. Phasenverschiebung<br />
// cos_phi_ui = costabl[((phi_ui >> 3) - 64) & 0xff];<br />
// sin_phi_ui = costabl[(phi_ui >> 3) + 128];<br />
// Mit Beruecksichtigung der o.a. Phasenverschiebung (25 Grad -> 25 / 360 * 256 = 18)<br />
cos_phi_ui = costabl[((phi_ui >> 3) - 46) & 0xff]; // 46 = 64 - 18<br />
sin_phi_ui = costabl[((phi_ui >> 3) + 146) & 0xff]; // 146 = 128 + 18<br />
// verschiedene feste Werte<br />
// cos_phi_ui = 14189; // cos(30 Grad) * 2^14<br />
// sin_phi_ui = 8192; // sin(30 Grad) * 2^14<br />
// cos_phi_ui = 15396; // cos(20 Grad) * 2^14<br />
// sin_phi_ui = 5604; // sin(20 Grad) * 2^14<br />
// cos_phi_ui = 15826; // cos(15 Grad) * 2^14<br />
// sin_phi_ui = 4240; // sin(15 Grad) * 2^14<br />
// cos_phi_ui = 15897; // cos(14 Grad) * 2^14<br />
// sin_phi_ui = 3964; // sin(14 Grad) * 2^14<br />
// cos_phi_ui = 15964; // cos(13 Grad) * 2^14<br />
// sin_phi_ui = 3686; // sin(13 Grad) * 2^14<br />
// cos_phi_ui = 16384; // cos(0 Grad) * 2^14<br />
// sin_phi_ui = 0; // sin(0 Grad) * 2^14<br />
// Stromamplitude und Phase ueber Poti (zur Zeit Normalfall)<br />
// Prinzip: (a + jb) * (c + jd) = ac - bd + j(ad + bc)<br />
i_s_a = ((((long int) u_netz_ae * cos_phi_ui - (long int) u_netz_be * sin_phi_ui) >> 14)<br />
99
* i_netz_poti) >> 14;<br />
� i_s_b = ((((long int) u_netz_ae * sin_phi_ui + (long int) u_netz_be * cos_phi_ui) >> 14)<br />
* i_netz_poti) >> 14;<br />
// Stromeffektivwert aus globals.h, Phase ueber Poti oder oben vorgegeben<br />
// i_s_a = ((((long int) u_netz_ae * cos_phi_ui - (long int) u_netz_be * sin_phi_ui) >> 14)<br />
// * i_netz_s) >> 14;<br />
// i_s_b = ((((long int) u_netz_ae * sin_phi_ui + (long int) u_netz_be * cos_phi_ui) >> 14)<br />
// * i_netz_s) >> 14;<br />
// Stromeffektivwert aus globals.h, Phase = 0<br />
// i_s_a = ((long int) u_netz_ae * i_netz_s) >> 14;<br />
// i_s_b = ((long int) u_netz_be * i_netz_s) >> 14;<br />
// Direkt aus Netzspannung (i_s = u_netz / 6.25 Ohm)<br />
// i_s_a = u_netz_a 15;<br />
// i_s_b = ((long int) costabl[(i-64) & 0xff] * i_netz_poti) >> 15;<br />
// i_s_a = costabl[i & 0xff] >> 3; // bei >> 3 = 2.21A effektiv (50A / 2^15 * 2^14 >> 3)<br />
// i_s_b = costabl[(i-64) & 0xff] >> 3; // 2^15: I-Norm, 2^14: costabl-Norm, >> 3: s. links<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
#if REG_TYP_NETZ == 2 // PI in dq<br />
//Sollstrom in dq<br />
i_s_a=i_s_a - i_srn_a - i_last_a;<br />
i_s_b=i_s_b - i_srn_b - i_last_b;<br />
i_s_d= ( i_s_a*u_netz_ae + i_s_b*u_netz_be) >> 10;<br />
i_s_q= (- i_s_a*u_netz_be + i_s_b*u_netz_ae) >> 10;<br />
// Anwendung der Reglergleichung<br />
ein_d_k_1=ein_d_k; // k_1 bezeichnet den eine Sampleperiode zurueckliegenden AD_Wert<br />
ein_d_k=i_s_d; // k bezeichnet den aktuellen AD-Wert<br />
aus_d_k_1=u_srn_d3; // k_1 bezeichnet den eine Sampleperiode zurueckliegenden AD_Wert<br />
ein_q_k_1=ein_q_k; // k_1 bezeichnet den eine Sampleperiode zurueckliegenden AD_Wert<br />
ein_q_k=i_s_q; // k bezeichnet den aktuellen AD-Wert. Sollwert - Istwert<br />
aus_q_k_1=u_srn_q3; // k_1 bezeichnet den eine Sampleperiode zurueckliegenden AD_Wert<br />
u_srn_d3=(long int)RE0*ein_d_k+(long int)RE1*ein_d_k_1;<br />
u_srn_d3=(u_srn_d3 >> 16) + aus_d_k_1;<br />
u_srn_q3=(long int)RE0*ein_q_k+(long int)RE1*ein_q_k_1;<br />
u_srn_q3=(u_srn_q3 >> 16) + aus_q_k_1;<br />
u_srn_d=(u_srn_d3 >> 4); // >>4 da u_srn_d3,q3 d2,q2 als dq Groessen<br />
u_srn_q=(u_srn_q3 >> 4); // um 2^14 / 2^10 zu gross sind<br />
//Netzspannungskompensation --> Stellspannung in ab<br />
u_srn_a=((long int)u_srn_d*u_netz_ae - (long int)u_srn_q*u_netz_be) / 16384<br />
+ (long int)u_netz_a;<br />
u_srn_b=((long int)u_srn_d*u_netz_be + (long int)u_srn_q*u_netz_ae) / 16384<br />
+ (long int)u_netz_b;<br />
//fuer Strom durch Widerstaende ohne Netz<br />
//u_srn_a=((long int)u_srn_d*u_netz_ae - (long int)u_srn_q*u_netz_be) / 16384;<br />
//u_srn_b=((long int)u_srn_d*u_netz_be + (long int)u_srn_q*u_netz_ae) / 16384;<br />
#endif //von REG_TYP_NETZ == 2<br />
100
********************************************************************************/<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
#if REG_TYP_NETZ == 5 // PID in dq<br />
//Sollstrom in dq<br />
i_s_a=i_s_a - i_srn_a - i_last_a;<br />
i_s_b=i_s_b - i_srn_b - i_last_b;<br />
i_s_d= ( i_s_a*u_netz_ae + i_s_b*u_netz_be) >> 10;<br />
i_s_q= (- i_s_a*u_netz_be + i_s_b*u_netz_ae) >> 10;<br />
// Anwendung der Reglergleichung<br />
ein_d_k_2=ein_d_k_1; // k_3 bezeichnet den drei Sampleperioden zurueckliegenden AD_Wert<br />
ein_d_k_1=ein_d_k; // k_1 bezeichnet den eine Sampleperiode zurueckliegenden AD_Wert<br />
ein_d_k=i_s_d; // k bezeichnet den aktuellen AD-Wert<br />
aus_d_k_2=aus_d_k_1;<br />
aus_d_k_1=u_srn_d3; // k_1 bezeichnet den eine Sampleperiode zurueckliegenden AD_Wert<br />
ein_q_k_2=ein_q_k_1; // k_3 bezeichnet den drei Sampleperioden zurueckliegenden AD_Wert<br />
ein_q_k_1=ein_q_k; // k_1 bezeichnet den eine Sampleperiode zurueckliegenden AD_Wert<br />
ein_q_k=i_s_q; // k bezeichnet den aktuellen AD-Wert. Sollwert - Istwert<br />
aus_q_k_2=aus_q_k_1;<br />
aus_q_k_1=u_srn_q3; // k_1 bezeichnet den eine Sampleperiode zurueckliegenden AD_Wert<br />
u_srn_d3=(long int)RE0_PID*ein_d_k+(long int)RE1_PID*ein_d_k_1+(long int)RE2_PID*ein_d_k_2;<br />
u_srn_d3=(u_srn_d3 >> 16) + ((RA1_PID*aus_d_k_1) >> 10) + ((RA2_PID*aus_d_k_2) >> 10);<br />
u_srn_q3=(long int)RE0_PID*ein_q_k+(long int)RE1*ein_q_k_1+(long int)RE2_PID*ein_q_k_2;<br />
u_srn_q3=(u_srn_q3 >> 16) + ((RA1_PID*aus_q_k_1) >> 10) + ((RA2_PID*aus_q_k_2) >> 10);<br />
u_srn_d=(u_srn_d3 >> 4); // >>4 da u_srn_d3,q3 d2,q2 als dq Groessen<br />
u_srn_q=(u_srn_q3 >> 4); // um 2^14 / 2^10 zu gross sind<br />
//Netzspannungskompensation --> Stellspannung in ab<br />
u_srn_a=((long int)u_srn_d*u_netz_ae - (long int)u_srn_q*u_netz_be) / 16384<br />
+ (long int)u_netz_a;<br />
u_srn_b=((long int)u_srn_d*u_netz_be + (long int)u_srn_q*u_netz_ae) / 16384<br />
+ (long int)u_netz_b;<br />
//fuer Strom durch Widerstaende ohne Netz<br />
//u_srn_a=((long int)u_srn_d*u_netz_ae - (long int)u_srn_q*u_netz_be) / 16384;<br />
//u_srn_b=((long int)u_srn_d*u_netz_be + (long int)u_srn_q*u_netz_ae) / 16384;<br />
#endif //von REG_TYP_NETZ == 5<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
#if REG_TYP_NETZ == 4 // == DEAD BEAT REGLER<br />
i_s_a=i_s_a - i_srn_a - i_last_a;<br />
i_s_b=i_s_b - i_srn_b - i_last_b;<br />
//Reglergleichung<br />
//Eingangsgroessen in d:<br />
//ein_d_k_4=ein_d_k_3; // k_4 bezeichnet den vier Sampleperioden zurueckliegenden AD_Wert<br />
ein_d_k_3=ein_d_k_2; // k_3 bezeichnet den drei Sampleperioden zurueckliegenden AD_Wert<br />
ein_d_k_2=ein_d_k_1; // k_2 bezeichnet den zwei Sampleperioden zurueckliegenden AD_Wert<br />
ein_d_k_1=ein_d_k; // k_1 bezeichnet den eine Sampleperiode zurueckliegenden AD_Wert<br />
ein_d_k=( (long int)i_s_a*u_netz_ae + (long int)i_s_b*u_netz_be) >> 10;<br />
// k bezeichnet den aktuellen AD-Wert<br />
//Ausgangsgroessen in d:<br />
//aus_d_k_4=aus_d_k_3; // k_4 bezeichnet den vier Sampleperioden zurueckliegenden AD_Wert<br />
101
�<br />
aus_d_k_3=aus_d_k_2; // k_3 bezeichnet den drei Sampleperioden zurueckliegenden AD_Wert<br />
aus_d_k_2=aus_d_k_1; // k_2 bezeichnet den zwei Sampleperioden zurueckliegenden AD_Wert<br />
aus_d_k_1=u_srn_d3; // k_1 bezeichnet den eine Sampleperiode zurueckliegenden AD_Wert<br />
//Eingangsgroessen in q:<br />
//ein_q_k_4=ein_q_k_3; // k_4 bezeichnet den vier Sampleperioden zurueckliegenden AD_Wert<br />
ein_q_k_3=ein_q_k_2; // k_3 bezeichnet den drei Sampleperioden zurueckliegenden AD_Wert<br />
ein_q_k_2=ein_q_k_1; // k_2 bezeichnet den zwei Sampleperioden zurueckliegenden AD_Wert<br />
ein_q_k_1=ein_q_k; // k_1 bezeichnet den eine Sampleperiode zurueckliegenden AD_Wert<br />
ein_q_k= (- (long int)i_s_a*u_netz_be + (long int)i_s_b*u_netz_ae) >> 10;<br />
// k bezeichnet den aktuellen AD-Wert. Sollwert - Istwert<br />
//Ausgangsgroessen in q:<br />
//aus_q_k_4=aus_q_k_3; // k_4 bezeichnet den vier Sampleperioden zurueckliegenden AD_Wert<br />
aus_q_k_3=aus_q_k_2; // k_3 bezeichnet den drei Sampleperioden zurueckliegenden AD_Wert<br />
aus_q_k_2=aus_q_k_1; // k_2 bezeichnet den zwei Sampleperioden zurueckliegenden AD_Wert<br />
aus_q_k_1=u_srn_q3; // k_1 bezeichnet den eine Sampleperiode zurueckliegenden AD_Wert<br />
/*<br />
//MIT q4 und p4<br />
u_srn_d3_ein= (long int)q0*ein_d_k + (long int)q1*ein_d_k_1 + (long int)q2*ein_d_k_2<br />
+(((long int)q3*ein_d_k_3) >> 8) + (((long int)q4*ein_d_k_4) >> 14);<br />
u_srn_d3_aus= (long int)p1*aus_d_k_1 + (long int)p2*aus_d_k_2 + (long int)p3*aus_d_k_3<br />
+(( (long int)p4*aus_d_k_4) >> 14);<br />
// >>16, da Widerstaende, >>10, da p1,p2,...<br />
u_srn_d3 = (u_srn_d3_ein >> 16) + (u_srn_d3_aus >> 10);<br />
u_srn_q3_ein= (long int)q0*ein_q_k + (long int)q1*ein_q_k_1 + (long int)q2*ein_q_k_2<br />
+(((long int)q3*ein_q_k_3) >> 8) + (((long int)q4*ein_q_k_4) >> 14);<br />
u_srn_q3_aus= (long int)p1*aus_q_k_1 + (long int)p2*aus_q_k_2 + (long int)p3*aus_q_k_3<br />
+(( (long int)p4*aus_q_k_4) >> 14);<br />
// >>16, da Widerstaende, >>10, da p1,p2,...<br />
u_srn_q3 = (u_srn_q3_ein >> 16) + (u_srn_q3_aus >> 10);<br />
*/<br />
//OHNE q4 und p4<br />
u_srn_d3_ein= (long int)q0*ein_d_k + (long int)q1*ein_d_k_1 + (long int)q2*ein_d_k_2<br />
+(((long int)q3*ein_d_k_3) >> 8);<br />
u_srn_d3_aus= (long int)p1*aus_d_k_1 + (long int)p2*aus_d_k_2 + (long int)p3*aus_d_k_3;<br />
// >>16, da Widerstaende, >>10, da p1,p2,...<br />
u_srn_d3 = (u_srn_d3_ein >> 16) + (u_srn_d3_aus >> 10);<br />
u_srn_q3_ein= (long int)q0*ein_q_k + (long int)q1*ein_q_k_1 + (long int)q2*ein_q_k_2<br />
+(((long int)q3*ein_q_k_3) >> 8);<br />
u_srn_q3_aus= (long int)p1*aus_q_k_1 + (long int)p2*aus_q_k_2 + (long int)p3*aus_q_k_3;<br />
// >>16, da Widerstaende, >>10, da p1,p2,...<br />
u_srn_q3 = (u_srn_q3_ein >> 16) + (u_srn_q3_aus >> 10);<br />
u_srn_d=(u_srn_d3 >> 4); // >>4 da u_srn_d3,q3 d2,q2 als dq Groessen<br />
u_srn_q=(u_srn_q3 >> 4); // um 2^14 / 2^10 zu gross sind<br />
//MIT NETZSPANNUNG Stellspannung in ab<br />
u_srn_a=((long int)u_srn_d*u_netz_ae - (long int)u_srn_q*u_netz_be) / 16384<br />
+ (long int)u_netz_a;<br />
u_srn_b=((long int)u_srn_d*u_netz_be + (long int)u_srn_q*u_netz_ae) / 16384<br />
+ (long int)u_netz_b;<br />
// OHNE NETZSPANNUNG Stellspannung in ab<br />
//u_srn_a=((long int)u_srn_d*u_netz_ae - (long int)u_srn_q*u_netz_be) / 16384;<br />
//u_srn_b=((long int)u_srn_d*u_netz_be + (long int)u_srn_q*u_netz_ae) / 16384;<br />
#endif //REG_TYP_NETZ == 4<br />
/********************************************************************************/<br />
102
********************************************************************************/<br />
/********************************************************************************/<br />
#if REG_TYP_NETZ == 1<br />
// Zustandsregler mit Stoergroessenaufschaltung (Carstens Zeug)<br />
// dieser Block: gesamte Netzregelung<br />
// Zum besseren Verstaendnis zunaechst zerlegt in drei Komponenten<br />
// 1: Stoergroessenkompensation<br />
u_srn_a1 = ((long int)u_netz_a * M_srn_a - (long int)u_netz_b * M_srn_b) >> 14;<br />
u_srn_b1 = ((long int)u_netz_a * M_srn_b + (long int)u_netz_b * M_srn_a) >> 14;<br />
// 2: Sollstromvorgabe (muss von Netzstrom auf SR-Strom umgerechnet werden)<br />
// Stromrichtungen:<br />
// mit Laststrom<br />
u_srn_a2 = (((long int)i_s_a - (long int)i_last_a) * V_srn) >> 16;<br />
// i_srn ->-*->- i_netz (soll: i_s_a)<br />
u_srn_b2 = (((long int)i_s_b - (long int)i_last_b) * V_srn) >> 16; // ^ i_Last<br />
// ohne Laststrom<br />
///u_srn_a2 = ((long int)i_s_a * V_srn) >> 16; // i_srn ->-*->- i_netz<br />
///u_srn_b2 = ((long int)i_s_b * V_srn) >> 16; // ^ i_Last<br />
// 3: Rueckkopplung<br />
u_srn_a3 = (((long int)i_srn_a * Reg2_srn) >> 16) + (((long int)u_srn_a * Reg1_srn) >> 14);<br />
// alter Wert von u_srn !<br />
u_srn_b3 = (((long int)i_srn_b * Reg2_srn) >> 16) + (((long int)u_srn_b * Reg1_srn) >> 14);<br />
// alter Wert von u_srn !<br />
// Gesamt<br />
u_srn_a = u_srn_a1 + u_srn_a2 - u_srn_a3; // Rueckkopplung negativ ansetzen!<br />
u_srn_b = u_srn_b1 + u_srn_b2 - u_srn_b3;<br />
// ohne Stoergroessenkompensation (eigentlich das gleiche wie die Formel darunter)<br />
// u_srn_a = u_srn_a2 - u_srn_a3; // Rueckkopplung negativ ansetzen!<br />
// u_srn_b = u_srn_b2 - u_srn_b3;<br />
// Fuer Sinusstrom durch Widerstand ohne Netz (Jans Regelkonzept) (OK fuer 50V, 600V)<br />
//u_srn_a = (( ((long int)i_s_a * V_srn) - ((long int)i_srn_a * Reg2_srn)) >> 16)<br />
- ((u_srn_a * Reg1_srn) >> 14);<br />
//u_srn_b = (( ((long int)i_s_b * V_srn) - ((long int)i_srn_b * Reg2_srn)) >> 16)<br />
- ((u_srn_b * Reg1_srn) >> 14);<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
#endif<br />
#if REG_TYP_NETZ == 3<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
// Zustandsregler mit PI-Anteil<br />
// Sollstromvorgabe (muss von Netzstrom auf SR-Strom umgerechnet werden)<br />
// PI-Reglerausgang: u_srn_a2<br />
// Zustandsreglerausgang: u_srn_a3<br />
// mit Laststrom<br />
e_i_srn_a = (long int)i_s_a - (long int)i_last_a - (long int)i_srn_a;<br />
// aktueller Fehler<br />
u_srn_a2 = (fak_e_a * e_i_srn_a + fak_e_a_alt * e_i_srn_a_alt)/65536<br />
+ u_srn_a2_alt; // PI-Regler<br />
e_i_srn_b = (long int)i_s_b - (long int)i_last_b - (long int)i_srn_b;<br />
// aktueller Fehler<br />
u_srn_b2 = (fak_e_b * e_i_srn_b + fak_e_b_alt * e_i_srn_b_alt)/65536<br />
103
+ u_srn_b2_alt; // PI-Regler<br />
// ohne Laststrom<br />
//e_i_srn_a = (long int)i_s_a - (long int)i_srn_a;<br />
// aktueller Fehler<br />
//u_srn_a2 = (fak_e_a * e_i_srn_a + fak_e_a_alt * e_i_srn_a_alt) >> 16<br />
// + u_srn_a2_alt; // PI-Regler<br />
//e_i_srn_b = (long int)i_s_b - (long int)i_srn_b;<br />
// aktueller Fehler<br />
//u_srn_b2 = (fak_e_b * e_i_srn_b + fak_e_b_alt * e_i_srn_b_alt) >> 16<br />
// + u_srn_b2_alt; // PI-Regler<br />
// Stoergroessenkompensation<br />
u_srn_a1 = ((long int)u_netz_a * M_srn_a - (long int)u_netz_b * M_srn_b) >> 14;<br />
u_srn_b1 = ((long int)u_netz_a * M_srn_b + (long int)u_netz_b * M_srn_a) >> 14;<br />
// Rueckkopplung<br />
u_srn_a3 = (((long int)i_srn_a * Reg2_srn) >> 16) + (((long int)u_srn_a * Reg1_srn) >> 14);<br />
// alter Wert von u_srn !<br />
u_srn_b3 = (((long int)i_srn_b * Reg2_srn) >> 16) + (((long int)u_srn_b * Reg1_srn) >> 14);<br />
// alter Wert von u_srn !<br />
// Gesamt<br />
u_srn_a = u_srn_a1 + u_srn_a2 - u_srn_a3; // Rueckkopplung negativ ansetzen!<br />
u_srn_b = u_srn_b1 + u_srn_b2 - u_srn_b3;<br />
// alte Werte fuer naechsten Vorgang speichern<br />
e_i_srn_a_alt = e_i_srn_a;<br />
u_srn_a2_alt = u_srn_a2;<br />
e_i_srn_b_alt = e_i_srn_b;<br />
u_srn_b2_alt = u_srn_b2;<br />
#endif<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
// Normierung zum einfacheren Arbeiten mit Geradengleichung<br />
u_srn_bn = (u_srn_b * 37) >> 6; // Mache aus gleichschenkligen Dreiecken rechtwinklige.<br />
// 37/64 = 1/sqrt(3)<br />
/********************************************************************************/<br />
/*********************************** Kondensatorspannung ************************/<br />
/********************************************************************************/<br />
u_c_23 = ((long int) (u_kond + var_u_kond) * NORM_UKZ_23) >> NORM_UKN_23;<br />
// u_c_23 = 2/3 * u_kond normiert<br />
// Kondensator: U_K_0 -> 0V -> 0 ; U_K_1 -> 5V -> 1024<br />
/********************************************************************************/<br />
/********************************** Sektoridentifikation ************************/<br />
// 3(V) 2<br />
// Sektoren \ 2 / Zeiger \ /<br />
// 3 \ / 1 \ /<br />
// -----------> Re 4-----------1(U)<br />
// 4 / \ 6 / \<br />
// / 5 \ / \<br />
// 5(W) 6<br />
if (u_srn_bn > 0) // Sektoren 1, 2, 3<br />
{<br />
sektor = 2; // default: Sektor 2<br />
if (u_srn_a > 0) // Sektoren 1, 2<br />
{<br />
if (u_srn_a > u_srn_bn) sektor = 1;<br />
104
�<br />
}<br />
else<br />
{<br />
// Sektoren 2, 3<br />
if (-u_srn_a > u_srn_bn) sektor = 3;<br />
}<br />
}<br />
else<br />
{<br />
// Sektoren 4, 5, 6<br />
sektor = 5; // default: Sektor 5<br />
if (u_srn_a < 0)<br />
{<br />
// Sektoren 4, 5<br />
if (u_srn_a < u_srn_bn) sektor = 4;<br />
}<br />
else // Sektoren 5, 6<br />
if (u_srn_a > -u_srn_bn) sektor = 6;<br />
}<br />
/********************************************************************************/<br />
/****************************<br />
switch (sektor)<br />
{<br />
case 1:<br />
Schaltzeiten- und Pulsmusterberechnung ************/<br />
/* ^ u_srn_bn u_srn_bn t_2<br />
| ---------- = --------- =><br />
u_c/3 +---------------* u_c/3 PP_NETZ<br />
| /\<br />
| / \ 2 PP_NETZ * u_srn_bn<br />
| / \ t_2 = --- * --------------------<br />
| / \ 2 u_c/3<br />
| / \<br />
| / \ u_srn_a - u_srn_bn t_1<br />
| / \ -------------------- = ---------<br />
| / \ 2/3 * u_c PP_NETZ<br />
| / \<br />
|-----/--------X \ (u_srn_a - u_srn_bn) * PP_NETZ<br />
| /| | \ t_1 = --------------------------------<br />
| / | | \ 2/3 * u_c<br />
| / | | \<br />
| / | | \<br />
|/ | | \<br />
*--------------+---------------+-----> u_srn_a<br />
u_c/3 2/3 * u_c<br />
*/<br />
t_2 = (u_srn_bn
t0_2 = (PP_NETZ - t_1 - t_2) >> 1;<br />
} // Zeit, die Nullzeiger geschaltet wird<br />
// Zuweisen der PWM - Register<br />
// Schaltreihenfolge: 2 1 0;<br />
pwm1 = PP_NETZ - t0_2;<br />
pwm2 = t0_2 + t_2;<br />
pwm3 = t0_2;<br />
#if PWM_OPT == 1<br />
if (pwm1 > (PP_NETZ - T_S_2))<br />
if (pwm1 > (PP_NETZ - T_S_4)) pwm1 = PP_NETZ;<br />
else<br />
pwm1 = PP_NETZ - T_S_2;<br />
if (pwm2 < T_S_2)<br />
if (pwm2 < T_S_4) pwm2 = 0;<br />
else<br />
pwm2 = T_S_2;<br />
if (pwm2 > (PP_NETZ - T_S_2))<br />
if (pwm2 > (PP_NETZ - T_S_4)) pwm2 = PP_NETZ;<br />
else<br />
pwm2 = PP_NETZ - T_S_2;<br />
if (pwm3 < T_S_2)<br />
if (pwm3 < T_S_4) pwm3 = 0;<br />
else<br />
pwm3 = T_S_2;<br />
#endif<br />
PW1 = pwm1;<br />
PW2 = pwm2;<br />
PW3 = pwm3;<br />
break; // von case1<br />
case 2:<br />
t_2 = ((u_srn_bn - u_srn_a) > 1;<br />
} // Zeit, die Nullzeiger geschaltet wird<br />
// Zuweisen der PWM - Register<br />
// Schaltreihenfolge: 7 2 3<br />
pwm1 = t_1 + t0_2;<br />
pwm2 = PP_NETZ - t0_2;<br />
pwm3 = t0_2;<br />
#if PWM_OPT == 1<br />
if (pwm1 < T_S_2)<br />
106
if (pwm1 < T_S_4) pwm1 = 0;<br />
else<br />
pwm1 = T_S_2;<br />
if (pwm1 > (PP_NETZ - T_S_2))<br />
if (pwm1 > (PP_NETZ - T_S_4)) pwm1 = PP_NETZ;<br />
else<br />
pwm1 = PP_NETZ - T_S_2;<br />
if (pwm2 > (PP_NETZ - T_S_2))<br />
if (pwm2 > (PP_NETZ - T_S_4)) pwm2 = PP_NETZ;<br />
else<br />
pwm2 = PP_NETZ - T_S_2;<br />
if (pwm3 < T_S_2)<br />
if (pwm3 < T_S_4) pwm3 = 0;<br />
else<br />
pwm3 = T_S_2;<br />
#endif<br />
PW1 = pwm1;<br />
PW2 = pwm2;<br />
PW3 = pwm3;<br />
break; //von case2<br />
case 3:<br />
t_2 = ((-u_srn_bn - u_srn_a) > 1;<br />
} // Zeit, die Nullzeiger geschaltet wird<br />
// Zuweisen der PWM - Register<br />
// Schaltreihenfolge 4 3 0<br />
pwm1 = t0_2;<br />
pwm2 = PP_NETZ - t0_2;<br />
pwm3 = t_2 + t0_2;<br />
#if PWM_OPT == 1<br />
if (pwm1 < T_S_2)<br />
if (pwm1 < T_S_4)<br />
pwm1 = 0;<br />
else<br />
pwm1 = T_S_2;<br />
if (pwm2 > (PP_NETZ - T_S_2))<br />
if (pwm2 > (PP_NETZ - T_S_4))<br />
pwm2 = PP_NETZ;<br />
else<br />
pwm2 = PP_NETZ - T_S_2;<br />
107
#endif<br />
if (pwm3 < T_S_2)<br />
if (pwm3 < T_S_4)<br />
pwm3 = 0;<br />
else<br />
pwm3 = T_S_2;<br />
if (pwm3 > (PP_NETZ - T_S_2))<br />
if (pwm3 > (PP_NETZ - T_S_4))<br />
pwm3 = PP_NETZ;<br />
else<br />
pwm3 = PP_NETZ - T_S_2;<br />
PW1 = pwm1;<br />
PW2 = pwm2;<br />
PW3 = pwm3;<br />
break;<br />
case 4:<br />
// Wegen der Punktsymmetrie gleichen die Formeln fuer den vierten Sektor<br />
// denen fuer den ersten Sektor, abgesehen davon, dass die Vorzeichen von<br />
// u_srn_a und u_srn_b umgedreht werden muessen.<br />
t_2 = (-u_srn_bn > 1;<br />
} // Zeit, die Nullzeiger geschaltet wird<br />
// Zuweisen der PWM - Register<br />
// Schaltreihenfolge: 7 4 5<br />
pwm1 = t0_2;<br />
pwm2 = t_1 + t0_2;<br />
pwm3 = PP_NETZ - t0_2;<br />
#if PWM_OPT == 1<br />
if (pwm1 < T_S_2)<br />
if (pwm1 < T_S_4)<br />
pwm1 = 0;<br />
else<br />
pwm1 = T_S_2;<br />
if (pwm2 < T_S_2)<br />
if (pwm2 < T_S_4)<br />
pwm2 = 0;<br />
else<br />
pwm2 = T_S_2;<br />
if (pwm2 > (PP_NETZ - T_S_2))<br />
if (pwm2 > (PP_NETZ - T_S_4))<br />
pwm2 = PP_NETZ;<br />
else<br />
108
#endif<br />
case 5:<br />
pwm2 = PP_NETZ - T_S_2;<br />
if (pwm3 > (PP_NETZ - T_S_2))<br />
if (pwm3 > (PP_NETZ - T_S_4))<br />
pwm3 = PP_NETZ;<br />
else<br />
pwm3 = PP_NETZ - T_S_2;<br />
PW1 = pwm1;<br />
PW2 = pwm2;<br />
PW3 = pwm3;<br />
break;<br />
// Wegen der Punktsymmetrie gleichen die Formeln fuer den fuenften Sektor<br />
// denen fuer den zweiten Sektor, abgesehen davon, dass die Vorzeichen von<br />
// u_srn_a und u_srn_b umgedreht werden muessen.<br />
t_2 = ((u_srn_a - u_srn_bn) > 1;<br />
} // Zeit, die Nullzeiger geschaltet wird<br />
// Zuweisen der PWM - Register<br />
// Schaltreihenfolge: 6 5 0<br />
pwm1 = t_2 + t0_2;<br />
pwm2 = t0_2;<br />
pwm3 = PP_NETZ - t0_2;<br />
#if PWM_OPT == 1<br />
if (pwm1 < T_S_2)<br />
if (pwm1 < T_S_4)<br />
pwm1 = 0;<br />
else<br />
pwm1 = T_S_2;<br />
if (pwm1 > (PP_NETZ - T_S_2))<br />
if (pwm1 > (PP_NETZ - T_S_4))<br />
pwm1 = PP_NETZ;<br />
else<br />
pwm1 = PP_NETZ - T_S_2;<br />
if (pwm2 < T_S_2)<br />
if (pwm2 < T_S_4)<br />
pwm2 = 0;<br />
else<br />
pwm2 = T_S_2;<br />
if (pwm3 > (PP_NETZ - T_S_2))<br />
109
#endif<br />
if (pwm3 > (PP_NETZ - T_S_4))<br />
pwm3 = PP_NETZ;<br />
else<br />
pwm3 = PP_NETZ - T_S_2;<br />
PW1 = pwm1;<br />
PW2 = pwm2;<br />
PW3 = pwm3;<br />
break;<br />
case 6:<br />
// Wegen der Punktsymmetrie gleichen die Formeln fuer den sechsten Sektor<br />
// denen fuer den dritten Sektor, abgesehen davon, dass die Vorzeichen von<br />
// u_srn_a und u_srn_b umgedreht werden muessen.<br />
t_2 = ((u_srn_bn + u_srn_a) > 1;<br />
} // Zeit, die Nullzeiger geschaltet wird<br />
// Zuweisen der PWM - Register<br />
// Schaltreihenfolge: 761<br />
pwm1 = PP_NETZ - t0_2;<br />
pwm2 = t0_2;<br />
pwm3 = t_1 + t0_2;<br />
#if PWM_OPT == 1<br />
if (pwm1 > (PP_NETZ - T_S_2))<br />
if (pwm1 > (PP_NETZ - T_S_4))<br />
pwm1 = PP_NETZ;<br />
else<br />
pwm1 = PP_NETZ - T_S_2;<br />
if (pwm2 < T_S_2)<br />
if (pwm2 < T_S_4)<br />
pwm2 = 0;<br />
else<br />
pwm2 = T_S_2;<br />
if (pwm3 < T_S_2)<br />
if (pwm3 < T_S_4)<br />
pwm3 = 0;<br />
else<br />
pwm3 = T_S_2;<br />
if (pwm3 > (PP_NETZ - T_S_2))<br />
if (pwm3 > (PP_NETZ - T_S_4))<br />
pwm3 = PP_NETZ;<br />
else<br />
pwm3 = PP_NETZ - T_S_2;<br />
110
#endif<br />
PW1 = pwm1;<br />
PW2 = pwm2;<br />
PW3 = pwm3;<br />
break;<br />
default: // Fehler, Sektor wurde nicht gesetzt<br />
IEN = 0; // Programmende<br />
_putbit (1, P7, 6); // PWM 1-3 sperren<br />
// (Signal geht an Platine fuer Verzoegerungsschaltung)<br />
}// switch<br />
} // Ende filtere_netz<br />
111
A.5. adc.h<br />
#include <br />
#include <br />
#include ".\globals.h"<br />
// letzte Aenderung: 29.05.00 von: Jan Hanno Carstens<br />
// von Christoph Saniter<br />
// prinzipielle Aenderungen:<br />
// um: - expliziter Sollwert fuer Kondensatorspannung (17.11.99)<br />
//int fehlerpunkte = 0; // Zaehler fuer Ueberstromfehler<br />
//extern int u_batt_end;<br />
//extern int i_C1;<br />
//extern bitword Lade_mode;<br />
extern int u_kond;<br />
extern int i_srn_u, i_srn_v; // Stromrichterstroeme, dekl. in adc.c<br />
extern int i_last_u, i_last_v; // Stromrichterstroeme, dekl. in adc.c<br />
extern int u_netz_uv, u_netz_vw; // Netzspannungen (Dreieck), dekl. in adc.c<br />
extern int i_netz_poti, phi_ui;<br />
static int u_n_vw_buf[40];<br />
static int u_n_uv_buf[40];<br />
//static int i_srn_u_buf[40];<br />
//static int i_srn_v_buf[40];<br />
//extern int Poti3;<br />
int var_u_kond;<br />
int costabl[256]; // Kosinustabelle, Zugriff in main.c<br />
//int sqrttabl[1024]; // Wurzeltabelle, Zugriff in main.c<br />
//int sqrttabl[4096]; // Wurzeltabelle, Zugriff in main.c<br />
//long int V_srn; // Vorfilter fuer Sollgroesse, Zugriff in main.c<br />
//long int Reg1_srn; // Reglermatrix des Netzstromrichters, Parameter fuer i_srn,<br />
// Zugriff in main.c<br />
//long int Reg2_srn; // Reglermatrix des Netzstromrichters, Parameter fuer u_srn,<br />
// Zugriff in main.c<br />
//long int Reg_srn; // Stoergroessenkompensation Realteil, Zugriff in main.c<br />
//long int M_srn_a; // Stoergroessenkompensation Realteil, Zugriff in main.c<br />
//long int M_srn_b; // Stoergroessenkompensation Imaginaerteil, Zugriff in main.c<br />
// int cos_phi_d; // Kosinus des Phasenwinkels (Spannung - Strom), Zugriff in main.c<br />
// int sin_phi_d; // Sinus des Phasenwinkels (Spannung - Strom), Zugriff in main.c<br />
int i_netz_s; // Amplitude Netzstrom, Zugriff in main.c<br />
//long int fak_e_a, fak_e_a_alt, fak_e_b, fak_e_b_alt;<br />
//fuer die von Christoph entworfene Regelung<br />
//1.Koefizienten des Dead-Beat-Reglers<br />
int q0, q1, q2, q3, q4; //Koeffizienten fuer die Ausgangsgroessen<br />
int p1, p2, p3, p4; //Koeffizienten fuer die Eingangsgroessen<br />
//2.Koefizienten des PI Reglers<br />
int RE0, RE1; //Koeffizienten fuer die Eingangsgroessen<br />
//2.Koefizienten des PID Reglers<br />
int RE0_PID, RE1_PID, RE2_PID, RA1_PID, RA2_PID;<br />
//Koeffizienten der Netzspannungskompensation<br />
int NE0, NE1, NE2; //Koeffizienten fuer die Eingangsgroessen<br />
int NA1, NA2; //Koeffizienten fuer die Ausgangsgroessen<br />
//Koeffizienten der Laststromkompensation<br />
int LE0, LE1, LE2, LE3; //Koeffizienten fuer die Eingangsgroessen<br />
int LA1, LA2, LA3; //Koeffizienten fuer die Ausgangsgroessen<br />
int wL;<br />
int PW0_p_max; // maximal zulaessige Pulsweite beim puffern<br />
112
*************************************************************************************************<br />
* *<br />
* short ad_dat[16] -> Datenfeld fuer PEC-Transfer muss in erstem Speichersegment liegen, *<br />
* daher der merkwuerdige Aufwand (siehe C Manual (3.18 PEC Support) *<br />
* *<br />
*************************************************************************************************/<br />
#if _MODEL==’l’ || _MODEL==’m’ // Model ’large’ oder ’medium’<br />
#pragma align fb=c // declare PECADRESSABLE data section for ’far’ data<br />
#pragma class fb=firstsegment<br />
int far AD_dat[16]; // AD_dat-Feld soll PEC nutzen<br />
#pragma default_attributes<br />
#else<br />
int AD_dat[16]; // AD_dat-Feld soll PEC nutzen<br />
#endif<br />
// folgende Variablen hier definiert mit der Hoffnung, weniger Rechenzeit zu gebrauchen<br />
int u_kond, u_kond_p, u_kond_p_min, u_kond_p_max, u_kond_l, u_kond_l_min, u_kond_error;<br />
int u_netz_uv, u_netz_vw;<br />
int i_srn_u, i_srn_v;<br />
int i_last_u, i_last_v;<br />
int i_netz_poti, phi_ui;<br />
interrupt(0x28) void adc_isr(void);<br />
static void check_netz(void);<br />
static void filtere_netz(void);<br />
void notaus(int);<br />
113
A.6. master.c<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/* Erstellt von: Christoph Saniter */<br />
/* Erstellt am: 11.01.2000 */<br />
/* Geaendert von/am: Chris 28.1.00 */<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/* in diesem Programm, kann der Controller im master mode getestet werden. */<br />
/* Zusammen mit dem Programm "slave2" findet eine Uebertragung ueber die SSC */<br />
/* statt. Dabei werden vom master immer drei verschiedene Werte uebertragen und */<br />
/* vom slave jeweils zu Beginn nur einer. Im master werden dabei die gesendeten */<br />
/* Werte zuvor jeweils mit einer Kennung versehen. Kontrolle, ob die */<br />
/* Uebertragung erfolgreich war findet durch die error flags sowie durch eine */<br />
/* doppelte Uebertragung statt. Das Senden aller Informationen geschieht */<br />
/* mithilfe des Timers 4, wobei die Timerzeiten im RECEIVE IR neu gesetzt werden*/<br />
/* Mit Hilfe des timer 2 wird ueberpruft, ob ueberhaupt eine Kommunikation */<br />
/* stattfindet; wenn er 30s lang nicht zurueckgesetzt wird, loest er einen */<br />
/* Programmabbruch aus */<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
#include // Register Set of 80C167 controller<br />
#include // Standard I/O functions<br />
#include <br />
#define S0CON_MODE 0x8011<br />
#define BAUDRATE 0x003f // 9600 Baud using 39.3216 MHz<br />
#define sende_dummy 32767 // default Wert zum Sichern der Kommunikation<br />
#define U1 1 // Definition der Sendevariablen<br />
#define anzahl_sende_elemente 6 // Anzahl der vom slave uebermittelten Elemente<br />
#define timer_zeit 20 // Zeitdauer, nach der jeweils der Sendevorgang<br />
// initiiert wird 20 == 1ms<br />
#define U1 1 // Definition der Sendevariablen<br />
#define U2 2<br />
#define U3 3<br />
#define I1 11<br />
#define I2 12<br />
#define I3 13<br />
#define kontroll_zeit 60000 // zusammen mit dem kontroll_faktor ergibt<br />
#define kontroll_faktor 10 // sich die Zeit, nach der bei fehlerhafter<br />
// SSC Kommunikation das Programm abgebrochen<br />
// wird --> 10*60000 == 30s<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
int neuer_wert=sende_dummy, kontroll_wert=sende_dummy, zuordnung=sende_dummy;<br />
int spannung1, spannung2, spannung3, strom1, strom2, strom3;<br />
int egal, fehler_zaehler=0, ssc_kontrolle=0, kontroll_zaehler=0;<br />
int k=0, test=1, zaehler=0, slave_wahl=1;<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
void ssc_init(void)<br />
{<br />
P3 |=0x2200; // hier werden P3.9=1 und P3.13=1 gesetzt<br />
DP3 |=0x2200; // hier werden DP3.9=1 und DP3.13=1 gesetzt<br />
SSCEN = 0; // SSC anhalten um sie zu konfigurieren<br />
SSCBR = 0x0063; // Baudrate wird auf 100kBaud gesetzt<br />
SSCCON= 0xc25f; // 1100 0010 0101 1111 --> 1 1 00 0010 0 1 0 1 1111<br />
// 1=SSCEN ein<br />
// 1=Master modus<br />
114
SSCRIC=0x56;<br />
// 00=nicht vergeben<br />
// 0010= Fehler flags; receive error enable bit=1<br />
// 0=nicht vergeben<br />
// 1= idle clock line is high<br />
// 0= shift transmit data on leading clock edge<br />
// 1=MSB zuerst<br />
// 1111=16bit breites Schieberegister<br />
// 0101 0110 --> 0 1 0101 10<br />
// 0=SSCRIR wird zurueckgesetzt<br />
// 1=SSCRIE error interrupt wird enabled<br />
// 0101=ILVL=5<br />
// 10=GLVL=2<br />
_putbit(1,DP7,1); // P7 wird benoetigt, um den sendeberecht. slave<br />
_putbit(1,DP7,2); // zu bestimmen: P7.1==0-->slave1 P7.2==0-->slave2<br />
_putbit(0,P7,1);<br />
_putbit(1,P7,2);<br />
// in dieser Einstellung empfaengt er von slave1<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/* S0 port:<br />
* 8 bit, asynchronuous operation, one stopbit,<br />
* receive enable, no parity/frame/overrun check<br />
* baud rate generator enable */<br />
void init_seriell( void )<br />
{<br />
P3 |= 0x0400; /* set port 3.10 output latch (TXD) */<br />
DP3 |= 0x0400; /* configure port 3.10 for output */<br />
/* operation. ( TXD output)DP3.9=1 */<br />
DP3 &= 0xF7FF; /* configure port 3.11 for input */<br />
/* operation(RXD input) 3.11=1 */<br />
S0TIC = 0x80; /* set transmit interrupt flag */<br />
S0RIC = 0x00; /* delete receive interrupt flag */<br />
S0BG = BAUDRATE; /* set baudrate to 9600 baud */<br />
S0CON = S0CON_MODE; /* set serial mode */<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
void init_timer4 (void)<br />
{<br />
T4CON=0x0087; // 0000 0000 1000 0111 --> 0000000 0 1 0 000 111<br />
// 0000000 nicht vergeben<br />
// T4UDE:0 extern count up deaktiviert<br />
// T4UD: 1 intern count down aktiviert<br />
// T4R: 0 stop timer<br />
// T4M: 000 timer mode<br />
// T4l: 111 resolution 51.2 mys<br />
T4IC=0x4b; // 0100 1011 --> 0 1 0010 11<br />
// T4IR:0 interrupt request flag<br />
// T4Ie:1 interrupt request is enabled<br />
// ILVL:0010=2<br />
// GLVL:11=3<br />
T4=19531; // interrupt wird jede s aktiviert (19531 ==1s)<br />
T4R=1; // timer aktivieren<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
// Dieser timer wird nur benoetigt, um festzustellen, ob die Kommunikation klappt.<br />
// Er lauft insgesamt 3s und wird nach 30s einen Programmabbruch ausloesen.<br />
// Am Ende jedes erfolgreichen Sende-/Empfangsvorganges wird er auf 3s gesetzt<br />
// und der Zaehler auf null.<br />
void init_timer2 (void)<br />
115
{<br />
T2CON=0x0087; // 0000 0000 1000 0111 --> 0000000 0 1 0 000 111<br />
// 0000000 nicht vergeben<br />
// T2UDE:0 extern count up deaktiviert<br />
// T2UD: 1 intern count down aktiviert<br />
// T2R: 0 stop timer<br />
// T2M: 111 timer mode<br />
// T2l: 111 resolution 51.2 mys<br />
T2IC=0x47; // 0100 0111 --> 0 1 0001 11<br />
// T2IR:0 interrupt request flag<br />
// T2IE:1 interrupt request is enabled<br />
// ILVL:0001=1<br />
// GLVL:11=3 group level<br />
T2=kontroll_zeit; // interrupt wird jede Kontrollzeit aktiviert<br />
T2R=1; // timer aktivieren<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
void kein_Fehler_1 (void)<br />
{<br />
fehler_zaehler=0; // reset des Fehlerzaehlers, da Kommunikation o.K.<br />
switch (k)<br />
{<br />
case 0:<br />
egal=SSCRB;<br />
k++;<br />
T4=timer_zeit;<br />
T4R=1; // Timer 4 wieder starten<br />
break;<br />
case 1:<br />
zuordnung=SSCRB;<br />
k++;<br />
T4=timer_zeit;<br />
T4R=1; // Timer 4 wieder starten<br />
break;<br />
case 2:<br />
neuer_wert=SSCRB;<br />
k++;<br />
T4=timer_zeit;<br />
T4R=1; // Timer 4 wieder starten<br />
break;<br />
case 3:<br />
kontroll_wert=SSCRB;<br />
switch (zuordnung)// jeweils Sendefehlerkontrolle am Anfang<br />
{<br />
case U1:<br />
if((neuer_wert!=sende_dummy)&&(neuer_wert==kontroll_wert)&&<br />
(neuer_wert>=20))<br />
{<br />
kontroll_zaehler++;<br />
spannung1=neuer_wert;<br />
}<br />
break;<br />
case U2:<br />
if((neuer_wert!=sende_dummy)&&(neuer_wert==kontroll_wert)&&<br />
(neuer_wert>=20))<br />
{<br />
116
kontroll_zaehler++;<br />
spannung2=neuer_wert;<br />
}<br />
break;<br />
case U3:<br />
if((neuer_wert!=sende_dummy)&&(neuer_wert==kontroll_wert)&&<br />
(neuer_wert>=20))<br />
{<br />
kontroll_zaehler++;<br />
spannung3=neuer_wert;<br />
}<br />
break;<br />
case I1:<br />
if((neuer_wert!=sende_dummy)&&(neuer_wert==kontroll_wert)&&<br />
(neuer_wert>=20))<br />
{<br />
kontroll_zaehler++;<br />
strom1=neuer_wert;<br />
}<br />
break;<br />
case I2:<br />
if((neuer_wert!=sende_dummy)&&(neuer_wert==kontroll_wert)&&<br />
(neuer_wert>=20))<br />
{<br />
kontroll_zaehler++;<br />
strom2=neuer_wert;<br />
}<br />
break;<br />
case I3:<br />
if((neuer_wert!=sende_dummy)&&(neuer_wert==kontroll_wert)&&<br />
(neuer_wert>=20))<br />
{<br />
if (kontroll_zaehler==5) // jeder Sendevorgang erfolgreich<br />
{<br />
T2R=0; // timer 2 wird angehalten<br />
T2=kontroll_zeit; // Zeit neu, damit IR nicht ausloest<br />
ssc_kontrolle=0;<br />
kontroll_zaehler=0;<br />
T2R=1;<br />
}<br />
strom3=neuer_wert;<br />
printf("spannung 1, 2, 3 strom 1, 2, 3: %d\t %d\t %d\t %d\t<br />
%d\t %d\n",spannung1, spannung2, spannung3, strom1,<br />
strom2, strom3);<br />
}<br />
break;<br />
default:<br />
break;<br />
} // von der "switch (zuordnung)" Anweisung<br />
k=1;<br />
T4=timer_zeit;<br />
T4R=1; // Timer 4 wieder starten<br />
break; // von case 3 von k<br />
default:<br />
117
eak;<br />
// von der "switch(k)" Zuordnung<br />
}�<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
void empfangs_Fehler_1 (void)<br />
{<br />
printf("FEHLER");<br />
SSCRE=0; // clear error flag<br />
fehler_zaehler++;<br />
if (fehler_zaehler==5)<br />
{<br />
printf("Alles ist vorbei");<br />
// notaus(WERT);//Programmabbruch wegen fehlerhafter Kommunikation<br />
}<br />
SSCTB=sende_dummy;<br />
T4=timer_zeit;<br />
T4R=1;<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
void kein_Fehler_2 (void)<br />
{<br />
egal==SSCRB;<br />
slave_wahl=1;<br />
T4=10000; // ==0.5s<br />
T4R=1;<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
void empfangs_Fehler_2 (void)<br />
{<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
void slave1_Empfang (void)<br />
{<br />
if (! SSCRE)<br />
kein_Fehler_1(); // nur wenn kein Empfangsfehler vorliegt<br />
else<br />
empfangs_Fehler_1();<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
void slave2_Empfang (void)<br />
{<br />
if (! SSCRE) // nur wenn kein Empfangsfehler vorliegt<br />
kein_Fehler_2();<br />
else<br />
empfangs_Fehler_2();<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
// slave 1 wird auf senden gesetzt - port 7, pin 1 ist auf "0" der Rest: "1"<br />
void slave_1 (void)<br />
{<br />
_putbit(1,P7,2); // slave 2 wird das Senden verboten<br />
_putbit(0,P7,1); // slave 1 wird das Senden erlaubt<br />
118
Kontrolle, damit irgendwann wieder ein vernuenftiger Zaehlerwert vorliegt<br />
if (zaehler>(3*anzahl_sende_elemente+1))<br />
zaehler=0;<br />
switch (zaehler)<br />
{<br />
case 0:<br />
test++;<br />
zaehler++;<br />
k=0;<br />
while (SSCBSY);// irgendein Sendevorgang aktiv-->warten!<br />
SSCTB=0; // Beschreiben des Senderegisters<br />
break;<br />
case 1:case 2: case 3:<br />
zaehler++;<br />
while (SSCBSY); // irgendein Sendevorgang aktiv-->warten!<br />
SSCTB=test;<br />
break;<br />
case (3*anzahl_sende_elemente+1): // jeder zu sendende Wert besteht<br />
// aus 3 Werten<br />
zaehler=0;<br />
slave_wahl=2; // Uebergabe an an slave 2<br />
T4=10000; // ==0.5s<br />
T4R=1;<br />
break;<br />
default:<br />
while (SSCBSY); // irgendein Sendevorgang aktiv-->warten!<br />
SSCTB=sende_dummy;<br />
zaehler++;<br />
T4=timer_zeit;<br />
T4R=1;<br />
break;<br />
} // von der "switch(zaehler)" Zuweisung<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
// slave 2 wird auf senden gesetzt - port 7, pin 2 ist auf "0" der Rest: "1"<br />
void slave_2 (void)<br />
{<br />
_putbit(1,P7,1); // slave 1 wird das Senden verboten<br />
_putbit(0,P7,2); // slave 2 wird das Senden erlaubt<br />
SSCTB=sende_dummy;<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
interrupt (0x22) void kein_ssc_empfang(void) // vom timer 2<br />
{<br />
T2R=0;<br />
if (ssc_kontrolle==kontroll_faktor)<br />
{<br />
printf("Es findet keine Kommunikation statt");<br />
// notaus(WERT);<br />
}<br />
printf("ssc Kontrolle: %d\n", ssc_kontrolle);<br />
ssc_kontrolle++;<br />
T2=kontroll_zeit;<br />
T2R=1;<br />
}<br />
/********************************************************************************/<br />
119
********************************************************************************/<br />
� interrupt (0x2e) void ssc_receive(void)<br />
{<br />
if (slave_wahl==1) // dann empfaengt er was vom slave 1<br />
slave1_Empfang();<br />
else if (slave_wahl==2)<br />
slave2_Empfang();<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
interrupt (0x24) void timer4(void)<br />
{<br />
T4R=0; // Timer 4 wird angehalten<br />
if (slave_wahl==1)<br />
slave_1();<br />
else if (slave_wahl==2)<br />
slave_2();<br />
}<br />
/********************************************************************************/<br />
/* main program */<br />
/********************************************************************************/<br />
void main (void)<br />
{<br />
IEN=1; // globale Interruptfreigabe<br />
init_seriell();<br />
ssc_init();<br />
printf ("Hallohallo! Ich bin der Master!\n");<br />
init_timer4();<br />
init_timer2();<br />
while(1);<br />
}<br />
/********************************************************************************/<br />
/*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*END*/<br />
/********************************************************************************/<br />
120
A.7. slave.c<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/* Erstellt von: Christoph Saniter */<br />
/* Erstellt am: 11.01.2000 */<br />
/* Geaendert von/am: Chris 28.01.00 */<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/* In diesem Programm, ist der Controller im slave mode. Zusammen mit dem */<br />
/* Programm "master2" und T4master2.c findet eine Uebertragung ueber die SSC */<br />
/* statt. Dabei werden vom slave immer sechs verschiedene Werte uebertragen und */<br />
/* vom master zu Beginn eines jeden Sendevorganges nur einer. Den gesendeten */<br />
/* Werten wird zuvor jeweils eine Zuordnung vorangeschickt. Kontrolle, ob die */<br />
/* Uebertragung erfolgreich war findet durch die error flags sowie durch eine */<br />
/* doppelte Uebertragung statt. Die Auswahl ob dieser slave sendeberechtigt ist,*/<br />
/* erfolgt uebr den port 7. */<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
#include // Register Set of 80C167 controller<br />
#include // Standard I/O functions<br />
#include <br />
#define S0CON_MODE 0x8011<br />
#define BAUDRATE 0x003f // 9600 Baud using 39.3216 MHz<br />
#define anzahl_werte 3 // Anzahl der zu uebertragenden Werte<br />
#define sende_dummy 32767 // default Wert, zum Sichern der Kommunikation<br />
#define kontroll_zeit 60000// zusammen mit dem kontroll_faktor ergibt<br />
#define kontroll_faktor 10 // sich die Zeit, nach der bei fehlerhafter<br />
// SSC Kommunikation das Programm abgebrochen<br />
// wird --> 10*60000 == 30s<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
int neuer_wert,kontroll_wert, neuer_strom,k=0,j=0;<br />
int zuordnung[6]={1,2,3,11,12,13};<br />
int wert[6]={0,10,100,1000,10000,20000};<br />
int fehler_zaehler, egal, ssc_kontrolle=0;<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
void ssc_init(void)<br />
{<br />
SSCEN = 0; // SSC anhalten um sie zu konfigurieren<br />
SSCBR = 0x0063; // Baudrate wird auf 100kBaud gesetzt<br />
SSCCON=0x825f; // 1000 0010 0101 1111-->1 0 0 00010 0 1 0 1 1111<br />
// SSCEN: 1=SSCEN ein<br />
// SSCMS: 0=Slave modus<br />
// 0=nicht vergeben<br />
// SSCAREN,SSCBEN,SSCPEN,SSCREN,SSCTEN:<br />
// 00010=verschiedene Fehler flags<br />
// receive error wird gesetzt<br />
// 0=nicht vergeben<br />
// SSCPO: 1=idle clock line is high<br />
// SSCPH: 0=shift data on the leading clock edge<br />
// SSCHB: 1=MSB zuerst<br />
// 1111=16bit breites Schieberegister<br />
SSCRIC=0x52; // receive interrupt set up<br />
// 0101 0010 --> 0 1 0100 10<br />
// 0=SSCRIR wird zurueckgesetzt<br />
// 1=SSCRIE receive interrupt wird enabled<br />
// 0100=ILVL=4<br />
121
_putbit(0,DP7,1);<br />
// 10=GLVL=2<br />
// P7 wird benoetigt, um sendeberecht. slave zu<br />
_putbit(0,DP7,2); // ermitteln: P7.1==0-->slave1 P7.2==0-->slave2<br />
_putbit(1,P7,1);<br />
_putbit(1,P7,2);<br />
_putbit(1,P8,8);<br />
// in dieser Einstellung weder slave1 noch slave2<br />
// DP3.8 wird in der Empfangsroutine in Abhaengigkeit von P7 gesetzt<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/* S0 port:<br />
* 8 bit, asynchronuous operation, one stopbit,<br />
* receive enable, no parity/frame/overrun check<br />
* baud rate generator enable */<br />
void init_seriell( void )<br />
{<br />
P3 |= 0x0400; /* set port 3.10 output latch (TXD) */<br />
DP3 |= 0x0400; /* configure port 3.10 for output */<br />
/* operation. ( TXD output)DP3.9=1 */<br />
DP3 &= 0xF7FF; /* configure port 3.11 for input */<br />
/* operation(RXD input) 3.11=1 */<br />
S0TIC = 0x80; /* set transmit interrupt flag */<br />
S0RIC = 0x00; /* delete receive interrupt flag */<br />
S0BG = BAUDRATE; /* set baudrate to 9600 baud */<br />
S0CON = S0CON_MODE; /* set serial mode */<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
// Dieser timer wird nur benoetigt, um festzustellen, ob die Kommunikation klappt.<br />
// Er lauft insgesamt 3s und wird nach 30s einen Programmabbruch ausloesen.<br />
// Am Ende jedes erfolgreichen Sende-/Empfangsvorganges wird er auf 3s gesetzt<br />
// und der Zaehler auf Null.<br />
void init_timer2 (void)<br />
{<br />
T2CON=0x0087; // 0000 0000 1000 0111 --> 0000000 0 1 0 000 111<br />
// 0000000 nicht vergeben<br />
// T2UDE:0 extern count up deaktiviert<br />
// T2UD: 1 intern count down aktiviert<br />
// T2R: 0 stop timer<br />
// T2M: 111 timer mode<br />
// T2l: 111 resolution 51.2 mys<br />
T2IC=0x47; // 0100 0111 --> 0 1 0001 11<br />
// T2IR:0 interrupt request flag<br />
// T2IE:1 interrupt request is enabled<br />
// ILVL:0001=1<br />
// GLVL:11=3 group level<br />
T2=kontroll_zeit; // interrupt wird jede Kontrollzeit aktiviert<br />
T2R=1; // timer aktivieren<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
void kein_Fehler (void)<br />
{<br />
if (egal==0)<br />
{<br />
SSCTB=zuordnung[0];<br />
k=1;<br />
j=0;<br />
P8=0x02; // pin 0 auf 0, pin 2 auf 1<br />
}<br />
else<br />
122
{<br />
switch (k)<br />
{<br />
case 0:<br />
SSCTB=zuordnung[j];<br />
k++;<br />
P8=0x03; // pin 0 auf 1, pin 2 auf 1<br />
break;<br />
case 1:<br />
if (wert[j]=0))<br />
{<br />
neuer_strom=neuer_wert;<br />
T2R=0;<br />
ssc_kontrolle=0;<br />
T2=kontroll_zeit;<br />
T2R=1;<br />
// printf("empfangener Wert: %d\n",neuer_strom);<br />
}<br />
k=0;<br />
j++;<br />
P8=0x03; // pin 0 auf 1, pin 2 auf 1<br />
break;<br />
default:<br />
SSCTB=sende_dummy;<br />
break;<br />
} // von der switch Anweisung<br />
fehler_zaehler=0;<br />
} // von dem "else"<br />
} // vom interrupt<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/* Auch wenn ein Empfangsfehler vorliegt, soll doch das Senden nach Moeglichkeit*/<br />
/* unbeeintraechtigt weitergehen */<br />
void empfangs_Fehler (void)<br />
{<br />
SSCRE=0;<br />
printf("Fehler");<br />
switch (k)<br />
{<br />
case 0:<br />
SSCTB=zuordnung[j];<br />
k++;<br />
P8=0x02; // pin 0 auf 0, pin 2 auf 1<br />
break;<br />
123
case 1:<br />
SSCTB=wert[j];<br />
k++;<br />
P8=0x02; // pin 0 auf 0, pin 2 auf 1<br />
break;<br />
case 2:<br />
SSCTB=wert[j];<br />
k=0;<br />
j++;<br />
P8=0x02; // pin 0 auf 0, pin 2 auf 1<br />
break;<br />
default:<br />
SSCTB=sende_dummy;<br />
P8=0x02; // pin 0 auf 0, pin 2 auf 1<br />
break;<br />
} // von der "switch" Anweisung<br />
fehler_zaehler++;<br />
if (fehler_zaehler==5)<br />
{<br />
printf("Alles ist vorbei");<br />
// notaus(WERT); // Programmabbruch wegen fehlerhafter Kommunikation<br />
}<br />
} // vom Interrupt<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
void sende_erlaubniss (void)<br />
{<br />
_putbit(1,DP3,8);// er darf, also ist DP3.8 = "1"<br />
P8=0x00; // pin 0 auf 0, pin 2 auf 0 nur Kontrollzweck<br />
egal=SSCRB; // Auslesen des Empangsspeichers<br />
if(!SSCRE) // wenn kein Empfangsfehler vorliegt, dann...<br />
kein_Fehler();<br />
else<br />
empfangs_Fehler();<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
void sende_verbot (void)<br />
{<br />
_putbit(0,DP3,8); // er darf nicht, also sind alle pins Eingaenge<br />
egal=SSCRB; // um ein unnoetiges Ausloesen des receive-error<br />
// interruptes zu vermeiden<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
interrupt (0x22) void kein_ssc_empfang(void) // vom timer 2<br />
{<br />
T2R=0;<br />
if (ssc_kontrolle==kontroll_faktor)<br />
{<br />
printf("Es findet keine Kommunikation statt");<br />
// notaus(WERT);<br />
}<br />
printf("ssc Kontrolle: %d\n", ssc_kontrolle);<br />
ssc_kontrolle++;<br />
T2=kontroll_zeit;<br />
T2R=1;<br />
}<br />
124
********************************************************************************/<br />
/********************************************************************************/<br />
interrupt (0x2e) void ssc_receive(void)<br />
{<br />
// hier wird entschieden, ob dieser slave gemeint ist<br />
if (_getbit(P7,1)==0 && _getbit(P7,2)==1)<br />
sende_erlaubniss();<br />
else<br />
sende_verbot();<br />
}<br />
/********************************************************************************/<br />
/* main program */<br />
/********************************************************************************/<br />
void main (void)<br />
{<br />
SSCTB=sende_dummy; // damit beim ersten Senden was "sinnvolles"<br />
// im Speicher steht<br />
_putbit(1,DP8,0); // nur zu Kontrollzwecken<br />
_putbit(1,DP8,1);<br />
_putbit(1,P8,2);<br />
init_timer2();<br />
init_seriell();<br />
ssc_init();<br />
IEN=1; // globale Interruptfreigabe<br />
printf ("Hallohallo! Ich bin der Slave!\n");<br />
while(1);<br />
}<br />
/********************************************************************************/<br />
/*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*ENDE*END*/<br />
/********************************************************************************/<br />
125
A.8. seriell.c<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/* Erstellt von: Christoph Saniter */<br />
/* Erstellt am: 11.01.2000 */<br />
/* Geaendert von/am: Chris 28.1.00 */<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/* Dieser Programmteil dient dazu, ueber die Tastatur eine Eingabe und ueber den*/<br />
/* Bildschirm eine Ausgabe haben zu koennen */<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
#include <br />
#include <br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/* Read character from serial channel*/<br />
int getch( void )<br />
{<br />
int c = EOF;<br />
if ( S0EIR )<br />
{<br />
S0PE = 0;<br />
S0FE = 0;<br />
S0EIR = 0;<br />
S0RIR = 0;<br />
}<br />
else if ( S0RIR )<br />
{<br />
c = S0RBUF & 0x7F;<br />
S0RIR = 0;<br />
}<br />
return ( c );<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/* Return 1 if character available, otherwise 0*/<br />
int kbhit( void )<br />
{<br />
if ( S0RIR )<br />
return ( 1 );<br />
return ( 0 );<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
/* Write character to serial channel*/<br />
int putch( int c )<br />
{<br />
while ( ! S0TIR );<br />
S0TIR = 0;<br />
S0TBUF = c;<br />
return ( c );<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
int _ioread( FILE * fin )<br />
{<br />
int c = EOF;<br />
if ( fin == stdin )<br />
126
{<br />
{<br />
/*<br />
* Assume terminal sending either CR or CRLF. Allow<br />
* only LF as valid delimiter, so translate CR into LF<br />
* and ignore received LF’s<br />
*/<br />
do /* blocking read from serial channel 0 */<br />
c = getch(); /* without echo */<br />
if ( c == 0x0a ) /* LF */<br />
c = EOF; /* ignore it */<br />
else if ( c == 0x0d ) /* CR */<br />
c = 0x0a; /* turn into LF */<br />
}<br />
while ( c < 0 );<br />
/*<br />
* when reading ’stdin’, echo to ’stdout’<br />
* performing LF ==> CR-LF translation<br />
*/<br />
_iowrite( c, stdout );<br />
}<br />
return( c ); /* return read character on succes */<br />
}<br />
/********************************************************************************/<br />
/********************************************************************************/<br />
int _iowrite( int c, FILE * fout )<br />
{<br />
if ( fout == stdout || fout == stderr )<br />
{<br />
if ( c == ’\n’ )<br />
putch( ’\r’ );<br />
putch( c );<br />
}<br />
}<br />
return( c ); /* return written character on success */<br />
127
B. Simulationsfiles<br />
128
Matlab<br />
129
B.1. dq_ab_simulation.m<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%Christoph Saniter, 16.5.00<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%Mit diesem Programm sollen die verschiedenen dq-Transformationen auf ihre<br />
%Gültigkeit hin untersucht werden<br />
clear all;<br />
close all;<br />
Udach=30;<br />
Idach=2;<br />
f=50;<br />
N=1000;<br />
stoerungU=1;<br />
stoerungI=1;<br />
phioffset=pi/2; %damit Uu einen cos gibt-->ab Trafo ist dann korrekt<br />
phi=pi/2.5; %Phasenwinkel zwischen Strom und Spannung<br />
phasenver=2*pi/3; %=120� für das Dreiphasensystem<br />
w=2*pi*f;<br />
for i=1:N<br />
t(i)=i/20000;<br />
%Definition der drei PhasenSPANNUNGEN:<br />
Uu(i) = Udach*sin(w*t(i)+phioffset)+Udach/5*sin(5*(w*t(i)+phioffset))*stoerungU;<br />
Uv(i) = Udach*sin(w*t(i)-phasenver+phioffset)+Udach/5*sin(5*(w*t(i)<br />
-phasenver+phioffset))*stoerungU;<br />
Uw(i) = Udach*sin(w*t(i)+phasenver+phioffset)+Udach/5*sin(5*(w*t(i)<br />
+phioffset+phasenver))*stoerungU;<br />
%Definition der drei PhasenSTRÖME:<br />
Iu(i) = Idach*sin(w*t(i)+phioffset+phi)+Idach/7*sin(7*(w*t(i)+phioffset+phi))*stoerungI;<br />
Iv(i) = Idach*sin(w*t(i)-phasenver+phioffset+phi)+Idach/7*sin(7*(w*t(i)<br />
-phasenver+phioffset+phi))*stoerungI;<br />
Iw(i) = Idach*sin(w*t(i)+phasenver+phioffset+phi)+Idach/7*sin(7*(w*t(i)<br />
+phioffset+phasenver+phi))*stoerungI;<br />
%alpha/beta Koordinaten SPANNUNGEN:<br />
Ua(i)=2/3*(Uu(i)-0.5*Uv(i)-0.5*Uw(i));<br />
Ub(i)=2/3*(sqrt(3)/2*Uv(i)-sqrt(3)/2*Uw(i));<br />
Unetz(i)=sqrt(Ua(i)*Ua(i)+Ub(i)*Ub(i));<br />
%alpha/beta Koordinaten STRÖME:<br />
Ia(i)=2/3*(Iu(i)-0.5*Iv(i)-0.5*Iw(i));<br />
Ib(i)=2/3*(sqrt(3)/2*Iv(i)-sqrt(3)/2*Iw(i));<br />
%dq Koordinaten SPANNUNGEN:<br />
Ud(i)=2/3*(cos(w*t(i))*Uu(i)+cos(w*t(i)-phasenver)*Uv(i)+cos(w*t(i)+phasenver)*Uw(i));<br />
Uq(i)=2/3*(sin(w*t(i))*Uu(i)+sin(w*t(i)-phasenver)*Uv(i)+sin(w*t(i)+phasenver)*Uw(i));<br />
%alternative Berechnung1 SPANNUNGEN:<br />
Ud1(i)=1/sqrt(Ua(i)*Ua(i)+Ub(i)*Ub(i))*(Ua(i)*Ua(i)+Ub(i)*Ub(i));<br />
Uq1(i)=1/sqrt(Ua(i)*Ua(i)+Ub(i)*Ub(i))*(-Ub(i)*Ua(i)+Ua(i)*Ub(i));<br />
%alternative Berechnung2 SPANNUNGEN:<br />
if Ub(i) >= 0<br />
if Ua(i) >= 0<br />
theta(i)=atan((Ub(i)/Ua(i))); %Sektor I<br />
130
else<br />
� theta(i)=atan(-Ua(i)/(Ub(i)))+pi/2; %Sektor II<br />
end<br />
else<br />
if Ua(i) >= 0<br />
theta(i)=atan((Ua(i)/(-Ub(i))))+3*pi/2; %Sektor IV<br />
else<br />
theta(i)=atan(Ub(i)/Ua(i))+pi; %Sektor III<br />
end<br />
end<br />
end;<br />
Ud2(i)=2/3*(cos(theta(i))*Uu(i)+cos(theta(i)-phasenver)*Uv(i)+cos(theta(i)+phasenver)*Uw(i))+20;<br />
Uq2(i)=2/3*(sin(theta(i))*Uu(i)+sin(theta(i)-phasenver)*Uv(i)+sin(theta(i)+phasenver)*Uw(i))+20;<br />
%dq Koordinaten STRÖME:<br />
Id(i)=2/3*(cos(w*t(i))*Iu(i)+cos(w*t(i)-phasenver)*Iv(i)+cos(w*t(i)+phasenver)*Iw(i))-5;<br />
Iq(i)=2/3*(sin(w*t(i))*Iu(i)+sin(w*t(i)-phasenver)*Iv(i)+sin(w*t(i)+phasenver)*Iw(i))-5;<br />
%alternative Berechnung1 STRÖME:<br />
Id1(i)=1/sqrt(Ua(i)*Ua(i)+Ub(i)*Ub(i))*(Ua(i)*Ia(i)+Ub(i)*Ib(i));<br />
Iq1(i)=1/sqrt(Ua(i)*Ua(i)+Ub(i)*Ub(i))*(Ub(i)*Ia(i)-Ua(i)*Ib(i));<br />
%alternative Berechnung2 Ströme<br />
Id2(i)=2/3*(cos(theta(i))*Iu(i)+cos(theta(i)-phasenver)*Iv(i)+cos(theta(i)+phasenver)*Iw(i));<br />
Iq2(i)=2/3*(sin(theta(i))*Iu(i)+sin(theta(i)-phasenver)*Iv(i)+sin(theta(i)+phasenver)*Iw(i));<br />
%Rücktrafo für die SPANNUNG:<br />
UaR(i)=1/sqrt(Ua(i)*Ua(i)+Ub(i)*Ub(i))*(Ua(i)*Ud1(i)-Ub(i)*Uq1(i))+10; %index "1" kennzeichnet dq Trafo<br />
UbR(i)=1/sqrt(Ua(i)*Ua(i)+Ub(i)*Ub(i))*(Ub(i)*Ud1(i)+Ua(i)*Uq1(i))+10; %mit ab Matrix<br />
%Rücktrafo für die STROM:<br />
IaR(i)=1/sqrt(Ua(i)*Ua(i)+Ub(i)*Ub(i))*(Ua(i)*Id1(i)+Ub(i)*Iq1(i))+5; %index "1" kennzeichnet dq Trafo<br />
IbR(i)=1/sqrt(Ua(i)*Ua(i)+Ub(i)*Ub(i))*(Ub(i)*Id1(i)-Ua(i)*Iq1(i))+5; %mit ab Matrix<br />
%SPANNUNGEN:<br />
plot(t,Uu,t,Uv,t,Uw);<br />
grid on;<br />
legend(’Uu’,’Uv’,’Uw’);<br />
figure;<br />
plot(t,Ua,t,Ub);<br />
grid on;<br />
legend(’Ua’,’Ub’);<br />
figure;<br />
plot(t,Ud,t,Uq,t,Ud1,t,Uq1,t,Ud2,t,Uq2);<br />
grid on;<br />
legend(’Ud’,’Uq’,’Ud1’,’Uq1’,’Ud2’,’Uq2’);<br />
figure;<br />
plot(t,Ua,t,Ub,t,UaR,t,UbR);<br />
grid on;<br />
legend(’Ua’,’Ub’,’UaR’,’UbR’);<br />
%STRÖME:<br />
figure;<br />
plot(t,Iu,t,Iv,t,Iw);<br />
grid on;<br />
legend(’Iu’,’Iv’,’Iw’);<br />
131
figure;<br />
� plot(t,Ia,t,Ib);<br />
grid on;<br />
legend(’Ia’,’Ib’);<br />
figure;<br />
plot(t,Id,t,Iq,t,Id1,t,Iq1,t,Id2,t,Iq2);<br />
grid on;<br />
legend(’Id’,’Iq’,’Id1’,’Iq1’,’Id2’,’Iq2’);<br />
figure;<br />
plot(t,Ia,t,Ib,t,IaR,t,IbR);<br />
grid on;<br />
legend(’Ia’,’Ib’,’IaR’,’IbR’);<br />
%figure;<br />
%plot(t,theta,t,w*t);<br />
%figure;<br />
%plot(Ua,Ub);<br />
%figure;<br />
%plot(t,Unetz);<br />
132
B.2. reglerdesign.m<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%Christoph Saniter, 16.5.00<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%benötigte Dateien:<br />
%1. konstante.m enthält die Systemkonstanten<br />
%2. bodeplot.m erstellt wenn aufgerufen die Bodediagramme<br />
%3. sprungantwort.m erstellt wenn aufgerufen die Sprungantworten<br />
%T56=1/5600 fuer eine ideale Regelung<br />
%T11=1/1100 fuer den PI Regler mit vollstaendiger Störgrößenaufschaltung<br />
%T14=1/1400 fuer den Dead Beat und den PID^2 Regler mit p4 und q4<br />
%T16=1/1650 fuer den Dead Beat Regler ohne p4 und q4<br />
%T20=1/2000 fuer den PI Regler<br />
%T22=1/2200 fuer den PI Regler<br />
close all;<br />
clear all;<br />
%Aufruf der Datei, die die Systemkonstanten enthält<br />
konstante;<br />
s = ZPK(’s’);<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%Beschreibung des Systemes im s-Bereich<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
LundR=(1/R)/(s*L/R+1); %Kopplungsinduktivitaet<br />
Verzoegerung=Kv/(s^2*T1*T2+(T1+T2)*s+1); %durch den WR verursachte Verzögerung<br />
Messung=MessIk/(s*MessIt+1); %Messung des Stromes<br />
strecke=LundR*Verzoegerung; %Messung ist in der Rückführung<br />
OLTF=strecke*Messung; %OLTF in Pol-/Nullstellendarstellung<br />
OLTFsys=TF(OLTF); %OLTF in descending power of s<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%Reglerauslegung im s-Bereich nach Föllinger S. 246ff nach dem Frequenzkennlinien-<br />
%verfahren; betrachtet wird dabei die OLTF<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
Kr=2000;<br />
TR1=1.8e-3;<br />
TR2=0.25e-3;<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%PID^2 Regler, um auch auf hoehere Frequenzen reagieren zu koennen<br />
ReglerPID2=(Kr-0)*(1+TR1*s)*(1+TR2*s)^2/(s*(1+TR2/10*s)^2);%Pol-/Nullstellendarst.<br />
ReglersysPID2=TF(ReglerPID2); %in descending power of s<br />
closedPID2=feedback(ReglerPID2*strecke,Messung); %CLTF<br />
pole(closedPID2); ntrolle, ob Pole in linker s-Halbebene<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%PI Regler<br />
ReglerPI=(Kr-1500)*(1+TR1*s)/s; %Pol-/Nullstellendarstellung<br />
ReglerPIsys=TF(ReglerPI); %in descending power of s<br />
closedPI=feedback(ReglerPI*strecke,Messung); %CLTF<br />
pole(closedPI); %Kontrolle, ob Pole in linker s-Halbebene<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%der in der s-Ebene entworfene Regler wird in die z-Ebene transformiert<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%PID^2 Regler: mit T18=1/1800<br />
z = ZPK(’z’,T18);<br />
streckeD18=C2D(strecke,T18,’tustin’); %mit T18=1/1800<br />
MessungD18=C2D(Messung,T18,’tustin’);<br />
133
ReglerPID2D=C2D(ReglerPID2,T18,’tustin’); %Pol-/Nullstellendarstellung<br />
� ReglerPID2Dsys=TF(ReglerPID2D); %in descending power of z<br />
closedPID2D=feedback(ReglerPID2D*streckeD18,MessungD18); %CLTF<br />
pole(closedPID2D); %Kontrolle, ob Pole im Einheitskreis<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%PID^2 Regler: mit T56=1/5600 --> zum Vergleichen<br />
z = ZPK(’z’,T56);<br />
streckeD56=C2D(strecke,T56,’tustin’); %mit T56=1/5600<br />
MessungD56=C2D(Messung,T56,’tustin’);<br />
ReglerPID56D=C2D(ReglerPID2,T56,’tustin’); %Pol-/Nullstellendarstellung<br />
ReglerPID56Dsys=TF(ReglerPID56D) %in descending power of z<br />
closedPID56D=feedback(ReglerPID56D*streckeD56,MessungD56); %CLTF<br />
pole(closedPID56D); %Kontrolle, ob Pole im Einheitskreis<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%PI Regler:<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
z = ZPK(’z’,T11);<br />
streckeD11=C2D(strecke,T11,’tustin’);<br />
MessungD11=C2D(Messung,T11,’tustin’);<br />
ReglerPID11=C2D(ReglerPI,T11,’tustin’); %Pol-/Nullstellendarstellung<br />
ReglerPID11sys=TF(ReglerPID11); %in descending power of z<br />
closedPID11=feedback(ReglerPID11*streckeD11,MessungD11); %CLTF<br />
pole(closedPID11); %Kontrolle, ob Pole im Einheitskreis<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
z = ZPK(’z’,T20);<br />
streckeD20=C2D(strecke,T20,’tustin’); %mit T20=1/2000<br />
MessungD20=C2D(Messung,T20,’tustin’);<br />
ReglerPID20=C2D(ReglerPI,T20,’tustin’); %Pol-/Nullstellendarstellung<br />
ReglerPID20sys=TF(ReglerPID20); %in descending power of z<br />
closedPID20=feedback(ReglerPID20*streckeD20,MessungD20); %CLTF<br />
pole(closedPID20); %Kontrolle, ob Pole im Einheitskreis<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
z = ZPK(’z’,T22);<br />
streckeD22=C2D(strecke,T22,’tustin’); %mit T22=1/2200<br />
MessungD22=C2D(Messung,T22,’tustin’);<br />
ReglerPID22=C2D(ReglerPI,T22,’tustin’); %Pol-/Nullstellendarstellung<br />
ReglerPID22sys=TF(ReglerPID22); %in descending power of z<br />
closedPID22=feedback(ReglerPID22*streckeD22,MessungD22); %CLTF<br />
pole(closedPID22); %Kontrolle, ob Pole im Einheitskreis<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%dead beat Entwurf nach dem Taschenbuch S.518<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%der Übergang in den z-Bereich wird mittels der sprunginvarianten Transformation<br />
%durchgeführt: Ghs(z)=(z-1)/z*Z{Gs(s)/s}<br />
%1. ideale Abtastfrequenz: T56=1/5600<br />
z = ZPK(’z’,T56);<br />
Ghs56=C2D(OLTF,T56,’zoh’); %=Ghs(z) gem. Taschenbuch S. 541 in Pol-/Nst.darst.<br />
Ghs56sys=TF(Ghs56); %=Ghs(z) in descending power of z<br />
numdead56=[18.91 -33.82 19.75 -4.59 0.36]; %gemäß Taschenbuch S. 518<br />
dendead56=[1 -0.11 -0.6 -0.27 -0.011];<br />
reglerdead56=TF(numdead56,dendead56,T56);<br />
closeddead56=feedback(reglerdead56*streckeD56,MessungD56);<br />
pole(closeddead56);<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%reale Abtastfrequenz: T14=1/1400 --> mit p4, q4<br />
z = ZPK(’z’,T14);<br />
134
streckeD14=C2D(strecke,T14,’tustin’); %mit T14=1/1400<br />
MessungD14=C2D(Messung,T14,’tustin’);<br />
�<br />
Ghs14=C2D(OLTF,T14,’zoh’); %=Ghs(z) gem. Taschenbuch S. 541 in Pol-/Nst.darst.<br />
Ghs14sys=TF(Ghs14); %=Ghs(z) in descending power of z<br />
numdead14=[1.93 -1.38 49.52e-3 -0.35e-3 0.25e-6]; %gemäß Taschenbuch S. 518<br />
dendead14=[1 -466.77e-3 -511.38e-3 -21.82e-3 -3.57e-5];<br />
reglerdead14=TF(numdead14,dendead14,T14);<br />
closeddead14=feedback(reglerdead14*streckeD14,MessungD14);<br />
pole(closeddead14);<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%reale Abtastfrequenz: T16=1/1650 --> ohne p4, q4<br />
z = ZPK(’z’,T16);<br />
streckeD16=C2D(strecke,T16,’tustin’);<br />
MessungD16=C2D(Messung,T16,’tustin’);<br />
Ghs16=C2D(OLTF,T16,’zoh’); %=Ghs(z) gem. Taschenbuch S. 541 in Pol-/Nst.darst.<br />
Ghs16sys=TF(Ghs16); %=Ghs(z) in descending power of z<br />
%p4=<br />
%q4=<br />
numdead16=[2.29 -1.798 114.3e-3 -1.65e-3 3.25e-6]; %gemäß Taschenbuch S. 518<br />
dendead16=[1 -397.82e-3 -563.25e-3 -38.8e-3 126.64e-6];<br />
reglerdead16=TF(numdead16,dendead16,T16);<br />
closeddead16=feedback(reglerdead16*streckeD16,MessungD16);<br />
pole(closeddead16);<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%Abtastfrequenz: T18=1/1800 --> ohne p4, q4<br />
z = ZPK(’z’,T18);<br />
Ghs18=C2D(OLTF,T18,’zoh’); %=Ghs(z) gem. Taschenbuch S. 541 in Pol-/Nst.darst.<br />
Ghs18sys=TF(Ghs18); %=Ghs(z) in descending power of z<br />
%p4= 11.02e-6<br />
%q4= -225.67e-6<br />
numdead18=[2.518 -2.089 0.173 -3.49e-3 11.02e-6]; %gemäß Taschenbuch S. 518<br />
dendead18=[1 -0.364 -0.586 -0.05 -225.67e-6];<br />
reglerdead18=TF(numdead18,dendead18,T18);<br />
closeddead18=feedback(reglerdead18*streckeD18,MessungD18);<br />
pole(closeddead18);<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%bodeplot;<br />
%sprungantwort;<br />
%kompensation;<br />
T=1/fs; %nur für die Simulation wichtig<br />
135
konstante.m<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%Christoph Saniter, 16.5.00<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
f=50; %Netzfrequenz in Hz<br />
w=2*pi*f; %Kreisfrequenz in rad/s<br />
fs=5600; %Tastfrequenz<br />
T=1/fs;<br />
T56=T;<br />
T11=1/1100;<br />
T14=1/1400;<br />
T16=1/1650;<br />
T18=1/1800;<br />
T20=1/2000;<br />
T22=1/2200;<br />
phioffset=pi/2; %damit alpha/beta Transformation klappt<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
Udach=565; %Scheitelwert der Netzspannung<br />
Idach=10; %Scheitelwert des Laststroms<br />
Idachsoll=10; %Scheitelwert des Sollstroms<br />
phi=-pi/6; %Phasenwinkel, um den der Laststrom gegenüber der<br />
%Netzspannung verschoben ist<br />
phisoll=-7*pi/3*0; %Sollwinkel des Netzstromes<br />
elfunddreizehn=0; %1 oder 0, je nachdem, ob 11. und 13. da sein sollen<br />
stoerspannung=1/30*0; %Anteil der 5. Oberschwingung der Netzspannung<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
L=0.0011; %Kopplungsinduktivitaet<br />
R=0.6; %Widerstand des Kopplungspfades<br />
MessIk=1; % Messstrecke= MessIk/(MessIt*s+1)<br />
MessIt=0.00015;<br />
Kv=1; % um die Verzoegerung durch den WR nachzubilden<br />
T1=0.0002; % TF=Kv/(T1T2*s^2+(T1+T2)*s+1)<br />
T2=0.0001;<br />
136
ode.m<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%Christoph Saniter, 16.5.00<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
grid on;<br />
bode(OLTF,’m’); % nur die offene Strecke<br />
hold on;<br />
PID2=OLTF*ReglerPID2;<br />
bode(PID2,’b’); % PID^2 Regler zeitkontinuierlich<br />
hold on;<br />
PI=OLTF*ReglerPI;<br />
bode(PI,’y’); % PI Regler zeitkontinuierlich<br />
%Bodediagramme des diskreten Systemes:<br />
figure;<br />
grid on;<br />
offendead16=streckeD16*MessungD16*reglerdead16;<br />
bode(offendead16,’r’); % Dead Beat Regler mit T16=1/1650<br />
hold on;<br />
offenPID2D=streckeD18*MessungD18*ReglerPID2D;<br />
bode(offenPID2D,’b’); % PID^2 Regler mit T18=1/1800<br />
hold on;<br />
offenPID20=streckeD20*MessungD20*ReglerPID20;<br />
bode(offenPID20,’y’); % PI Regler mit T20=1/2000<br />
%Bodediagramme des Systemes mit ca. 3-facher Abtastgeschwindigkeit:<br />
figure;<br />
grid on;<br />
offenPID56D=streckeD56*MessungD56*ReglerPID56D;<br />
bode(offenPID56D,’b-.’); % PID^2 Regler mit T56=1/5600<br />
hold on;<br />
offendead56=streckeD56*MessungD56*reglerdead56;<br />
bode(offendead56,’r-.’); % Dead Beat Regler mit T56=1/5600<br />
137
sprungantwort.m<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%Christoph Saniter, 16.5.00<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%Vergleich der Sprungantworten der verschiedenen Reglerentwürfe<br />
figure;<br />
grid on;<br />
step(closedPID2D,’b’) %Sprungantwort des diskretisierten Systems<br />
hold on %mit PID^2 Regler und T18=1/1800<br />
step(closedPID20,’y’) %Sprungantwort des diskretisierten Systems<br />
hold on %mit PI Regler und T20=1/2000<br />
%step(closedPID22,’y--’) %Sprungantwort des diskretisierten Systems<br />
%hold on %mit PI Regler und T22=1/2200<br />
%step(closeddead14,’b’) %Sprungantwort des Systems im z-Bereich<br />
%hold on %mit Dead Beat Regler und T14=1/1400<br />
step(closeddead16,’g’) %Sprungantwort des Systems im z-Bereich<br />
hold on %mit Dead Beat Regler und T16=1/1650<br />
%step(closeddead18,’r’) %Sprungantwort des Systems im z-Bereich<br />
%hold on %mit Dead Beat Regler und T18=1/1800<br />
%Reaktion des Systemes mit ca. 3-facher Abtastgeschwindigkeit:<br />
figure;<br />
grid on;<br />
step(closedPID56D,’b-.’) %Sprungantwort des diskretisierten Systems<br />
hold on %mit PID^2 Regler und T56=1/5600<br />
step(closeddead56,’r-.’) %Sprungantwort des diskretisierten Systems<br />
hold on %mit Dead Beat Regler und T56=1/5600<br />
138
kompensation.m<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%Christoph Saniter, 16.5.00<br />
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
%diese Datei erstellt die füer die Störgrössenkompensation notwendigen<br />
%Übertragungsfunktionen<br />
%1.Für die Netzspannungskompensation<br />
WRkomp=(2e-8*s^2+0.0003*s+1)/(2e-10*s^2+3e-5*s+1); %=1/Verzoegerung<br />
%und dann /((tau1/10s+1)(tau2/10s+1))<br />
WRkompD=TF(C2D(WRkomp,T,’tustin’));<br />
WRkompD11=TF(C2D(WRkomp,T11,’tustin’));<br />
WRkompD14=TF(C2D(WRkomp,T14,’tustin’));<br />
WRkompD16=TF(C2D(WRkomp,T16,’tustin’));<br />
WRkompD20=TF(C2D(WRkomp,T20,’tustin’));<br />
%2. Für die Laststromkompensation<br />
LRkomp=(L/R*s+1)/((L/R)/10*s+1/R); %1/L&R und dann tau des Nenners anpassen<br />
%1/R weglassen und /10<br />
LRkompD=TF(C2d(LRkomp,T,’tustin’));<br />
Laststrom_kompD=LRkompD*WRkompD;<br />
LRkompD11=TF(C2d(LRkomp,T11,’tustin’));<br />
Laststrom_kompD11=LRkompD11*WRkompD11;<br />
LRkompD14=TF(C2d(LRkomp,T14,’tustin’))<br />
Laststrom_kompD14=LRkompD14*WRkompD14<br />
LRkompD16=TF(C2d(LRkomp,T16,’tustin’))<br />
Laststrom_kompD16=LRkompD16*WRkompD16<br />
LRkompD20=TF(C2d(LRkomp,T20,’tustin’));<br />
Laststrom_kompD20=LRkompD20*WRkompD20;<br />
139
Simulink<br />
140
B.3. modell.mdl<br />
Z-Funktion nach reglerdesign dead beat<br />
141
Sollstrom/Laststrom<br />
streckeL&R<br />
142
Messung und ZOH<br />
streckeMessung<br />
verzoegerungWR<br />
ialpha<br />
143
ibeta<br />
ab/dq<br />
wL und Netzspannungskompensation<br />
144
Laststromkompensation<br />
2/3-Trafo<br />
145
Literaturverzeichnis<br />
[1] Heier, Siegfried<br />
Windkraftanlagen im Netzbetrieb<br />
Teubner Verlag, Stuttgart, 1996<br />
[2] Carstens, Jan Hanno<br />
Einsatz aktiver Kompensatoren zur Begrenzung von Netzrückwirkungen<br />
<strong>Diplomarbeit</strong> am Institut für elektrische Antriebstechnik, Universität Aachen, 1992<br />
[3] Riefle, Carsten<br />
Aufbau und Regelung eines Stromrichters zur Kopplung eines Gleichspannungszwischenkreises mit dem<br />
Niederspannungsnetz<br />
<strong>Diplomarbeit</strong> am Institut für elektrische Energietechnik, Technische Universität Berlin, 1998<br />
[4] Sadowski, Thomas<br />
Aufbau und Regelung eines Zweiquadrantengleichstromstellers zur Kopplung eines Gleichspannungszwischenkreises<br />
mit einem Akkumulator<br />
<strong>Diplomarbeit</strong> am Institut für elektrische Energietechnik, Technische Universität Berlin, 1997<br />
[5] Winkelnkemper, Manfred<br />
Koordinatentransformationen in Drehstromnetzen und Induktionsmaschinen.<br />
Technischer Bericht, TU Berlin, 1998<br />
[6] Soares V., Verdelho P., Marques G.<br />
Active power filter based on the instantaneous active and reactive current component id � iq method<br />
IEEE Transaction on industry applications, pp. 1096-1101, 1997<br />
[7] Michel, Manfred<br />
Leistungselektronik<br />
Springer Verlag, Berlin/Heidelberg, 1992<br />
[8] Soares V., Verdelho P.<br />
Active power filter with neutral current compensation based on the extension of the instantaneous active<br />
and reactive current component id � iq method<br />
EPE’99, 638.<strong>pdf</strong>, Lausanne, 1999<br />
[9] Bor-Ren Lin, Hsin-Hung Lu and Ming-Ta Yang<br />
Simulation and implementation of three-phase active power filter with simple control algorithms<br />
EPE’99, 224.<strong>pdf</strong>, Lausanne, 1999<br />
[10] Liu Y., Unsworth P.J.<br />
Simplified control method for shunt active harmonic filter<br />
EPE’97, pp. 4819-4824, Trondheim, 1997<br />
[11] Round S.D., Ingram D.M.E.<br />
An evaluation of techniques for determining active compensating currents in unbalanced systems<br />
EPE’97, pp. 4.767-4.772, Trondheim 1997<br />
146
[12] Lee Seung-Yo et. al<br />
Analysis and design of active series voltage compensator with harmonic current compensation<br />
EPE’99, 555.<strong>pdf</strong>, Lausanne, 1999<br />
[13] Fujita H., Watanabe Y., Akagi H.<br />
Control and analysis of a unified power flow controller<br />
IEEE Transactions on power electronics, Vol. 14, No. 6, 1999<br />
[14] Lee, Jin-Woo<br />
An intelligent current controller using delay compensation for PWM converters<br />
EPE’97, pp. 1324-1346, Trondheim, 1997<br />
[15] Pena R., Cardens R., Asher G., Clare J.<br />
Vector control strategy of a harmonic and reactive power compensator<br />
EPE’97, pp. 4848-4853, Trondheim, 1997<br />
[16] Butt D. et. al<br />
Hamonic compensation in active shunt filters using controllers employing harmonic rotating frames of<br />
reference<br />
EPE’99, 742.<strong>pdf</strong>, Lausanne, 1999<br />
[17] Monti A., Scaglia A.<br />
A closed-form approach to the design of fuzzy-PI controller<br />
EPE’97, pp. 2471-2476, Trondheim 1997<br />
[18] Dzieniakowski M., Kazmierkowski M.<br />
Self-tuned fuzzy PI controller for PWM-VSI<br />
EPE’95, pp. 1308-1313, Sevilla, 1995<br />
[19] Svensson J.<br />
Inclusion of dead-time and parameter variations in VSC modelling for predicting responses of grid voltage<br />
harmonics<br />
EPE’97, pp. 3216-3221, Trondheim, 1997<br />
[20] Föllinger, Otto<br />
Regelungstechnik<br />
Hüthig Verlag, Heidelberg, 1994<br />
[21] Lutz, Wendt<br />
Taschenbuch der Regelungstechnik<br />
Verlag Harri Deutsch, Frankfurt am Main, 1998<br />
[22] Schröder, Dirk<br />
Elektrische Antriebe 2, Regelung von Antrieben<br />
Springer Verlag, Heidelberg, 1995<br />
[23] Schultes, Renate und Pohle, Ingo<br />
80C166 Mikrocontroller<br />
Francis Verlag, Poing, 1994<br />
[24] Siemens<br />
16 Bit Microcontrollers. User’s Manual<br />
03.96 Version 2.0<br />
147
Abbildungsverzeichnis<br />
1.1. Anschlußmöglichkeiten aktiver Filter an das Netz . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
1.2. Aufbau des Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
2.1. Dreiphasiger Wechselrichter in Brückenschaltung mit induktiver Last . . . . . . . . . . . . . . 14<br />
2.2. Spannungsraumzeiger des Zweistufenwechselrichters . . . . . . . . . . . . . . . . . . . . . . . 14<br />
2.3. Raumzeigermodulation für einen beliebigen Spannungsraumzeiger . . . . . . . . . . . . . . . . 15<br />
3.1. Spannungen des Dreiphasennetzes als Raumzeiger dargestellt . . . . . . . . . . . . . . . . . . 16<br />
3.2. Orthogonales und ortsfestes Koordinatensystem . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
3.3. Orthogonales und mit ω rotierendes Koordinatensystem . . . . . . . . . . . . . . . . . . . . . . 19<br />
3.4. Simulation verschiedener dq-Transformationen . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />
4.1. Hysteresis Comparator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />
4.2. Schema zur Berechnung des Kompensationsstroms mittels Notch Filter . . . . . . . . . . . . . 22<br />
4.3. Schema zur Berechnung des Kompensationsstroms in αβ-Koordinaten . . . . . . . . . . . . . . 23<br />
4.4. Schema zur Berechnung des Kompensationsstroms in dq-Koordinaten . . . . . . . . . . . . . . 24<br />
4.5. Schema des PI-Reglers ohne Koordinatentransformation nach [12] . . . . . . . . . . . . . . . . 25<br />
4.6. Schema des PI-Reglers für einzelne Oberschwingungskomponenten . . . . . . . . . . . . . . . 26<br />
5.1. Grundschema der Regelung in dq-Koordinaten in der s-Ebene . . . . . . . . . . . . . . . . . . 30<br />
5.2. Zu regelnde Strecke ohne Störgröße . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />
5.3. Regelkreis mit Störgrößen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />
5.4. Prinzip der Störgrößenkompensation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33<br />
5.5. Regelkreis mit Störgrößenkompensation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33<br />
5.6. Bodediagramm für die offene Strecke ohne Regler und den offenen Regelkreis mit PI- und PID 2 -<br />
Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
5.7. Bodediagramm für die diskreten Regler für reale Abtastfrequenzen . . . . . . . . . . . . . . . . 40<br />
5.8. Vergleich der drei Reglerentwürfe anhand der Sprungantwort des Gesamtsystems mit realen Abtastfrequenzen<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />
5.9. Vergleich der Reglerentwürfe an Hand des Netzstroms . . . . . . . . . . . . . . . . . . . . . . 43<br />
5.10. Vergleich der Reglerentwürfe an Hand des Spektrums des Netzstroms . . . . . . . . . . . . . . 43<br />
5.11. Einfluß der Laststromkompensation auf die Qualität der Regelung . . . . . . . . . . . . . . . . 44<br />
5.12. Bodediagramme für den offenen Regelkreis mit Dead Beat Regler und mit PID 2 -Regler für eine<br />
optimierte Abtastfrequenz von fTast � 5� 6kHz . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />
5.13. Sprungantworten des geschlossenen Regelkreises mit Dead Beat Regler und mit digitalem PID 2 -<br />
Regler für eine optimierte Abtastfrequenz von fTast � 5� 6kHz . . . . . . . . . . . . . . . . . . . 46<br />
148
5.14. Netzstrom ohne Laststromkompensation für eine Abtastfrequenz fTast � 5� 6kHz mit digitalem<br />
PID 2 -Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46<br />
5.15. Spektrum des Netzstromes für eine Abtastfrequenz von fTast � 5� 6kHz mit digitalem PID 2 -Regler 47<br />
7.1. Anschluß des Wechselrichters bei Stromeinspeisung in das Netz mit reduzierten Spannungen,<br />
ohne Laststrom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53<br />
7.2. Phasenströme bei Einspeisung in das Netz ohne Laststrom mit PI-Regler . . . . . . . . . . . . . 53<br />
7.3. Anschluß des Wechselrichters bei Stromeinspeisung in das Netz mit reduzierten Spannungen,<br />
mit Laststrom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54<br />
7.4. Phasenströme bei Einspeisung in das Netz mit sinusförmigem Laststrom mit PI-Regler . . . . . 54<br />
7.5. Phasenströme bei Einspeisung in das Netz mit B6 Brücke mit angeschlossener Induktivität als<br />
Last mit PI-Regler, mit reduzierten Spannungen . . . . . . . . . . . . . . . . . . . . . . . . . . 55<br />
7.6. Phasenströme bei Einspeisung in das Netz ohne Laststrom mit Dead Beat Regler, mit reduzierten<br />
Spannungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />
7.7. Phasenströme bei Einspeisung in das Netz mit sinusförmigem Laststrom mit Dead Beat Regler,<br />
mit reduzierten Spannungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />
7.8. Phasenströme bei Einspeisung in das Netz mit B6 Brücke mit angeschlossener Induktivität als<br />
Last mit Dead Beat Regler, mit reduzierten Spannungen . . . . . . . . . . . . . . . . . . . . . . 57<br />
7.9. Netzstrom mit Zustandsregler ohne Laststrom, mit reduzierten Spannungen . . . . . . . . . . . 58<br />
7.10. Meßaufbau mit Spannungsquelle mit Sinusspannung . . . . . . . . . . . . . . . . . . . . . . . 59<br />
7.11. Strom durch drei in Stern geschaltete Widerstände mit oberschwingungsbehafteter Netzspannung 60<br />
7.12. Nullstrom bei Anschluß des Filters an das oberschwingungsbehaftete Netz . . . . . . . . . . . . 61<br />
7.13. Netzstrom bei oberschwingungsbehafteter Netzspannung mit Dead Beat Regler . . . . . . . . . 62<br />
7.14. Strom durch drei in Stern geschaltete Widerstände, mit Sinusspannung, mit PI-Regler . . . . . . 62<br />
7.15. Nullstrom bei Anschluß des Filters an eine Sinusspannung . . . . . . . . . . . . . . . . . . . . 63<br />
7.16. Wechselwirkung zwischen dem Filter und der Spannungsquelle mit Sinusspannung . . . . . . . 64<br />
7.17. Netzstrom mit φ � 0 0 bei Anschluß des Filters an eine Sinusspannung . . . . . . . . . . . . . . 64<br />
7.18. Netzstrom mit φ ��� 90 0 bei Anschluß des Filters an eine Sinusspannung . . . . . . . . . . . . 65<br />
8.1. Datenfluß im Multi-Controller-System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68<br />
8.2. Blockschaltbild der SSC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />
8.3. Vollduplex Datenübertragung über die SSC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71<br />
149
Tabellenverzeichnis<br />
2.1. Schaltzustände der IGBT’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
5.1. Frequenzen der Netzoberschwingungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />
5.2. Maximale Abtastzeiten der digitalen Regler . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
5.3. Koeffizienten des PI-Reglers in Abhängigkeit von der Abtastfrequenz . . . . . . . . . . . . . . 38<br />
5.4. Koeffizienten der diskreten Regelstrecke in Abhängigkeit der Abtastfrequenz . . . . . . . . . . 39<br />
5.5. Koeffizienten des Dead Beat Reglers in Abhängigkeit der Abtastfrequenz . . . . . . . . . . . . 40<br />
5.6. Koeffizienten der Übertragungsfunktion der Netzspannungskompensation . . . . . . . . . . . . 41<br />
5.7. Koeffizienten der Übertragungsfunktion der Laststromkompensation . . . . . . . . . . . . . . . 41<br />
5.8. Von der Simulation verwendete Werte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
7.1. Experimenteller Vergleich von PI- und Dead Beat Regelung mit reduzierten Spannungen . . . . 59<br />
7.2. Frequenzen der Netzspannung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60<br />
7.3. Experimenteller Vergleich von PI- und Dead Beat Regelung mit Nennspannungen . . . . . . . . 66<br />
8.1. Konfiguration der Sende-, Empfangs- und Taktleitung der SSC . . . . . . . . . . . . . . . . . . 70<br />
8.2. Konfiguration des Registers SSCCON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72<br />
150
Index<br />
Abtastfrequenz, 38<br />
AD-Wandler, 50<br />
aktives Filter, 9, 11, 22, 26, 28, 32, 42, 48<br />
ASC0, 68<br />
Baudrate, 69<br />
Blindleistung, 19<br />
Bodediagramm, 35<br />
bootstrap, 68<br />
CAN, 68<br />
Dead Beat Regler, 28, 43, 50<br />
Dreiphasensystem, 16<br />
Durchtrittsfrequenz, 35, 36, 40<br />
Führungsgröße, 30<br />
Führungsverhalten, 30, 34<br />
FFT, 24<br />
Flicker, 9, 35, 53<br />
Frequenzkennlinienverfahren, 34<br />
Halbduplex, 70<br />
hysteresis comparator, 21, 22<br />
IGBT, 13<br />
Intelligent Power Module, 13<br />
Kausalität, 33<br />
Kommunikation, 70<br />
Kopplungsinduktivität, 13, 29<br />
Master, 69<br />
Matlab, 41<br />
Notch Filter, 21, 22<br />
Nullzeiger, 14<br />
Phasenreserve, 35, 36<br />
Phasenvordrehung, 36<br />
PI Regler, 25, 43, 50<br />
pll, 24<br />
Pulswechselrichter, 13<br />
Quantisierung, 49<br />
Raumzeiger, 16<br />
151<br />
Raumzeigermodulation, 15<br />
receive interrupt, 70, 71<br />
Saugkreis, 9, 21<br />
Schieberegister, 70<br />
Schnittstelle, synchron seriell, 69<br />
Simulink, 10, 28, 34, 42<br />
Slave, 69<br />
Spannungsmessung, 31<br />
Spannungsraumzeiger, 14, 18<br />
Sprungantwort, 41<br />
sprunginvariante Transformation, 39<br />
SSC, 68<br />
Störgröße, 29<br />
Störgrößenaufschaltung, 32–34, 37<br />
Störgrößenkompensation, 30, 32, 34, 40, 43<br />
Störverhalten, 30, 34<br />
Stellgröße, 29<br />
Strecke, 29<br />
Strommessung, 31<br />
Transformation, bezugsgrößeninvariant, 17<br />
Transformation, leistungsinvariant, 17<br />
Tustin Formel, 38, 40<br />
Verschiebungssatz, 48<br />
Vollduplex, 70<br />
Wirkleistung, 19<br />
Zustandsregler, 26, 50, 52, 57<br />
Zweistufenwechselrichter, 14