Arduino mit DAC als Impuls/Spannungswandler für eine Agilent Messdatenerfassung

Hallo zusammen,

nachdem mir hier bereits bei einem Vorprojekt gut weiter geholfen werden konnte, Versuche ich es jetzt hier nocheinmal mit einem weiteren Problem das darauf aufbaut.

Ich möchte mit einem Agilent 34970A Data Logger eine vielzahl von Sensoren loggen.

Für alle die dergleichen nicht kennen. Vereinfacht gesagt ist das eine Art aufgebohrtes digitales Multimeter mit einer Messkarte. Diese schaltet reium verschiedene Sensoren auf die Spannungs- bzw. Strommessung.

Da der ebfalls vorhanden Impulseingang berreits belegt ist, hab ich für zwei weitere Impulsgebende Durchflusssensoren eine Impuls/Spannungswandler Aufbau umgesetzt.

Das ganze besteht aus einem Arduino Uno der mit 12V versorgt wird und zwei MCP4725 Digital-Analog wandlern.

Der Arduino misst mittles zwei Interrupt-Routinen (fallende Flanke) die Abstände zwischen den Impulsen und die beiden DACs geben eine proportionale Spannung zwischen 0-5V aus.

Soweit funktioniert das auch alles wunderbar. Je nach Durchfluss verändert sich die Spannung am DAC Ausgang und das ganze lässt sich mit dem Handmultimeter auch wunderbar Nachmessen.
Wenn ich einen DAC als einzigen Input an das Agilent anschließe funktioniert alles Tadelos. Der Messeingang ist Dauerhaft aktiv und die Realais schalten nicht. Die Messwerte sind plausibel und konstant.

Nun zu meinem Problem. Sobald ich beide DACs oder einen DAC und mehrere Sensoren mit der Agilent Messdatenerfassung verbinde springt die Ausgangspanung wild hin und her.
Im normalbetrieb schaltet das Agilent mit einem rythmischne klacken zwischen den Messeingängen. Verbinde ich beide DACs (und oder weitere Sensoren) wird daraus ein unregelmäßiges Stottern.

Das ganze lässt sich allerdings nicht immer reproduzieren manchmal funktioniert auch alles Tadellos.
Wenn ich den Arduino Anstelle des 12V Anschlusses über USB betreibe dann funktioniert es gefühlt häufiger aber auch hier kommt es gelegentlich dazu dass die Messwerte Anfangen wild umher zu springen und das Agilent stottert.

Ich bin mit meinem Latein aktuell etwas am Ende. Enige diffuse Ideen.

A) Es hängt irgendwie an der Masseverbindung zwischen Arduino und Agilent?
B) Das Schalten der Eingangsrelais stört irgendwie meine Impuls Zählung?
C) Das Messen der DAC Ausgangsspannung lässt irgendwie meine Versorgungssspannung zusammen brechen?

Kurzfassung:

2x Impulsmessung und Ausgabe als Spannung mit Ardunio + 2x DAC, Messung mit schaltetender Messkarte und Agilent 34970A Data Logger.
Ein einzellner DAC → funktioniert.
Beide DACs oder ein DAC und andere Sensoren gleichzeitig ->funktioniert nicht

Habt ihr eventuell ein paar Tipps für mich.

Vielen Dank und viele Grüße
Saurier

#include <Wire.h>
#include <Adafruit_MCP4725.h>

//Scaling and volume
const float Q_max = 1500; //maximum expected flow in l/h (used for scaling)
const int Q1_min=12;
const int Q2_min=30; //minimal flow that can be detected by the sensor (use for frequenz measurement time out)
const float V1=0.5;
const float V2=0.25; //Volume per puls in dm^3

//DAC output
Adafruit_MCP4725 dac;
const float S_DAC_max = 4095; //maximum input value for the DAC. Output value depends on referenc voltage 
const int DAC1=0x62; // For Adafruit MCP4725A1 the address is 0x62 (default) or 0x63 (ADDR pin tied to VCC)
const int DAC2=0x63;
int S1_DAC = 0;
int S2_DAC = 0; // in put signal for the DAC 

//seriell output
const int U_ref=5000; // reference voltage in mV
int U1=0; 
int U2=0; // Output Voltage of DAC
int Q1=0; 
int Q2=0; //Flow

//periodtime 
volatile long T1 = 0;
volatile long T2 = 0; // time between two pulses in ms
float T1_min,T2_min;  // minimal time between two pulses in ms
long T1_max,T2_max;  // maximum time between two pulses in ms (timeout)
bool first1=true; //flag for first pulse
bool first2=true;
volatile long pulseTime1, pulseTime2;
volatile long lastpulseTime1, lastpulseTime2;

volatile unsigned debounceTime = 30; // used to debounce mechanical switches


void setup() {
  
  T1_min=V1/Q_max*3600*1000; 
  T2_min=V2/Q_max*3600*1000;  // Calculates minimal time between impulses based on maximum flow
  T1_max=V1/Q1_min*3600*1000;
  T2_max=V2/Q2_min*3600*1000; // Calculates maximum time between impulses based on minimum flow that can be detected (timeout)
  

  pinMode(2, INPUT_PULLUP); // Pullup resistors for the input pins are activated, when the sensor close the circuit des signal is pulled low
  pinMode(3, INPUT_PULLUP); 

   
  attachInterrupt(digitalPinToInterrupt(2), pulse1, FALLING); //Interupts the loop when a pulse is detected
  attachInterrupt(digitalPinToInterrupt(3), pulse2, FALLING); //
}

void loop() {
  
  if(T1==0||T1>T1_max){ //Check for zero value or timeout
    S1_DAC=0;
  }
  else{
    if(T1<(millis()-pulseTime1)){ //Measure time between now abd last puls 
      T1=millis()-pulseTime1;
    }
    S1_DAC = T1_min/T1 * S_DAC_max; //calculate input value for DAC

  }
  

  
  if(T2==0||T2>T2_max){
    S2_DAC=0;
  }
  else{
    if(T2<(millis()-pulseTime2)){
      T2=millis()-pulseTime2;
    }
    S2_DAC = T2_min/T2 * S_DAC_max;
  }


////Serrial output
// U1=S1_DAC/S_DAC_max*U_ref;
// U2=S2_DAC/S_DAC_max*U_ref;
// Q1=U1*Q_max/U_ref;
// Q2=U2*Q_max/U_ref;
 

  dac.begin(DAC1);
  dac.setVoltage(S1_DAC, false);

  dac.begin(DAC2);
  dac.setVoltage(S2_DAC, false);
 
}

void pulse1 () //interuption routine 
{
    if((millis() - pulseTime1) > debounceTime) { //used to debounce mechanical switches
      lastpulseTime1 = pulseTime1; 
      pulseTime1 = millis();
      if(first1==true){
        T1=0;
        first1=false;
      }
      else{
      T1=pulseTime1-lastpulseTime1; //sets new pulse time
        if(T1<T1_min){  //checks if pulse time is smaller than minimal pulse Time
          T1=T1_min;
        }
      }
    }
}

void pulse2 ()
{
    if((millis() - pulseTime2) > debounceTime) { //used to debounce mechanical switches
      lastpulseTime2 = pulseTime2; 
      pulseTime2 = millis();
      if(first2==true){
        T2=0;
        first2=false;
      }
      else{
      T2=pulseTime2-lastpulseTime2; //sets new pulse time
        if(T1<T2_min){  //checks if pulse time is smaller than minimal pulse Time
          T2=T2_min;
        }
      }
    }
}

Klar können wir auch hier Tipps geben.

Allerdings benötigen wir dazu ein Schaltbild, wie du alles angeschlossen hast und deinen Sketch.
Poste bitte beides hier direkt im Forum.

Alles klar Sketch hab ich editiert, schaltbild Folgt sobald ich eins erstellt habe :smiley:

saurier:
Alles klar Sketch hab ich editiert, schaltbild Folgt sobald ich eins erstellt habe :smiley:

Ok, prima und danke.

Schaltbild ist angehängt.
Ist tatsächlich mein erstes Schaltbild das ich erstellt habe, also habe ich vermutlich gegen sämtliche Konventionen der Elektrotechnik verstoßen. Ich hoffe mann erkennt trotzdem was gemeint ist.

Niemand eine Idee?

Wenn die Spannungseingänge hochohmig genug sind, können die keine Störungen verursachen.
Das Klicken der Reläis würde auch einen einzelnen DAC stören.

Also bleibt eigentlich nur Deine Verkabelung als Fehlerquelle.