Schwankung der OP-AMP Spannung bei PWM

Hallo zusammen,

das hier ist mein erste Post, seid bitte gnädig :slight_smile:

Ich habe mittels PWM eine Spannung von 1V eingestellt.
Diese liefert mein Uno auch konstant.
Die 1V sollen auf eine andere Spannung mittels OP addiert werden.
Der OP scheint aber die PWM nicht zu verkraften.
Es kommt hier zu starken Schwankungen der Ausgangsspannung.
Ich konnte es über einen Kondensator, parallel zu Pin 11 und dem Eingang des OPs nicht in den Griff bekommen.

Bauteile:
Arduino Uno,
Steckplatine,
TLC272 (doppelter Operationsverstärker)
BNC Stecker für eine Sonde

Schaltplan ist auch angehängt

den Code seht ihr hier

#define SensorPin = A3
bool kalibriert = false;
int outputPin = 11;
int loop_count = 0;
int start_volt = 51;


void setup() {
  Serial.begin(9600);

}

void loop() {
  loop_count++;

  if (!kalibriert && loop_count % 2 == 0) {
    selbst_kalibrieren();

  }
 void selbst_kalibrieren() {
    float a0 = a0_lesen();
    Serial.println(start_volt);
    if (a0 < 0.99) {

      Serial.print("Selbstkalibrieren hoch: ");
      Serial.println(a0);
      analogWrite(outputPin, ++start_volt);
    } else {
      if (a0 > 1.01) {
        Serial.print("Selbstkalibrieren runter: ");
        Serial.println(a0);
        analogWrite(outputPin, --start_volt);
      } else {
        Serial.println("Kalibriert!");
        kalibriert = true;
      }
    }
  }
  float a0_lesen(){
  float a=0;
  float voltage=0;
  for (int i=0; i <= 100; i++){
    float sensorValue = analogRead(A0);
    voltage= sensorValue * (5.0 / 1024.0);
    a=a+voltage;
  }    
  voltage = a/100;   
  return voltage;
}

vielen Dank schon mal für jeden Tipp.

Ich habe mittels PWM eine Spannung von 1V eingestellt.
Diese liefert mein Uno auch konstant.

Das ist schon mal ein derber Irrtum!

Ich konnte es über einen Kondensator, parallel zu Pin 11 und dem Eingang des OPs nicht in den Griff bekommen.

Das glaube ich gerne.
Denn so quälst du den Pin zu Tode.

Ich empfehle dir einen DAC.
Entweder einen externen, oder einen Arduino mit DAC.

Evt. könntest du deine Kondensatorschaltung zu einem Tiefpass aufbohren.
Aber schön wird das nicht.

Hi,

ich werde aus Deinem Schaltplan nicht schlau, für mich sieht der eher nach einem Schaltkeisselbstmordkommando aus!
Evtl. erklärst Du mal, was Du eigentlich vor hast mit Deinem aufaddieren.

Gruß André

arneeee:
Ich habe mittels PWM eine Spannung von 1V eingestellt.
Diese liefert mein Uno auch konstant.

Erkläre uns doch mal wie du die Spannung gemessen hast.

SpaghettiCode:
ich werde aus Deinem Schaltplan nicht schlau, für mich sieht der eher nach einem Schaltkeisselbstmordkommando aus!
Evtl. erklärst Du mal, was Du eigentlich vor hast mit Deinem aufaddieren.

Also es soll später eine sehr geringe Spannung gemessen werden, diese kann auch im negativen Bereich liegen. Das kann der Uno nicht auswerten/lesen.

HotSystems:
Erkläre uns doch mal wie du die Spannung gemessen hast.

Einmal habe ich ein Programm geschrieben, um es auf A1 zu messen. In der zweiten Version habe ich es einfach mit einem guten Multimeter gemessen.

combie:
Ich empfehle dir einen DAC.
Entweder einen externen, oder einen Arduino mit DAC.

Das werde ich jetzt versuchen.
Ich hoffe diese Anleitung hilft, bei dem, was du meinst.

Ich hoffe diese Anleitung hilft, bei dem, was du meinst.
Build a simple DAC for your Arduino - Arduino Project Hub

Dieser Anleitung ist der Vorschlag für einen RC Tiefpass ( 22µF * 3.3k ) zu entnehmen, combie meinte statt simplem Tiefpass einen “richtigen” DAC.
In der Diskussion dieses Projekts wird übrigens statt 22µF Elko ein “besserer” Kondensator empfohlen und die geringere Kapazität durch einen höheren Widerstand auszugleichen.

arneeee:
.....
Einmal habe ich ein Programm geschrieben, um es auf A1 zu messen. In der zweiten Version habe ich es einfach mit einem guten Multimeter gemessen.
.....

Dann hat dein Programm einen Fehler und dein Multimeter misst falsch.

Ohne besondere Vorkehrungen wird am PWM-Ausgang immer 5 Volt anliegen.
Auf 1 Volt kommst du nicht mit deiner gezeigten Schaltung.
Du kannst mit PWM nicht direkt die Ausgangsspannung ändern.
PWM heißt Puls-weiten Modulation. Da wird nur eine Differenz zwischen 0 und 1 (Keine Spannung und 5 Volt) am Arduino erzeugt. Somit kannst du so keine 1 Volt erreichen. Wie schon geschrieben, ohne weitere Vorkehrungen.

arneeee:
Also es soll später eine sehr geringe Spannung gemessen werden, diese kann auch im negativen Bereich liegen. Das kann der Uno nicht auswerten/lesen.

Du hälst Dich mit Deinen Angaben leider sehr zurück, daß es schwer fällt überhaupt zu helfen. Gib doch mal ein paar Eckpunkte an, also sowas wie den auszuwertenden Spannungsbereich (klein, was ist klein, 100mV, 10mV, 1mV, ...?) An was wird die Spannung gemessen, an einem Sensor, oder einfach so ... erwartete Genauigkeit, ...
Evtl. gibt es ja andere, oder bessere Varianten Dein Ziel zu erreichen, zBsp. ein ADC Range Converter.

Gruß André

Hallo,

wenn man den Sketch formatiert kann man ihn einigermaßen lesen.
Auf jeden Fall macht der Code nicht das was er machen soll.
Er soll ja den PWM Ausgang auf die Spannung einstellen die vom analogen Eingang gelesen wird.
Wenn irgendwann am Eingang 1V anliegen hört er mit der Änderung am Ausgang auf.
Genau hier liegt der Fehler. Das verstellen des Ausgangs läuft unabhängig vom lesen des Eingangs.
Das läuft parallel ab. Wenn der Eingang irgendwann 1V liest, dann bleibt der Ausgang dort stehen wo er gerade steht, hat aber nichts mit dem 1V zu tun. Die unpassenden Wertebereiche der Variablen spielen dir auch einen Strich durch die Rechnung.

Was das Multimeter liest hängt vom Multimeter ab. Meines zeigt mit analogWrite 51 jedenfalls auch knapp 1V an. Ohne True RMS. Allerdings ist es keine Gleichspannung. Das muss man wissen.

Hallo,

so könnte das aussehen. Nun liegt es an dir ob du einen Tiefpass nachschaltest oder damit einen DAC befeuerst.
Mit Tiefpass wirst du allerdings nie eine glatte Gleichspannung haben. Empfehlung geht klar zum DAC.

// Arduino Mega2560

const byte pin_Sensor = A2;
const byte pin_Output = 9;

unsigned int raw_analogIn;
float voltage;

bool kalibriert = false;

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

void loop() {

  if (!kalibriert)
  {
    read_analogIn(pin_Sensor, 50);             // aller 50ms messen
    out_analog_pwm(pin_Output, raw_analogIn);
    Wertnachfuehrung(0.99, 1.01);             // min, max
    serieller_Monitor(500);                   // Ausgabe aller 500ms
  }
       
}

void Wertnachfuehrung(float min, float max)
{
  voltage = (5.0/1024*raw_analogIn);
  
  if (min < voltage && voltage < max) { 
    kalibriert = true;
    serieller_Monitor(1);
    Serial.println("fertig");
  }
}


void out_analog_pwm(const byte pin, unsigned int target)
{
  analogWrite(pin, target/4); 
}


void read_analogIn (const byte pin, unsigned long interval)
{
  static unsigned long last_ms = 0;
  unsigned long ms = millis();
  
  if (ms - last_ms >= interval)
  {
    last_ms = ms;
    raw_analogIn = analogRead(pin);
  }
}


void serieller_Monitor (unsigned long interval)
{
  static unsigned long last_ms = 0;
  unsigned long ms = millis();
  
  if (ms - last_ms >= interval)
  {
    last_ms = ms;
    Serial.print(raw_analogIn); Serial.print('\t');
    Serial.print(raw_analogIn/4); Serial.print('\t');
    Serial.print(voltage); Serial.print('V');
    Serial.println();
  }
}

Ein PWM Signal ist ein getaktetes Digitalsignal wo die 5V immer wieder ein und ausgeschaltet wird. Ein Digitalmultimeter mißt irgendeinen Mittelwert, ein True RMS Multimeter müßte den Effektivwert (Quadratischer Mittelwert) messen.

Durch ein RC Glied kann diese Rechteckspannung geglättet werden. Diese wird aber nie 100% ohne Wechselspannung überlagert sein.

Eine schöne glatte Gleichspannung erreichst Du nur durch einen DAC.

Aber

Also es soll später eine sehr geringe Spannung gemessen werden, diese kann auch im negativen Bereich liegen. Das kann der Uno nicht auswerten/lesen.

Erzähl uns mal was Du genau machen willst. Wahrscheinlich finden wir zusammmen eine bessere Lösung.

Grüße Uwe