2015-09-15

Grundlagen der Elektrotechnik - Spannungs- und Stromquellen

Leider bleibt der Traum einer idealen Spannungsquelle auch weiterhin ein Traum. Umso mehr ein Grund, sich mit den realen Spannungsquellen zu beschäftigen. Reale Quellen zeichnen sich dadurch aus, dass sich die Spannung an ihren Klemmen abhängig von der Belastung ändert. Diese Zusammenhang wird durch den Innenwiderstand Ri beschrieben, dessen Größe das Verhalten der Quelle bestimmt.
Dieser Widerstand ist natürlich nicht einfach mit einem Ohmmeter messbar, sondern durch zwei Verfahren ermittelbar:
1. Die "Brute Force"-Methode, bei der wir einerseits ein Voltmeter an die Klemmen hängen und damit die Leerlaufspannung messen (unter der Prämisse, dass der Widerstand des Voltmeters sehr groß - idealerweise unendlich - gegenüber dem Innenwiderstand Ri ist, sonst funktioniert die Sache nicht) und andererseits mit einem direkt an die Klemmen geschalteten Amperemeter den Kurzschlußstrom in Erfahrung bringen. Leider ist dieses Verfahren nicht wirklich praktikabel, denn das Elektrizitätswerk lässt sich nur höchst ungern den Generator im Kraftwerk kurzschließen. Auch bei Autobatterien ist dies nicht empfehlenswert, da diese Ströme von mehreren hundert Ampere liefern können und daher sehr leicht Leitungen schmelzen oder verdampfen und durch den Kurzschluß innere Schäden davontragen können. Daher empfiehlt sich die zweite Methode:
2. Erstellen einer Belastungskennlinie durch Aufschalten mehrere Widerstände, die größer als der Innenwiderstand sind. Mit den gemessenen Strom- und Spannungswerten lässt sich eine Belastungskennlinie errechnen, aus der wir den Innenwiderstand ablesen können.

Wie läuft der Versuch nun ab?
Wir nehmen ein Labornetzgerät, das uns in einem vom Hersteller vorgegebenen Bereich bis zu einem maximalen Strom eine konstante Spannung liefert (also in diesem Bereich fast eine ideale Quelle darstellt) und "verschlechtern" diese mit einem Widerstand unserer Wahl. Dann nehmen wir vier bis fünf Widerstände verschiedener Größe und messen mit diesen Ausgangsspannung und -strom. In diese Tabelle sind auch die Werte der "Beute Force"-Methode eingeflossen (Nr. 1 und 7). Damit zeichnen wir wieder ein Punktdiagramm mit Regressionsgeraden.
Die Geradengleichung der Kennlinie gibt in diesem Fall zwei Werte an. Die Gleichung der Ausgangsspannung der Quelle lautet :
U = Ri * I + Uo
Somit kann man Ri sofort ablesen, sein Wert beträgt 0,118 Kiloohm oder 118 Ohm. Bei der Messung wurde ein 120 Ohm Widerstand verwendet, der Messwert liegt innerhalb der Toleranzen. Die Leerlaufspannung wurde mit 4,992 Volt errechnet, beim Versuch haben wir 5V eingestellt. Auch hier zeigt der Korrelationskoeffizient an, dass die Ergebnisse wenig Fehler aufweisen.
Führt man den Versuch mit einem Ri durch, der sehr groß gegenüber den Belastungswiderständen ist, so hat man eine reale Stromquelle und kann deren Werte auf die gleiche Art ermitteln.---

Grundlagen der Elektrotechnik - die Widerstandskennlinie

In der ersten Klasse meiner Schule lernen Schüler mit ohmschen Widerständen rechnerisch umzugehen. Im Labor führe ich mit ihnen eine Übung durch, die zeigt, dass die Theorie stimmt.

Dazu nehmen wir die Strom-/Spannungskennlinie eines Widerstandes auf. Üblicherweise lasse ich dabei die Spannung von Null bis 10 Volt in 1Volt-Schritten einstellen und den Strom ablesen. Daraus ergibt sich die nebenstehende Tabelle.

Diese Werte stellen wir in einem Diagramm grafisch dar, wobei wir korrekterweise kein Liniendiagramm erstellen dürfen, da wir z.B. die Werte zwischen 1V und 2V nicht kennen. Daher stellen wir es als Punktdiagramm dar und lassen die Tabellenkalkulation - in meinem Fall LibreOffice - eine Regressionskurve (in Excel "Trendlinie") durch die Punkt legen. Das sieht dann so aus:
Die rot dargestellte Regressionsgerade stellt die mathematisch beste Annäherung an eine Gerade durch alle Punkt dar. Das Feine darin ist, dass die Tabellenkalkulation auch die Geradengleichung auf Mausklick herausrückt. Diese ist im obigen Bild als "f(x)" bezeichnet, wobei x die vorgegebene Spannung darstellt. Die Geradengleichung selbst hat die Form I = G * U mit G als Leitwert bzw. Kehrwert des Widerstandswertes R.
Aus der Gleichung entnimmt man die Steigung der Geraden mit dem Wert 0,475 und bildet daraus den Kehrwert R = 1/G = 1/0,475 = 2,11 Kiloohm (da wir den Strom mit Milliampere gemessen haben, ergibt Volt durch Milliampere Kiloohm). Der Widerstand hat also den Wert 2,2 Kiloohm.
Die im Diagramm angegebene Größe R2 ist der Korrelationskoeffizient, der beschreibt, wie "gut" die Punkte auf der Ausgleichsgeraden liegen. Führt man dies mit gerechneten Werten durch, erhält man immer den Wert Eins, da die Punkt exakt auf der Linie liegen. Im vorliegenden Fall ist die Messgenauigkeit offensichtlich sehr gut gewesen, da wir den Wert Eins nur knapp verfehlt haben.---

2014-05-18

Arduino und PWM

Messaufbau
Heute hat es mich einmal gereizt, die Pulsweitenmodulation des Arduinos zu erforschen. Dazu habe ich einen 10kΩ zwischen den PWM-Pin 10 und Masse gelegt und mein geliebtes DSO angeschlossen. Ein kleines Testprogramm war schnell geschrieben und sogleich offenbarten sich mir die Geheimnisse der PWM am Arduino.
Folgende PWM-Werte habe ich untersucht: 1, 10, 127, 254.

PWM = 1



Zur Feststellung der Frequenz stellt ich einen PWM-Wert von Eins ein. Man sieht die schmalen Nadelimpulse bei diesem Wert. Die Frequenz misst mein Oszi mit 490Hz bzw. einer Periodendauer von 2,04 Millisekunden.
Eine PWM von Null liefert Massepegel, der Wert 255 eine Gleichspannung von ca. 5V.




PWM = 10
Bei einer PWM von 10 habe ich zur Kontrolle die Pulsbreite gemessen. Dies geht mit den Cursors des DSO denkbar einfach. Die Pulsbreite beträgt 80µs. Stimmt das? Überlegen wir kurz: Eine Periodendauer von 2,04ms = 2040µs wird in 255 Stufen unterteilt. Ein PWM-Wert von Eins liefert daher einen Impuls von 2040/255 = 8µs. Der PWM-Wert von 10 verlängert diese Zeit um das 10fach, also auf 80µs. Voila!




PWM = 127
Ein Rechtecksignal mit einem Duty-Cycle von 1:1 erhält man mit einem PWM-Wert von 127. Wie man sieht beträgt, die Pulsbreite (bis auf 4µs genau) die Hälfte der Periode.








PWM = 254

Bei 254 beträgt die Impulspause nur mehr 8µs, was mit der oben durchgeführten Rechnung übereinstimmt.










Das Programm wird mit folgenden Tasten gesteuert:
  • "#" = +10 (die Raute stelle ich mir hier als doppeltes Pulszeichen vor)
  • "+" = +1 
  • o = Stopp (das kleine O statt der Null, damit ich nicht zwei Funktionen auf einer Taste habe(shift 0 ist das Gleichheitszeichen)
  • "-" = -1
  • "=" = -10 ("doppeltes Minus")

/*
  pwm_oszi2.ino
  
  PWM-Darstellung
  am Oszilloskop
  
  A.Holzer, 2014-05-18
*/

const int pwmPin = 10;
int pwm = 0;

void setup()
{
  delay(5000);
  Serial.begin(9600);
  while(!Serial) {};
  Serial.println("*** pwm_oszi1 ***");
}

void loop()
{
  Serial.println("'#'=+10, '+'=+1, 'o'=Stopp, '-'=-1, '='=-10: ");
  if(Serial.available() > 0)
  {
    char z = Serial.read();
    Serial.print(z);
    switch(z)
    {
      case '#': // +10
        if(pwm+10 <= 255)
          pwm += 10;
        else
          pwm = 255;  
        break;
      case '+': // +1
        if(pwm+1 <= 255)
          pwm += 1;
        break;
      case '=': // -10
        if(pwm-10 >= 0)
          pwm -= 10;
        else
          pwm = 0;  
        break;
      case '-': // -1
        if(pwm-1 > 0)
          pwm--;
        break;
      case 'o': // Stopp
        pwm = 0;
        break;
      default:
        Serial.println("Was???");      
    }
    analogWrite(pwmPin, pwm);
    Serial.print("   PWM = ");
    Serial.println(pwm,DEC);
  }
}

2014-05-09

Arduino Leonardo unter MacOS X 10.9.2

Auf meinem Macbook Pro funktioniert die Arduino-IDE ebenfalls klaglos.
Schnittstelle auswählen
Board auswählen

2014-05-02

Arduino-Libraries selbst schreiben

Eigene Libraries für die Arduino-Plattform zuschreiben, sieht schwieriger aus als es ist. Allerdings sollte man minimale C++-Kenntnisse mitbringen, damit man nicht zu sehr leidet.

Bei der Installation erstellt wird ein Sketchbook-Ordner erstellt, in dem alle selbstgeschriebenen Sketches (=Arduino-Programme) in einem eigenen, gleichnamigen Verzeichnis untergebracht sind. Unmittelbar nach der Installation ist dieser Ordner natürlich leer, bis auf ein Verzeichnis, das automatisch angelegt wird: Der Ordner "libraries".

In diesem Ordner ist eine Textdatei abgelegt, die einen Link zu einer Hilfeseite auf der Arduino-Homepage enthält. Dieser Link zeigt auf eine Seite, die die Installation zusätzlicher Libraries beschreibt.
Wie man eigene Libraries schreibt, steht auf einem anderen Blatt bzw. an anderer Stelle auf der Arduino-Seite, nämlich:

http://arduino.cc/en/Hacking/LibraryTutorial

Hier möchte ich ein noch einfacheres Beispiel als im oben erwähnten Tutorial besprechen, nämlich die Ansteuerung der LED an Port 13 des Arduinos mit einer selbstgeschriebenen Library namens "LED13". Dazu erstellen wir im Ordner Library ein neues Verzeichnis "LED13". Mit unserem Lieblingseditor erzeugen wir zwei neue Dateien mit den Namen "LED13.cpp" und "LED13.h".

Achtung: Ordner- und Dateinamen sowie die noch zu schreibende C++-Klasse müssen unbedingt den identischen Namen (wie oben gezeigt) aufweisen! Groß- und Kleinschreibung ist nicht egal!

Die Klasse soll drei Funktionen besitzen:

  • ein() schaltet die LED ein
  • aus() schaltet die LED aus
  • zustand() gibt True zurück, wenn die LED leuchtet, sonst False

Privat abgespeichert werden die Pin-Nummer für spätere Erweiterungen und der Zustand der LED in einer boolean-Variable.

In die Datei LED13.h - die sogenannte Header-Datei - kommt die Definition der Klasse "LED13":

Falls das Konstrukt mit "#ifndef ... #endif" nicht klar ist: Eine andere Klasse kann die Klasse LED13 ableiten und ihre Methoden und Variablen erben. Damit die Definition von LED13 nicht doppelt oder mehrfach erfolgt, definiert man ein Symbol für den Compiler - in diesem Fall "LED13_H" - und fragt mit "#ifndef" ab, ob es noch nicht definiert ist. Wurde es bereits definiert, wird der gesamte Code zwischen "#ifndef" und "#endif" übersprungen und nicht übersetzt. Andernfalls wird die Klassendefinition einmalig compiliert.

In der Datei LED13.cpp werden die Klassenfunktionen, auch Methoden genannt, codiert. Damit der Compiler die Funktionen der Klasse zuordnen kann, muss vor dem Funktionsnamen der Klassenname mit zwei Doppelpunkten eingefügt werden.






































Zum Testen der Klasse schreiben wir einen kleinen Sketch:











































Damit die Library auch eingebunden werden kann, muss sie importiert werden:









Nach dem Kompilieren und Uploaden sollte das Programm fehlerfrei ablaufen.

2014-04-25

Fouriertransformation mit wxMaxima

Elektronikingenieure sind oft mit nichtsinusförmigen Vorgängen konfrontiert, deren mathematische Lösung nur über Differentialgleichungen, Laplace-Transformation oder eben durch die von Jean-Baptiste Fourier entwickelte Fourier-Transformation möglich ist. Eine gute mathematische Zusammenfassung über das Wesen der Fourier-Reihen findet man z.B. in der Wikipedia.
Originelle Anwendungen findet man z.B. hier, hier oder hier.
Integrale mit Winkelfunktionen zu Fuss zu lösen, kann mühevoll und entmutigend sein. Hier springt das Open Source-Programm wxMaxima in die Bresche und erledigt die mathematische Knochenarbeit schnell und willig. Da die Entwicklung bereits in den 1960er Jahren begann, kann man annehmen, dass die gröbsten Fehler beseitigt sind. Es hat zwar nicht die grafische Eleganz neuerer Programm, ist aber ein ausgezeichnetes Arbeitspferd.
Die Eingabe erfolgt mit Schlüsselwörtern im Textmodus, bei richtig ausgeführter Installation zeigt wxMaxima die Formeln grafisch an.
Zur Veranschaulichung der Arbeitsweise lasse ich ein Beispiel aus einem Mathematikbuch für HTLs (Timischl, W. et. al., "Ingenieurmathematik Band 4", in meiner Auflage auf Seite 104ff) durchrechnen.

Für die nebenstehende Zeitfunktion sollen die Fourierkoeffizienten ausgerechnet werden. In wxMaxima teilen wir die Funktion in die Abschnitte 0 bis π und π bis 2π auf.




Als Erstes definieren wir den Scheitelwert der Rechteckspannung als Variable:





Variablen werden mit dem Doppelpunkt deklariert, Funktionen mit Doppelpunkt und Gleichheitszeichen:


u1(t) beschreibt den Spannungsverlauf von 0 bis π ,
u2(t) den von  π bis 2π.



Den Gleichanteil speichern wir in der Variablen  a0  ab, der sofort berechnet und angezeigt wird:


Der Gleichanteil stellt den arithmetischen Mittelwert einer Funktion dar, im vorliegenden Fall muss der Wert von a0 noch durch zwei dividiert werden, was später bei der Definition der Fourierreihe erfolgt.
Als nächstes stellen wir die Funktionen für die a- und b-Koeffizienten auf:








Der Index n dient zur Auswahl der n-ten Harmonischen (Oberwelle).
Zur Kontrolle lassen sich die Koeffizienten ausgeben:
Alle Koeffizienten der Kosinus-Glieder der Fourierreihe sind erwartungsgemäß Null, da es sich bei der gestellten Aufgabe um eine ungerade Funktion handelt.
Eine ungerade Funktion wird durch die Gleichung f(-x) = -f(x) charakterisiert, während eine gerade Funktion durch f(-x) = f(x) beschrieben wird. Eine Sinusfunktion ist daher ungerade, eine Kosinusfunktion gerade.


wxMaxima speichert die Koeffizienten nicht als Dezimalzahlen, sondern korrekt als Ausdrücke, wie man sie bei der händischen Integration erhält.












Auf Wunsch gibt wxMaxima natürlich auch die Dezimalwerte aus!














Nun definieren wir die Fourierreihe:







Zur Kontrolle synthetisieren wir ein Signal aus den ersten neun Koeffizienten und prüfen, ob es der Rechteckfunktion ähnlich sieht:

Der wxplot2d-Befehl dient zum Darstellen von Funktionen, im vorliegenden Fall wird die Funktion über zwei Perioden geplottet.

Mit nur neun Gliedern einer Reihe sind die Flanken noch nicht sehr steil, außerdem zeigt sich ein Überschwingen bei den beiden Extrema der Funktion.



 Mit 100 Glieder sieht die Funktion schon fast perfekt aus! Das Überschwingen ist auch als Gibbssches Phänomen bekannt. Es tritt immer dann auf, wenn eine unstetige Funktion durch eine Reihe mit endlicher Anzahl von Termen modelliert wird.






Die wxMaxima-Datei zum obigen Beispiel zum Herumspielen

Schaltungssimulation mit LTSpice

Die Firma Linear Technology, Chiphersteller mit einem umfangreichen Produktportfolio, stellt in dankenswerter Weise eine Vollversion von Spice zur Verfügung. Die Schaltplaneingabe ist grafisch möglich, Analysen im Gleich- und Wechselstrombereich sowie Parameter- und Temperaturuntersuchungen sind möglich. Die Ausgabe erfolgt ebenfalls grafisch.
Als Beispiel habe ich eine astabile Kippstufe mit dem Timer NE555 gewählt, da Oszillatorschaltungen einen kleinen Trick zum Anschwingen benötigen.
Verwendet man eine DC-Quelle als Stromversorgung, kann der Oszillator nicht anschwingen, da die dazu notwendigen Umladevorgänge im Kondensator nicht stattfinden können.
Aus diesem Grund wählt man eine Pulsquelle, deren Spannung von Null auf neun Volt nach einer Anfangsverzögerung von 0.5ms in z.B. 10µs ansteigt. Die Anfangsverzögerung ist nur zu Demonstrationszwecken eingestellt und wird nicht benötigt.
In der Ausgabe ist die Rechteckschwingung als grüner und die Spannung am Kondensator als roter Kurvenzug dargestellt.
Wie man sieht, pendelt die Spannung am Kondensator nach dem initialen Aufladevorgang zwischen 3V und 6V, was durch die drei gleich großen Widerstande der Komparatorschaltungen im NE555 bedingt ist.

LTSpice-Datei zum Ausprobieren