Messgerät bis 16 und 45 Volt DC

Benutzeravatar
Admin
Administrator
Beiträge: 13
Registriert: Mo 20. Apr 2020, 09:47
Kontaktdaten:

Re: Messgerät bis 16 Volt DC

Beitrag von Admin »

Ich habe meine neuen 0,1% Bauteile bekommen und auch gleich eine neue und erweiterte Zusatzplatine damit gebaut. Die beiden Unterschiede zur alten Platine ist die Genauigkeit der Referenzspannungs - Platine und ein erweiterter Spannungsteiler der nicht nur 10KOhm zu 30KOhm hat, sondern auch noch 10KOhm zu 100KOhm. Damit geht dann auch ein 0 - 45 Volt Messbereich. Ich muss mal noch den Schaltplan machen mit der Erweiterung machen, dass ich ihn hier reinstellen kann. Aber ich merke gerade, heute bin ich zu müde dazu. :sad: :sad:

Ich verschiebe das auf Morgen. Dann kann ich auch berichten wie das Ergebnis ausgefallen ist. Mal schnell noch die Kurzfassung. Im Bereich 0-16 Volt hat sich das Ergebnis verbessert, im Bereich 0-45 Volt bin ich recht unzufriede. Aber morgen mehr.

Gute Nacht
Franz

Benutzeravatar
Franz54
Beiträge: 43
Registriert: Mo 20. Apr 2020, 10:12
Wohnort: 82377 Penzberg
Kontaktdaten:

Re: Messgerät bis 16 Volt DC

Beitrag von Franz54 »

Ich habe natürlich damit wieder meine Test´s gemacht und bin mit dem Messberreich 0-16 Volt seeeehr zufrieden.
Aber dann habe ich den 0-45 Volt Messeingang benutzt, das gefällt mir überhaupt nicht. Ich habe natürlich auch die Umrechnung auf diesen Teiler in der Software angepasst. Man sieht auf der Schaltung dem 100KOhm Messeingang oberhalb dess 30KOhm Messeingang.
Da ist das Messergebnis nicht zwei Stellen hinterm Komma um höchstens 1-2 Zähler falsch, sondern es ist an der ersten Stelle hinterm Komma schon um 1-2 Zähler falsch. UND der Fehler geht nicht über den ganzen Spannungsbereich gleichmässig in der selben Abweichung, dann wäre es ja rel. einfach, sondern wenn ich korrekt umrechne wird der Messfehler nach oben hin kleiner. Wenn ich die Umrechnung anpasse, dass der Fehler im Unteren Bereich weg ist, dann stellt er sich nach oben hin immer deutlicher ein. Wo muss ich den Grund für diese Abweichung suchen? Ich finde gerade keinen Ansatz. Der Unterschied ist ja nur, dass im Spannungsteiler der 30KOhm Widerstand gegen einen 100KOhm ersetzt wird.

Hier ist noch der Code. Gleich oben im LOOP sind die zwei Zeilen, die ich im Moment noch austausche, je nachdem, was ich für einen Messteiler teste.

Code: Alles auswählen

#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

const byte ANALOG_PIN = A0; // Hier wird der Name vom Messeingang festgelegt
float max31 = 0;      // Der Speicher für den ausgelesenen Analogwert vom Messbuchse
float max31alt = 0;
float max32 = 0;       // Der Speicher für den ausgelesenen Max-Analogwert vom ADC
float min31 = 0;      // Der Speicher für den ausgelesenen Analogwert vom Messbuchse
float min31alt = 1023;
float min32 = 0;       // Der Speicher für den ausgelesenen Max-Analogwert vom ADC
float durchschnitt = 0;
unsigned long startzeit = 0;
unsigned long endzeit = 0;
unsigned long Sekundenablauf01 = 0; // Messung erneuern nach eine Sekunde
const unsigned long Pausezeit01 = 1000;
//====================================================================================
void setup(void) {
  analogReference(EXTERNAL); // Externe Referenzspannung am AREF 4,096Volt
  Serial.begin(9600);

  pinMode(ANALOG_PIN, INPUT); // Input vom Messteiler
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  // Display Maxwert
  lcd.setCursor (0, 0);
  lcd.print (F("Maximalwert"));
  lcd.setCursor (18, 0);
  lcd.print (F("V"));
  // Display Minwert
  lcd.setCursor (0, 1);
  lcd.print (F("Minimalwert"));
  lcd.setCursor (18, 1);
  lcd.print (F("V"));
  // Display Durchschnitts Wert
  lcd.setCursor (0, 2);
  lcd.print (F("Normalwert"));
  lcd.setCursor (18, 2);
  lcd.print (F("V"));
}
//===================================================================================
void loop(void) {
  //--------------------------Startzeit für den Laufzeittest-----------------------------------------------
  startzeit = micros();

  //-----------------------Nach einer Sekunde neue Messung starten-----------------------------------------
  if (millis() - Sekundenablauf01 >= Pausezeit01) {
    //max32 = ((max31alt * 44) / 1000); // 0-1023 x 0,044 für 45 Volt
    max32 = ((max31alt * 16) / 1000); // 0-1023 x 0,016 für 16 Volt
    lcd.setCursor (13, 0);
    lcd.print (F("     "));
    lcd.setCursor (13, 0);
    lcd.print (max32);
    max31alt = 0;
    //min32 = ((min31alt * 44) / 1000); // 0-1023 x 0,044 für 45 Volt
     min32 = ((min31alt * 16) / 1000); // 0-1023 x 0,016 für 16 Volt
    lcd.setCursor (13, 1);
    lcd.print (F("     "));
    lcd.setCursor (13, 1);
    lcd.print (min32);
    min31alt = 1023;
    lcd.setCursor (13, 2);
    lcd.print (F("     "));
    lcd.setCursor (13, 2);
    durchschnitt = (max32 - min32) / 2;
    if (max32 == min32) {
      durchschnitt = 0;
    }
    lcd.print (durchschnitt);
    Sekundenablauf01 = millis();
    //Serial.println(F("Datenausgabe aufs Display"));
  }
  // -----------------------------Max- und Minwert messen und Maxwert sichern----------------------
  max31 = analogRead (ANALOG_PIN); // Analogen Eingang A0 auslesen
  min31 = max31;
  if (max31 >= max31alt) {
    max31alt = max31;
  }
  // -----------------------------Minimalwert sichern----------------------------------------------
  if (min31 <= min31alt) {
    min31alt = min31;
  }
  // -----------------------------------Laufzeittest----------------------------------------------
  endzeit = micros();
  //Serial.println(endzeit - startzeit);
}

Ich stelle mit übrigens vor, alles noch ein wenig umzubauen. Ich möchte den 16 Volt Eingang lassen wie er ist, aber den 45 Volt Eingang auf den A1 Pin verlegen. Der bekommt dann eben einen eigenen Spannungsteiler (10K & 100K) und eine eigene Schutzdiode. Das wäre schon mal der geänderte Plan.
Arduino UNO Messgerät 16 + 45 Volt.JPG
Dann kann ich in der Software einfach nur schauen, ob auf dem A0 oder dem A1 Eingang Spannung anliegt, und die Umrechnung automatisch anpassen. Also immer wenn Spannung auf A0 anliegt, die Umrechnung "min32 = ((min31alt * 16) / 1000);" verwenden und wenn die Spannung auf A1 anliegt, die Umrechnung "min32 = ((min31alt * 44) / 1000); verwenden. Und in der vierten Zeile vom Display zeige ich an, welche Max Spannung gerade aktiviert ist. Also bei Spannung an A0 = Max 16 Volt, und bei Spannung an A1 = Max 45 Volt.

Aber erst mal brauche ich eine Lösung für die Abweichung im höheren Messbereich.
Wenn ich dort die Umrechnung auf "min32 = ((min31alt * 446) / 10000);" ändere, bin ich im unteren Bereich super genau, aber nach oben hin wirds immer ungenauer.
Eigentlich ist aber die 44 in der Umrechnung schon richtig.
4,096 Volt x 11 = 45,0560 / 1024 = 0,0440

Franz
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Franz54 am Fr 17. Jul 2020, 09:14, insgesamt 1-mal geändert.

Benutzeravatar
Franz54
Beiträge: 43
Registriert: Mo 20. Apr 2020, 10:12
Wohnort: 82377 Penzberg
Kontaktdaten:

Re: Messgerät bis 16 und 45 Volt DC

Beitrag von Franz54 »

O.K. das mit der Abweichung passt. Das war wärend des Suchens plötzlich weg. Ich fürchte da war ein Steckkabel nicht soooo toll verbunden. Eine andere Abweichnung über die ganze Länge des 45 Volt Einganges konnte ich korrigieren, inden ich beim Auslesewert vom Analogen Pin ein Digit dazu adiere. Alles ist gut.
Und hier ist auch noch gleich das neue Programm, dass erkennt auf welchen Analogen Eingang die Messspannung kommt. A0 ist bis 16 Volt, A1 ist bis 45 Volt. Das gehört zu dem Schaltplan im Beitrag darüber!!

Franz :(V):

Benutzeravatar
Franz54
Beiträge: 43
Registriert: Mo 20. Apr 2020, 10:12
Wohnort: 82377 Penzberg
Kontaktdaten:

Re: Messgerät bis 16 Volt DC

Beitrag von Franz54 »

Ich habe gestern nach den Tests noch ein paar Fehler entfernt. Aber jetzt sollte das Programm so gut sein.

Code: Alles auswählen

#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

