Events

:

:

Elektronik | Funk | Software

Der Technik-Blog

  • Social Media

    YouTube

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden

    Der Technik-Blog

    Arduino MCP4822 Analoge Voltage DA-Wandler

    Analoge Spannung mit DA-Wandler MCP4822

    Alex @ AEQ-WEB

    Der MCP4822 ist ein Dual-Channel 12-Bit-Digital-zu-Analog-Wandler (DAC). In Kombination mit einem Arduino Uno oder einen anderen Mikrocontroller ermöglicht der MCP4822 die Umwandlung digitaler Signale in präzise analoge Spannungen. Dieser Blogartikel beschreibt die Inbetriebnahme und Ansteuerung vom MCP4822 mit einem Arduino Uno.


    Kommunikation via SPI

    Die SPI-Schnittstelle (Serial Peripheral Interface) ist ein weit verbreitetes Protokoll zur schnellen und seriellen Datenübertragung zwischen Mikrocontrollern und Peripheriegeräten oder IC-Bausteinen wie dem MCP4822. Im Gegensatz zu anderen Kommunikationsprotokollen wie I²C oder UART basiert SPI auf einem Master-Slave-Prinzip, bei dem ein Gerät (der Master) die Kommunikation steuert. Der MCP4822 empfängt Daten vom Mikrocontroller (Arduino) über diese SPI-Schnittstelle. Dazu wird ein 16-Bit-Datenwort übertragen, das den gewünschten Ausgangswert und die Konfiguration (z. B. Kanalwahl) enthält. Der MCP4822 wird wie folgt an den Mikrocontroller angeschlossen:

    Werbung:

    Die Verbindung des MCP4822 mit dem Arduino erfolgt über die SPI-Schnittstelle. Folgende Leitungen müssen verbunden werden, um eine funktionierende Schaltung zu erhalten:

    VCC und GND: Der MCP4822 wird über VCC (Pin 1) mit der 5V-Stromversorgung des Arduino verbunden. GND (Pin 7) wird mit der Masse des Arduino verbunden.

    CS (Chip Select): Pin 2 des MCP4822 wird mit einem digitalen Pin vom Arduino (Pin 8) verbunden. Dieser Pin aktiviert den MCP4822 für die Datenübertragung.

    SCK (Serial Clock): Pin 3 des MCP4822 wird mit dem SPI-Taktpin des Arduino (Standard: Pin 13) verbunden.

    SDI (Serial Data In): Pin 4 des MCP4822 wird mit dem MOSI-Pin des Arduino (Standard: Pin 11) verbunden. Hier werden die digitalen Daten übertragen.

    LDAC: Pin 5 kann entweder direkt auf GND gelegt werden, um die analogen Ausgänge automatisch zu aktualisieren, oder mit einem digitalen Pin des Arduino verbunden werden, um Updates manuell auszulösen.

    VOUTA und VOUTB: Die Pins 8 und 9 sind die analogen Ausgänge des MCP4822. Sie geben die digital übermittelten Spannungswerte aus.

    Verwendung von Kondensatoren

    Im Schaltplan sind mehrere Kondensatoren eingezeichnet, welche im Datenblatt vom MCP4822 empfohlen werden. Diese Kondensatoren dienen der Entstörung und Stabilisierung der Versorgungsspannung sowie der Optimierung der Signalqualität der analogen Ausgänge. Für einen Testaufbau auf einem Steckbrett können die Kondensatoren vernachlässigt werden. Allerdings können dabei kleine Schwankungen oder Störungen auftreten, die sich auf die analoge Ausgabe auswirken können.

    Werbung:

    Software zur Ansteuerung des MCP4822

    Das Programm ermöglicht die Ansteuerung des MCP4822 über die SPI-Schnittstelle vom Arduino. Zu Beginn wird die SPI-Schnittstelle initialisiert und ein Startwert von 1250 (ca. 1,25 V bei Verstärkung 2x) auf Kanal A des MCP4822 gesetzt. Über die serielle Konsole können anschließend Spannungswerte zwischen 0 und 4095 eingegeben werden, die am analogen Ausgang ausgegeben werden. Die Funktion setDACVoltage() erzeugt dabei das 16-Bit-Steuerwort für den DAC und überträgt es über SPI. Eine zusätzliche Bibliothek wird nicht benötigt, da SPI bereits in der Arduino-IDE enthalten ist. Der folgende Beispielcode kann jetzt auf den Arduino geschrieben werden:

    #include <SPI.h>
    
    // More Information: https://www.aeq-web.com
    // Pin configuration for Arduino -> MCP4822:
    // | Pin 8 -> CS (Chip Select)   |
    // | Pin 11 -> SCK (Serial Clock) |
    // | Pin 13 -> SDI (Serial Data)  |
    // | 5V     -> VDD                |
    // | GND    -> VSS                |
    // | GND    -> LDAC               |
    
    int csPin = 8; // Chip Select Pin
    
    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: 1250 corresponds to 1.2V at Gain = 2x)
      setDACVoltage(1250, 0);
    
      Serial.println("Enter a value between 0 and 4095 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 4095)
        if (voltage >= 0 && voltage <= 4095) {
          setDACVoltage(voltage, 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 4095.");
        }
      }
    }
    
    
    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

    YouTube

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden