Analoge Spannungen verstärken mit dem LM358
05.03.2025
Elektronik | Funk | Software
Der Technik-Blog
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.
Datenblatt MCP4822
MCP4822 bei Reichelt
LM358 bei Reichelt
MCP4822 Arduino Tutorial
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.
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Ω:
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.
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 }
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
WeiterlesenDC Motoren können mit zwei Wechselrelais recht einfach umgepolt werden. Mit diesen Relais kann die Drehrichtung des Gleichstrommotors geändert werden
WeiterlesenAEQ-WEB © 2015-2025 All Right Reserved