const byte ANALOG_PIN16 = A0; // Hier wird der Name vom Messeingang 0-16 Volt festgelegt
const byte ANALOG_PIN45 = A1; // Hier wird der Name vom Messeingang 0-45 Volt festgelegt
float max31 = 0;      // Der Speicher für den ausgelesenen Analogwert vom Messbuchse
float max31alt = 0;
float max32 = 0;       // Der Speicher für den ausgelesenen Max-Analogwert vom ADC
float min31 = 0;      // Der Speicher für den ausgelesenen Analogwert vom Messbuchse
float min31alt = 1023;
float min32 = 0;       // Der Speicher für den ausgelesenen Max-Analogwert vom ADC
float durchschnitt = 0;
unsigned long startzeit = 0;
unsigned long endzeit = 0;
unsigned long Sekundenablauf01 = 0; // Messung erneuern nach eine Sekunde
const unsigned long Pausezeit01 = 1000;
byte messeingang = 0;
byte messeingangalt = 0;
int eingang = 0;
//====================================================================================
void setup(void) {
  analogReference(EXTERNAL); // Externe Referenzspannung am AREF 4,096Volt
  Serial.begin(9600);

  pinMode(ANALOG_PIN16, INPUT); // Input vom Messteiler 16V
  pinMode(ANALOG_PIN45, INPUT); // Input vom Messteiler 45V
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  // Display Maxwert
  lcd.setCursor (0, 0);
  lcd.print (F("Maximalwert"));
  lcd.setCursor (18, 0);
  lcd.print (F("V"));
  // Display Minwert
  lcd.setCursor (0, 1);
  lcd.print (F("Minimalwert"));
  lcd.setCursor (18, 1);
  lcd.print (F("V"));
  // Display Durchschnitts Wert
  lcd.setCursor (0, 2);
  lcd.print (F("Normalwert"));
  lcd.setCursor (18, 2);
  lcd.print (F("V"));
  lcd.setCursor (0, 3);
  lcd.print (F("Messeingang bis "));
}
//===================================================================================
void loop(void) {
  //--------------------------Zeit für die Durchlaufmessung------------------------------------------------
  startzeit = micros();

  //------------------------------Messeingang bestimmen----------------------------------------------------
  if (millis() - Sekundenablauf01 >= Pausezeit01) {
    messeingang = 0;
    eingang = analogRead (ANALOG_PIN16); // Analogen Eingang A0 auslesen
    if (eingang >= 30) {  // Ist A0 größer 0,5 Volt dann als Eingang markieren
      messeingang = 1;
      messeingangalt = 1;
      lcd.setCursor (16, 3);
      lcd.print (F("  "));
      lcd.setCursor (16, 3);
      lcd.print (F("16V"));
    }
    eingang = analogRead (ANALOG_PIN45); // Analogen Eingang A1 auslesen
    if (eingang >= 11) {  // Ist A1 größer 0,5 Volt dann als Eingang markieren
      messeingang = 2;
      messeingangalt = 2;
      lcd.setCursor (16, 3);
      lcd.print (F("  "));
      lcd.setCursor (16, 3);
      lcd.print (F("45V"));
    }
    if (messeingang == 0) {
      messeingang = messeingangalt;
    }
  }
  //-----------------------Nach einer Sekunde neue Messung starten-----------------------------------------
  if (millis() - Sekundenablauf01 >= Pausezeit01) {
    if (messeingang == 1) {
      max32 = ((max31alt * 16) / 1000); // 0-1023 x 0,016 für 16 Volt
    }
    if (messeingang == 2) {
      max32 = (((max31alt + 1) * 44) / 1000); // 0-1023 x 0,044 für 45 Volt
    }
    lcd.setCursor (13, 0);
    lcd.print (F("     "));
    lcd.setCursor (13, 0);
    lcd.print (max32);
    max31alt = 0;
    if (messeingang == 1) {
      min32 = ((min31alt * 16) / 1000); // 0-1023 x 0,016 für 16 Volt
    }
    if (messeingang == 2) {
      min32 = (((min31alt + 1) * 44) / 1000); // 0-1023 x 0,044 für 45 Volt
    }
    lcd.setCursor (13, 1);
    lcd.print (F("     "));
    lcd.setCursor (13, 1);
    lcd.print (min32);
    min31alt = 1023;
    lcd.setCursor (13, 2);
    lcd.print (F("     "));
    lcd.setCursor (13, 2);
    durchschnitt = max32 / 2;
    if ((max32 - min32) <= 1) {
      durchschnitt = max32;
    }
    lcd.print (durchschnitt);
    Sekundenablauf01 = millis();
    //Serial.println(F("Datenausgabe aufs Display"));
  }
  // -----------------------------Max- und Minwert messen und Maxwert sichern----------------------
  if (messeingang == 1) {
    max31 = analogRead (ANALOG_PIN16); // Analogen Eingang A0 auslesen
  }
  if (messeingang == 2) {
    max31 = analogRead (ANALOG_PIN45); // Analogen Eingang A0 auslesen
  }
  min31 = max31;
  if (max31 >= max31alt) {
    max31alt = max31;
  }
  // -----------------------------Minimalwert sichern----------------------------------------------
  if (min31 <= min31alt) {
    min31alt = min31;
  }
  // -----------------------------------Laufzeittest----------------------------------------------
  endzeit = micros();
  //Serial.println(endzeit - startzeit);
}
Jetzt noch ein Bild von der neuen Anordung im Display. Ich habe ja jetzt zwei Eingänge, 16Volt und 45Volt, und die Software sucht sich selbst den Port aus, auf dem sie ein Signal findet. Der Port wird dann solange für die Messungen verwendet, wie sich keine Änderungen im Eingangssignal ergibt.

Hier das Bild vom Display, indem das Programm den Port bis 16 Volt ausgewählt hat:
.
RechteckSignal über Null Arduino.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
Franz54
Beiträge: 43
Registriert: Mo 20. Apr 2020, 10:12
Wohnort: 82377 Penzberg
Kontaktdaten:

Re: Messgerät bis 16 Volt DC

Beitrag von Franz54 »

Franz54 hat geschrieben:
Fr 10. Jul 2020, 16:08
Ich habe ganz zu Anfang meiner Arduino Arbeit, auch mal eine Software gemacht, die eine anliegende Frequenz auszählt und anzeigt. Jedenfalls für etwa bis 20000Hz. Die werde ich dann auch noch in die Software für das Gerät einbinden. Wenn es Impulse erkennt, dann soll es nach der Spannungsmessung auch noch eine Frequenzmessung machen und das Ergebnis auch aufs Display stellen. Das ist jedenfalls so ein wenig mein Wunschdenken :)
So das Geräte ist ja im Moment auf dem Stand, den ich erreichen wollte. Jetzt wäre es natürlich noch hüpsch, wenn ich diese Idee vom 10.Juli hier auch noch integrieren könnte. Ich habe ja in der Dritten Zeile ein Messergebnis, das die Welt nicht braucht. Naja, jedenfalls meine Welt brauchts nicht :) Dieser Wert "Normalwert" heißt es glaube ich. Da würde sich die Frequenz viel besser machen. Ich denke da muss ich mal sehen, ob ich das noch mit rein bringe.

Aber da muss ich mir noch überlegen ob ich das mit dem Messzeiten noch hin bekomme. Der Arduino hat ja mit den Max/Min Messungen genügend zu tun. Und mit der Frequenzmessung hat er auch gut zu tun. Also kann ich es nicht parallel machen, sondern nacheinander, bzw. abwechselnd.

Ich werde mal das alte Programm rauskramen, mit dem ich die Frequenzmessungen machen konnte. Und auch im www mal suchen, was es da zum Frequenz messen gibt. Dann sehen wir weiter.

Franz

Benutzeravatar
Admin
Administrator
Beiträge: 13
Registriert: Mo 20. Apr 2020, 09:47
Kontaktdaten:

Re: Messgerät bis 16 Volt DC

Beitrag von Admin »

So ich habe jetzt mal das Gerät fertig gemacht. Also auch noch in ein Gehäuse gesteckt und ein ReedRelais mit Umschalter dazu eingebaut. Das heißt ich habe nur noch einen Mess-Eingang für 16 und 45 Volt. Das Gerät startet wenn man einschaltet am großen Eingang, also am 45 Volt Eingang und misst ob eine Spannung kleiner 10 Volt anliegt, dann schatet das Relais den Eingang auf 16 Volt. Wenn die Spannung größer 13 Volt ist, schaltet das Gerät auf den 45 Volt Eingang. Das Material für das fertige Gerät so wie beschrieben wird etwa bei 45,- Euro liegen. Macht also keinen Sinn, ausser man will auch den Lernefekt durch das Baien eines solchen Gerätes. Man kann das Relais weglassen, dann muss man eben 2 Eingangsbuchsen einbauen, für Plus 16 Volt und für Plus 45 Volt. Das Programm ist das selbe. Port D8 bedient dann eben das Relais nicht, da nicht vorhanden. Ansonsten ändert sich da nichts.

Wenn man nur etwa braucht, um die PIN Spannung zu messen, dann kann man wohl besser auf einen kleinen Oszi zurück greifen, der kostet 30,- Euro plus ein SteckerNetzgerät für 5-10 Euro. Damit kann man natürlich deutlich mehr erkennen und hat keine Arbeit damit.

Hier sind noch die Bilder vom Gerät:
Messgerae_45_Volt_fertig.jpg
Messgerae_45_Volt_fertig2.jpg
Arduino UNO Messgerät 16 + 45 Volt mit Relais.JPG
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast