Events

:

:

Elektronik | Funk | Software

Der Technik-Blog

  • Social Media

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden

    Der Technik-Blog

    Arduino 0-10V Analog Output

    Analoge Spannungen verstärken mit dem LM358

    Alex @ AEQ-WEB

    Der LM358 ist ein weit verbreiteter Operationsverstärker (OPV), der sich ideal für einfache Verstärkerschaltungen eignet. Er ist günstig, benötigt nur eine Versorgungsspannung (Single Supply) und kann positive Spannungen verstärken, ohne dass eine zusätzliche negative Spannung benötigt wird. In vielen Anwendungen, insbesondere bei Digital-Analog-Wandlern (DACs) wie dem MCP4822, werden niedrige Ausgangsspannungen erzeugt, die für nachfolgende Schaltungen oft nicht ausreichen. Ein Beispiel: Der MCP4822 kombiniert mit einem Arduino liefert maximal etwas mehr als 4 Volt Ausgangsspannung, aber viele Schaltungen benötigen oft analoge Spannungen von 0 bis 10 Volt. Dieser Artikel beschriebt, wie der LM358 als Verstärker genutzt werden kann und eine analoge Eingangsspannung von 0 bis 4 Volt auf Ausgangsspannung 0 bis 10 Volt verstärkt. Anschließend soll dieser von einem MCP4822 DA-Wandler angesteuert werden um damit eine programmierbare analoge Spannung eine einem Bereich von 0 bis 10 Volt erzeugen zu können.

    Bauteile & Schaltplan

    Für die Verstärkung der Spannung von 0–4V auf 0–10V wird ein LM358 Operationsverstärker verwendet, der mit einer einfachen nichtinvertierenden Verstärkerschaltung arbeitet. Die Schaltung benötigt eine 12V-Versorgungsspannung, um die gewünschte Ausgangsspannung zu erreichen. Zur Einstellung der Verstärkung wird ein 20 kΩ Potentiometer als variabler Widerstand im Feedback-Zweig eingesetzt, zusammen mit einem 10 kΩ Widerstand zwischen dem invertierenden Eingang und Masse. Diese Kombination ermöglicht eine Verstärkungsregelung zwischen 1-fach und 3-fach, sodass die Ausgangsspannung entsprechend angepasst werden kann. Ein 100nF Kondensator zwischen der Versorgungsspannung und Masse dient zur Entkopplung und stabilisiert die Schaltung. Der LM358 ist kein Rail-to-Rail-OPV, was bedeutet, dass der Ausgang bei einer 12V-Versorgung nur etwa 11V erreicht und nicht bis zur vollen Betriebsspannung arbeiten kann. Auch der untere Spannungsbereich liegt leicht über 0V, was in Anwendungen mit präzisen Ausgangsspannungen berücksichtigt werden muss.

    Werbung:

    Die Verstärkung dieser Schaltung berechnet sich mit der Formel V = 1 + (Rf/Rg). Mit einem festen Widerstand (Rf) anstelle des Potentiometers und der entsprechenden Formelumstellung lässt sich der ideale Wert bestimmen. Um 0–4V auf 0–10V zu verstärken, muss die Verstärkung 2,5 betragen. Setzt man für Rg einen 10 kΩ Widerstand ein, ergibt sich ein idealer Rf von 15 kΩ:

    Programmierbare analoge Ausgangsspannung

    Für eine flexible Steuerung der Ausgangsspannung kann die Verstärkerschaltung mit einem programmierbaren analogen DA-Wandler und einem Arduino kombiniert werden. Ein Digital-Analog-Wandler wie der MCP4822 ermöglicht die Erzeugung präziser Ausgangsspannungen, die dann vom LM358 auf den gewünschten Bereich verstärkt werden. Wie der MCP4822 funktioniert und wie er angesteuert wird, wurde bereits in einem früheren Artikel beschrieben. Dort wird erklärt, wie eine programmierbare analoge Ausgangsspannung erzeugt werden kann, die sich mit der hier vorgestellten Verstärkerschaltung auf einen erweiterten Spannungsbereich anpassen lässt.

    Werbung:

    Software

    Auch die Software musste verändert werden und an den OPV angepasst werden. Mit dem folgenden Beispielcode kann eine analoge Spannung von 0-10V erzeugt werden.

    #include <SPI.h>
    
    // More Information: https://www.aeq-web.com/analoge-spannung-verstaerken-mit-dem-lm385-opv-und-eine-analoge-spannung-von-0-10-volt-erzeugen-mit-arduino/
    //
    // Pin configuration for Arduino -> MCP4822:
    // | Pin 8 -> CS (Chip Select)   |
    // | Pin 13 -> SCK (Serial Clock) |
    // | Pin 11 -> SDI (Serial Data)  |
    // | 5V     -> VDD                |
    // | GND    -> VSS                |
    // | GND    -> LDAC               |
    
    int csPin = 8; // Chip Select Pin
    float OpAmpFc = 2.5; //OpAmp amplification factor
    
    void setup() {
      Serial.begin(9600); // Initialize serial communication for debugging
      pinMode(csPin, OUTPUT); // Configure CS pin as output
      digitalWrite(csPin, HIGH); // Set CS pin to HIGH (inactive)
    
      // Initialize SPI interface
      SPI.begin();
      delay(100);
    
      // Set initial voltage for channel A (example: 5000/2.5 = 2500mV set to ADC and gives 5V out after OpAmp LM358)
      int initVoltage = 5000;
      setDACVoltage(initVoltage/OpAmpFc, 0); // Set voltage on channel A
    
    
      Serial.println("Enter a value between 0 and 10000 to change the output voltage at channel A!");
    }
    
    void loop() {
      // Check if there is input available from the serial monitor
      if (Serial.available() > 0) {
        String input = Serial.readStringUntil('\n'); // Read input until newline character
    
        // Convert input string to an integer
        int voltage = input.toInt();
    
        // Check if the input voltage is within the valid range (0 to 10000)
        if (voltage >= 0 && voltage <= 10000) {
          int opvInput = voltage/OpAmpFc;
          setDACVoltage(opvInput, 0); // Set voltage on channel A
          Serial.print("Voltage set to: ");
          Serial.print(voltage);
          Serial.println(" mV");
        } else {
          Serial.println("Invalid input. Please enter a value between 0 and 10000.");
        }
      }
    }
    
    
    void setDACVoltage(uint16_t value, uint8_t channel) {
      if (value > 4095){
         value = 4095; // Limit value to 12-bit maximum
      }
    
      // Create the 16-bit command word
      uint16_t command = 0;
      command |= (channel & 0x01) << 15; // Set channel (bit 15: 0 = A, 1 = B)
      command |= 0x1 << 12;              // Set active mode (bit 12)
      command |= (value & 0x0FFF);       // Set voltage value (12 bits)
    
      // Send the command via SPI
      digitalWrite(csPin, LOW); // Activate the DAC
      SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
      SPI.transfer16(command); // Transmit the 16-bit command
      SPI.endTransaction(); // End the SPI transaction
      digitalWrite(csPin, HIGH); // Deactivate the DAC
    }
    


    122X122

    Über den Autor

    Alex, der Gründer von AEQ-WEB. Seit über 10 Jahren beschäftigt er sich mit Computern und elektronischen Bauteilen aller Art. Neben den Hardware-Projekten entwickelt er auch Webseiten, Apps und Software für Computer.

    Top Artikel in dieser Kategorie:

    Grundlagen Schaltnetzteil Primaerseite

    Grundlagen Schaltnetzteil (1)

    • Video

    In Teil 1 der Reihe Schaltnetzteile Grundlagen geht es um die Primärseite. Dazu werden wir ein vorhandenes SNT zerlegen und Bauteil für Bauteil analysieren

    Weiterlesen
    DC Motor umpolen mit Relais

    Motor Umpolrelais Schaltung

    • Video

    DC Motoren können mit zwei Wechselrelais recht einfach umgepolt werden. Mit diesen Relais kann die Drehrichtung des Gleichstrommotors geändert werden

    Weiterlesen

    Social Media

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden