-         

+ Antworten
Ergebnis 1 bis 6 von 6

Thema: Spannungsmessen ergibt falschen Wert?

  1. #1

    Spannungsmessen ergibt falschen Wert?

    Anzeige

    Hallo zusammen,

    ich bin neu hier im Forum und was Microcontroller angeht noch absoluter Anfänger. Ich bastle bereits seit einigen Tagen mit einem Arduino Einsteigerset herum und hatte auch schon so meinen ein oder anderen Erfolg damit.

    Jetzt versuche ich mit dem Arduino eine externe Spannung zu messen, im aktuellen Fall die Gesamtspannung eines 4-Mignon Akkupacks (ca 5,2 Volt). Im Internet habe ich eine Möglichkeit gefunden die aktuelle Betriebsspannung zu messen (readVCC), aus dieser (Referenzspannung) berechne ich dann die gemessene Spannung. Um den Controller nicht zu beschädigen arbeite ich mit einem Spannungsteiler, die Messpannung sollte dann also 2,6V ergeben (Mit Mulimeter nachgemessen). Der Controller misst jedoch nur eine Spannung mit 2,0V. Ist es falsch die gemessene Vcc als Referenzspannung in der Berechnung zu nutzen?

    Hier mein Code:

    Code:
    int Betriebsspannung = 0;
    int Messspannung = 0;
    int ADC0=0; 
    
    void setup() {
      Serial.begin(9600);
    }
    
    void loop() {
      Betriebsspannung = readVcc(); //Millivolt
      Messspannung = readInput0();
      Serial.print("Betriebsspannung: ");
      Serial.print(Betriebsspannung);
      Serial.println(" Volt");
      Serial.print("Messspannung: ");
      Serial.print(Messspannung);
      Serial.println(" Volt");
      Serial.println("");
      delay(1000);
    }
    
    int readInput0()
    {
      int Ergebnis1024 = analogRead(ADC0);
      int Ergebnis = Betriebsspannung / 1024 * Ergebnis1024;
      return Ergebnis;
    }
    
    //Funktion zum Auslesen der Betriebsspannung Vcc des Controllers
    int readVcc() {
      int Ergebnis; //Variable für Millivolt
      // Lesen der 1.1V Referenz gegen AVcc
      ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
      delay(2); // Wartet bis Vref abgeglichen ist
      ADCSRA |= _BV(ADSC); // Umwandeln
      while (bit_is_set(ADCSRA,ADSC));
      Ergebnis = ADCL;
      Ergebnis |= ADCH<<8;
      Ergebnis = 1126400L / Ergebnis; // Back-calculate AVcc in mV
      return Ergebnis;
    }
    Vielen Dank!

  2. #2
    Hallo nochmal,

    ich bin jetzt nach langem rumprobieren und manuellem nachrechnen drauf gekommen dass es so funktioniert:

    Code:
    int readInput0()
    {
      long Ergebnis1024 = analogRead(ADC0);
      return Betriebsspannung * Ergebnis1024 / 1024;
    }

    So funktioniert es jedoch NICHT: (2,12V statt 2,54V)
    Code:
    int readInput0()
    {
      long Ergebnis1024 = analogRead(ADC0);
      long Ergebnis = Betriebsspannung / 1024 * Ergebnis1024;
      return Ergebnis;
    }
    Kann mir das jemand erkläen?!
    Geändert von Schmiddi (01.09.2012 um 16:16 Uhr)

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    23
    Beiträge
    1.532
    Hi,

    ich selbst behersche zwar kein C (nur in Grundzügen), aber ich denke es liegt daran, dass du im zweiten Beispiel erst dividierst und dann multiplizierst, dadurch verlierst du Auflösung

    Gruß
    Chris

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.125
    Du solltest auch noch bedenken, dass long ein ganzzahliger Datentyp ist. Und damit keine Kommazahlen aufnehmen kann. Bei der Rechenoperation die du durchführst kommt allerdings mit recht hoher Wahrscheinlichkeit meistens eine Kommazahl raus. (Die Nachkomma stelle wird abgeschnitten)

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    891
    Da gibt es auch noch das Ding mit der Auswertung von Ausdrücken. Die beiden Varianten sind für mich uneindeutig, weil eine Klammerung fehlt, die den Zähler vom Nenner trennt, sprich: den Buchstrich erkennbar macht.
    Wenn man z.B. den Ausdruck a / b * c (mit a, b, c ganzzahlig positiv) von links mit dem Taschenrechner auszurechnen beginnt, so wird das Ergebnis mit wachsendem c ebenfalls größer. Fängt man dagegen rechts mit der Auswertung an (das ist bei Programmiersprachen bzw. deren Compilern nicht unüblich), so wird das Ergebnis mit wachsendem c immer keiner!
    Geändert von RoboHolIC (03.09.2012 um 22:53 Uhr) Grund: Denkfehler wieder getilgt

  6. #6
    @RoboHolIC: Daran hatte ich gar nicht gedacht, ich bin tatsächlich davon ausgegangen dass von links nach rechts gerechnet wird, interessanter Aspekt!

    @shedepe: Das war mir soweit schon klar, ich hatte das ganze davor auch schon mit float getestet. Da es sich hier im mV handelt habe ich die Nachkommastellen vernachlässigt.

    Ok, jetzt hab ich das ganze soweit kapiert und mein Programm funktioniert nun bestens.

    Vielen Dank für eure Antworten!

+ Antworten

Ähnliche Themen

  1. Taster6 (K1) liefert falschen Wert
    Von ea im Forum Asuro
    Antworten: 1
    Letzter Beitrag: 22.04.2009, 13:47
  2. uint8_t[4] -> float ergibt komische Rundungen
    Von PCMan im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 10.01.2009, 11:31
  3. DCF77 Config ergibt immer HIGH-PEGEL am INPUT-PIN ??
    Von tc-maxx im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 11
    Letzter Beitrag: 03.01.2009, 18:55
  4. Taster gibt falschen Wert
    Von HAWK-Matze im Forum Asuro
    Antworten: 6
    Letzter Beitrag: 29.12.2007, 12:48
  5. Variable enthält falschen Wert
    Von contrero im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 14.09.2007, 09:15

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •