MCP4725 DAC Modul (Teil 2)

DAC Module OpAmp

DACs werden meist zusammen mit analogen Schaltkreisen genutzt. Als Beispiel hierfür werden wir eine programmierbare Stromquelle bauen.

Eine programmierbare Stromquelle

Im ersten Teil dieses Tutorials haben wir gelernt, wie der MCP4725 funktioniert und zur Signalerzeugung verwendet werden kann. Wir haben uns ein sehr einfaches Beispiel angesehen und ein Sägezahnsignal erzeugt. DACs können jedoch nicht nur zur Signalerzeugung verwendet werden. Die wahre Stärke von DACs und ADCs liegt in der Tatsache, dass sie uns erlauben, analoge und digitale Schaltungen zu kombinieren.

Während es viele Beispiele dafür gibt, wie man einen ADC verwendet, um z.B. einen analogen Sensor in ein Mikrocontroller-Projekt zu integrieren, gibt es weit weniger Beispiele für die Verwendung von DACs in Verbindung mit anderen analogen Schaltungen. Daran ist auch nichts auszusetzen. Viele fantastische Projekte lassen sich auch ohne einen DAC realisieren. Außerdem gibt es unzählige Arduino Module, die uns die Arbeit abnehmen, sodass wir selbst meist keine zusätzlichen analogen Schaltungen aufbauen müssen. Im Grunde genommen ist es deshalb wahrscheinlich kein großes Problem, dass der Arduino Uno keinen DAC hat. Ohnehin würden ihn nur die wenigsten Leute benutzen. Viele fürchten die höhere Komplexität von analogen Schaltungen.

Ich denke, um zu verstehen, wozu ein DAC in Verbindung mit analogen Schaltungen in der Lage ist, ist es wichtig, sich auch einmal eine etwas fortgeschrittenere Schaltung anzusehen. Als unser zweites Beispiel werden wir deshalb eine programmierbare Stromquelle bauen und den DAC verwenden, um den gewünschten Ausgangsstrom einzustellen. Nichts Ausgefallenes, nichts, was nicht schon einmal gemacht wurde, aber ich denke, dies ist ein gutes Beispiel, das nicht zu kompliziert und trotzdem nützlich ist.

Den Schaltkreis verstehen

Im letzten Tutorial haben wir uns bereits angesehen, wie man den MCP4725 an den Arduino Uno anschließt, was nicht besonders schwer ist. Der Aufbau einer regelbaren Stromquelle hingegen erscheint schon schwieriger zu sein. Wir werden dafür eine Spannungs-Strom-Wandler-Schaltung mit einem Operationsverstärker, oder kurz Op-Amp, verwenden. Diese Schaltung erlaubt es uns, den Strom zu steuern, indem wir die Ausgangsspannung des DACs ändern. Sie ist im Bild unten dargestellt und benötigt nur wenige Bauteile. Das wichtigste Bauteil ist der Operationsverstärker LM358. Ich habe mich für den LM358 entschieden, weil er weit verbreitet ist, was die Wahrscheinlichkeit erhöht, dass du bereits einen herumliegen hast und ihn nicht extra kaufen musst. Du kannst ihn aber auch durch einen anderen geeigneten Operationsverstärker ersetzen. Der LM358 ist wirklich nichts Besonderes. Anschluss des MCP4725-Moduls und Aufbau der Spannungs-Strom-Wandler-Schaltung

Wenn du nicht mit Operationsverstärkerschaltungen vertraut bist, ist es wahrscheinlich schwierig für dich zu verstehen, wie diese Schaltung funktioniert. Operationsverstärker können in vielen verschiedenen Schaltungen verwendet werden und man könnte wahrscheinlich eine ganze Tutorialserie nur für sie erstellen. An dieser Stelle möchte ich jedoch nur eine kurze Einführung geben, die dir hoffentlich hilft, die Funktionsweise dieser Schaltung zu verstehen. Wenn du bereits weißt, wie eine Spannungs-Strom-Wandler-Schaltung funktioniert, oder es dich schlichtweg nicht interessiert, dann überspringe diese Erklärung einfach und schau dir den Code an und wie der DAC zur Steuerung des Stroms verwendet wird.

