30.12.2012 Aufrufe

Diplomarbeit.pdf

Diplomarbeit.pdf

Diplomarbeit.pdf

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!