Das Bild unten zeigt das Schaltplansymbol für Operationsverstärker. Die Anschlüsse für die Versorgungsspannung werden dabei oft der Einfachheit halber weggelassen. Operationsverstärker in Open-Loop-Konfiguration

Operationsverstärker sind Differenzverstärker. Sie verstärken die Differenz zwischen den Spannungen an ihren beiden Eingangspins IN+ und IN-. Operationsverstärker haben einen sehr hohen Verstärkungsfaktor. Für den LM358 ist dies typischerweise ein Faktor von 100000. Das bedeutet, dass eine Differenz von 1 mV zwischen IN+ und IN- theoretisch zu einer Ausgangsspannung von 100 V führen würde. Dies ist natürlich nicht möglich, wenn die Versorgungsspannung des Operationsverstärkers nur 5 V beträgt. Der Operationsverstärker ist gesättigt. Am Ausgang liegt die höchstmögliche Spannung an. Bei den meisten Operationsverstärkern ist dies nicht die Versorgungsspannung. Nur spezielle Rail-to-Rail-Operationsverstärker können Spannungen bis zur Versorgungsspannung ausgeben. Beim LM358 liegt die maximale Ausgangsspannung 1,5 V unterhalb der Versorgungsspannung, was bei 5 V einer Spannung von 3,5 V entspricht.

Es ist nicht wirklich sinnvoll, wenn der Operationsverstärker immer in Sättigung ist. Außerdem ist der Verstärkungsfaktor in dieser sogenannten Open-Loop-Konfiguration stark temperaturabhängig. Aus diesem Grund werden Operationsverstärker fast immer mit Rückkopplung eingesetzt. Um zu verstehen, was das bedeutet, sehen wir uns eine sehr einfache Operationsverstärkerschaltung an, einen sogenannten Spannungsfolger.

OpAmp als Spannungsfolger

Ein Spannungsfolger ist sozusagen das Extrembeispiel für die Rückkopplung bei Operationsverstärkern. Der Ausgang des Operationsverstärkers ist direkt mit "IN-" verbunden. Wie wir wissen, verstärkt der Operationsverstärker die Spannungsdifferenz zwischen IN+ und IN-. In diesem Fall ist der Ausgang jedoch mit IN- verbunden und wir erhalten dadurch einen interessanten Effekt. Wenn die Ausgangsspannung also die Spannung an IN- etwas niedriger ist als die an IN+, wird diese Differenz verstärkt und bewirkt, dass die Ausgangsspannung ansteigt. Ist hingegen die Ausgangsspannung höher als die Spannung an IN+, so erhalten wir eine negative Spannungsdifferenz, die verstärkt wird und die Ausgangsspannung fallen lässt. Diese beiden Effekte sind entgegengesetzt und bewirken, dass sich die Ausgangsspannung auf die Spannung einpendelt, die an IN+ anliegt. Wir können dies verallgemeinern und sagen, wenn ein Operationsverstärker mit Rückkopplung verwendet wird, passt sich die Ausgangsspannung immer so an, dass die Spannungsdifferenz zwischen den Eingängen IN+ und IN- minimiert wird.

OpAmp als nicht-invertierende Verstärker

Das populärste Beispiel für die Verwendung von Operationsverstärkern mit Rückkopplung ist der sogenannte nicht-invertierende Verstärker. Er ist dem Spannungspuffer sehr ähnlich, verwendet aber einen Spannungsteiler für die Rückkopplung. Mit diesem Spannungsteiler lässt sich der gewünschte Verstärkungsfaktor - der Gain der Verstärkerschaltung - einstellen. Wenn R1 und R2 den gleichen Wert haben, würden wir nur die halbe Ausgangsspannung an IN- erhalten, was wiederum bedeutet, dass die Ausgangsspannung des Operationsverstärkers genau doppelt so hoch sein muss wie die Spannung an IN+, um die Spannungsdifferenz zwischen IN+ und IN- auf Null zu reduzieren. Die Verstärkerschaltung hat einen Gain von 2.

Werfen wir nun einen Blick auf die Spannungs-Strom-Wandlerschaltung, die wir für unser Beispiel benötigen. Spannungs-Strom-Wandler

Auf den ersten Blick sieht diese Schaltung der des nicht-invertierenden Verstärkers sehr ähnlich. Es gibt jedoch einen wichtigen Unterschied: Wir kennen den Widerstandswert für \(R_{LOAD}\) nicht. In unserer Beispielschaltung wird diese Last eine LED sein und wie alle anderen Dioden haben LEDs keinen festen Widerstand. Das ist auch der Grund, warum wir die Helligkeit einer LED nicht durch Ändern der Spannung steuern können. Sobald die Eingangsspannung über der Durchlassspannung der LED liegt und diese zu leuchten beginnt, steigt der Strom schnell an, wenn wir die Spannung weiter erhöhen. Wenn der Strom nicht durch einen Widerstand begrenzt wird, wird die LED beschädigt.

In diesem Beispiel wollen wir die Helligkeit nicht durch Änderung der Spannung steuern, sondern durch Einstellung des Stroms über den Operationsverstärker. Dazu müssen wir den Wert von \(R_{LOAD}\) nicht kennen. Der Strom durch ihn ist derselbe, der auch durch \(R_{SENSE}\) fließt. Dieser Messwiderstand hat einen bekannten Wert. In unserem Fall sind dies 100 Ω. Ein Teil der Ausgangsspannung des Operationsverstärkers fällt über der LED ab, der andere Teil über dem Messwiderstand. Die über den Messwiderstand abfallende Spannung ist für uns wichtig, weil sie auch die Spannung ist, die an IN- unseres Operationsverstärkers anliegt. Wie wir wissen, ändert sich die Ausgangsspannung des Operationsverstärkers so, dass die Differenz zwischen IN+ und IN- minimiert wird. Das heißt, wir können mit dem DAC die Spannung an IN+ einstellen und der Operationsverstärker wird die Ausgangsspannung so anpassen, dass der Spannungsabfall über \(R_{SENSE}\) mit der vom DAC eingestellten Spannung übereinstimmt. Wenn wir in der Lage sind, den Spannungsabfall über \(R_{SENSE}\) zu steuern, bedeutet dies, dass wir auch den Strom steuern können, der durch ihn und die LED fließt. Der Strom im Verhältnis zur Ausgangsspannung des DACs lässt sich leicht mit dem Ohmschen Gesetz berechnen:
\(I = {U_{SET} \over R_{SENSE}}\)

Natürlich hat diese Schaltung ihre Grenzen. Der Wert des Messwiderstandes bestimmt den Strombereich, aus dem wir wählen können. Mit dem DAC können wir eine maximale Spannung von 5 V ausgeben. Das bedeutet, dass der maximale Strom mit unserem 100 Ω Messwiderstand \(I = {5 V \over 100 Ω} = 50 mA\) ist. Theoretisch könnte man diesen Wert durch die Wahl eines kleineren Widerstands erhöhen, allerdings ist der LM358 ohnehin nicht in der Lage, mehr als 40 mA zu liefern. Wir sollten diesen Wert also nicht überschreiten. Es gibt jedoch noch eine weitere Grenze, die wir im Auge behalten sollten. Wenn wir die 5 V Versorgungsspannung unseres Arduinos als Versorgungsspannung für den Operationsverstärker verwenden, erreicht der LM358 die Sättigung bei etwa 3,5 V. Wenn wir die 2 V Vorwärtsspannung für unsere rote LED abziehen, bleiben uns maximal 1,5 V, die über den Messwiderstand abfallen können. Das bedeutet, dass unser maximaler Strom etwa 15 mA beträgt, nur weil der Operationsverstärker seine Ausgangsspannung nicht weiter erhöhen kann.

Um dieses Problem zu umgehen, habe ich in der Beispielschaltung die Versorgungsspannung des Operationsverstärkers an Vin und nicht an 5V angeschlossen. Dies wurde absichtlich so gemacht. Wenn wir eine höhere Spannung zur Versorgung des Arduino Uno verwenden, z. B. eine 9-V-Batterie, kann der Operationsverstärker nun eine höhere Spannung von bis zu 7,5 V ausgeben. Dadurch können wir Ströme bis zu 40 mA verwenden oder sogar mehr als eine LED in Reihe betreiben.

Warnung
Verbinde Vin oder den Ausgang des DACs nicht mit einem anderen Arduino-Pin. Die Spannungen an Vin und dem Ausgang des DACs können 5V überschreiten und würden den Arduino Uno beschädigen.

Code zur Steuerung des Stroms

Nachdem wir nun die Schaltung aufgebaut haben, wollen wir uns den Code ansehen, der zur Steuerung des Stroms benötigt wird:

#include <Adafruit_MCP4725.h>

// DAC
const int I2C_ADDR = 0x60;
Adafruit_MCP4725 dac;

// Amplifier
const int Rsense = 100;

void setup() {
  Serial.begin(9600);
  dac.begin(I2C_ADDR);
}

void loop() {
  // Read current
  Serial.print("Set Current (mA): ");
  while(!Serial.available());
  float current = Serial.parseFloat();
  Serial.println(current); 

  // Calculate required voltage drop over Rsense
  float setVoltage = current*Rsense/1000; 

  // Set DAC Value
  int dacValue = setVoltage/5*4096;
  if(dacValue > 4095 || dacValue < 0) 
  {
    Serial.println("Error: specified value is out of range");  
  }
  else 
  {
    dac.setVoltage(dacValue, false);
  }
}

Das Programm beginnt damit, den gewünschten Strom, den der Benutzer in den seriellen Monitor eingegeben hat, mit Serial.parseFloat() einzulesen. Wir verwenden dann diesen Wert, um die Ausgangsspannung für den DAC zu berechnen, die benötigt wird, um den gewünschten Strom zu erreichen. Dieser Wert wird dann in einen Wert zwischen 0 und 4095 umgewandelt und an den DAC gesendet. Ich habe eine kleine Überprüfung hinzugefügt, um einen Fehler anzuzeigen, wenn die Spannung, die wir für diesen Strom benötigen würden, den Ausgangsbereich des DACs überschreitet. Ich habe keine Prüfung eingebaut, die den maximalen Strom auf 40 mA begrenzt. Dies ermöglicht es dir, den Widerstandswert anzupassen und höhere Ströme zu konfigurieren, wenn du einen leistungsfähigeren Operationsverstärker oder einen zusätzlichen Transistor als Spannungspuffer am Ausgang verwendest, um den maximalen Strom zu erhöhen.

Sobald du dieses Programm auf deinen Arduino geladen hast, kannst du verschiedene Stromwerte wählen und auf diese Weise die Helligkeit der LEDs steuern. Wenn du zusätzlich eine 9-V-Batterie zur Stromversorgung des Arduinos verwendest, kannst du eine zweite LED in Reihe zur ersten schalten. Der Stromfluss und die Helligkeit bleiben dabei gleich. Beeindruckend, nicht wahr?

Hinweis
Wenn es bei der Eingabe des Stromwertes im seriellen Monitor zu Problemen kommt, achte darauf, dass du den seriellen Monitor so konfiguriert hast, dass er keine Zeilenenden sendet. Du kannst dies in der Combo-Box in der unteren rechten Ecke des seriellen Monitors konfigurieren.

Vorheriger Beitrag Nächster Beitrag