analogRead Wert springt sehr stark

(deleted)

(deleted)

Z3thos:
Mein Sketch sieht wie folgt aus. …

Ich habe den mal in Code-Tags gefasst:

void setup() {
 // Serial nur für Testmodus
 Serial.begin(9600);
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
}
int Voltage = 0;

void loop()

{
 int Eingang = analogRead(A0);
 //Serial.println(Eingang);
 float Voltage = Eingang  ;
 Serial.println(Voltage);
 delay (100);
 if (Voltage >= 00.00 && Voltage <= 12.00) {
   digitalWrite(2, LOW);
   digitalWrite(3, LOW);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
   digitalWrite(6, LOW);
   digitalWrite(7, LOW);
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
 } else if (Voltage >= 12.01 && Voltage <= 12.60) {

   digitalWrite(2, HIGH);
   digitalWrite(3, LOW);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
   digitalWrite(6, LOW);
   digitalWrite(7, LOW);
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
 } else if (Voltage >= 12.61 && Voltage <= 13.20) {
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
   digitalWrite(6, LOW);
   digitalWrite(7, LOW);
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
 } else if (Voltage >= 13.21 && Voltage <= 13.80) {
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, HIGH);
   digitalWrite(5, LOW);
   digitalWrite(6, LOW);
   digitalWrite(7, LOW);
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
 } else if (Voltage >= 13.81 && Voltage <= 14.40) {
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, HIGH);
   digitalWrite(5, HIGH);
   digitalWrite(6, LOW);
   digitalWrite(7, LOW);
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
 } else if (Voltage >= 14.41 && Voltage <= 15.00) {
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, HIGH);
   digitalWrite(5, HIGH);
   digitalWrite(6, HIGH);
   digitalWrite(7, LOW);
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
 } else if (Voltage >= 15.00 && Voltage <= 15.60) {
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, HIGH);
   digitalWrite(5, HIGH);
   digitalWrite(6, HIGH);
   digitalWrite(7, HIGH);
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
 } else if (Voltage >= 15.61 && Voltage <= 16.20) {
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, HIGH);
   digitalWrite(5, HIGH);
   digitalWrite(6, HIGH);
   digitalWrite(7, HIGH);
   digitalWrite(8, HIGH);
   digitalWrite(9, LOW);
 } else if (Voltage >= 16.21 && Voltage <= 16.80) {
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, HIGH);
   digitalWrite(5, HIGH);
   digitalWrite(6, HIGH);
   digitalWrite(7, HIGH);
   digitalWrite(8, HIGH);
   digitalWrite(9, HIGH);}
}

Ich benutze den Analogeingang eines Unos, um via 2 MOhm-Poti die Spannung eines Blei-Gel-Akkus zu überwachen. Das funktioniert soweit ich das bislang überblicke sehr gut. Wobei mir die erste Ziffer nach dem Komma genügt. Ungewöhnliche Sprünge sind mir dabei noch nicht aufgefallen.

Gruß

Gregor

PS: Evtl. hilft es, den Verlauf des Ladens/Entladens mal zu loggen und z. B. mit gnuplot ein Diagramm daraus zu machen. Mir helfen solche Visualisierungen immer wieder dabei, Zusammenhänge und Abläufe zu verstehen oder eine Änderung bewerten/beurteilen zu können. Wie das mit einem Netz- bzw. Ladegerät aussehen kann, das eine Strombegrenzung hat, habe ich mal hier zusammengeschrieben.

(deleted)

Gibt es eigentlich für die Benutzung der Widerstände
am Analogeingang eine Art " Obergrenze " ?
Mir schwirrt im Hinterkopf, dass da irgendwas
"geladen werden muss" ? (Oder werf ich das jetzt mit
dem Paddle-Eingang alter Rechner durcheinander?)

Stefan

(deleted)

Z3thos:
Da bin ich mir Halt auch nicht sicher... kann sein das meine Widerstände zu hoch dimensioniert sind?

IMO kaum. Mein Blei-Gel-Akku hat eine Nennspannung von 12 V und das Poti als Spannungsteiler ist ein 2 MOhm-Spindeltrimmer.

Gruß

Gregor

Der Spannungsteiler kann zu hoch sein (max ca 10kOhm). Dem kann man abhelfen indem men einen 0,1µF Kondensator paralell zum Eingang auf Masse schaltet.

Ich glaub es Dir daß die Akkuspannung konstant ist.
Ist es aber auch dei Versorgungsspannnung des Arduino (5V)? Diese wird nämlich normalerweise als Referenz genommen und wenn diese wegen höheren Stromverbrauch einbricht dann ist die Analogmessung falsch. Nimm die interne 1,1V Referenz oder die 3,3V auf AREF Pin als externe Referenz.
https://www.arduino.cc/en/Reference/AnalogReference

Grüße Uwe

Deine Messwerte schwanken zwischen 476 und 487, also ca. 2,3 Prozent. Das ist viel.

Wie sauber ist dein Versuchsaufbau? Geloetet, gesteckt, fliegend verdrahtet? Ich denke, dass Problem ist bei der Hardware zu suchen.

kulturbereicherer:
Besorg dir so ein Konstantstrom Bauteil z.B. MCP1525-I/TO für 2,5V oder andere um mit dem den Analog Referenz Pin füttern. Dann wird der Spaß genauer. Und dann eben noch falls nötig mitteln. z.B. 10mal messen und davon den Durchschnitt.

1: Erst die interne Referenz ausnutzen.
Wenn es dann nicht reicht, eine externe.
Aber auch erst dann

2: Wie Uwe schon sagte: Möglichst niederohmig rein, zur Not mit einem Kondensator stützen.
Besser: Impedanzwandler einsetzen.

3: ADC im Sleep einsetzen.

4: Oversampling

Ich habe hierzu ein 12V Netzteil über den Spannungsteiler angehängt und bekomme folgende Werte:

Messbereich besser ausnutzen.

Masse vom Akku gut verbunden?

Und mit Gnd vom Arduino verbunden?

StefanBoth:
Gibt es eigentlich für die Benutzung der Widerstände am Analogeingang eine Art " Obergrenze " ?
Mir schwirrt im Hinterkopf, dass da irgendwas "geladen werden muss"

Siehe Datenblatt. Der ADC braucht mehrere Takte zur Wandlung (sukzessive Approximation). Also wird ein ein Sample and Hold Kondensator geladen und die Spannung an ihm gemessen. So ist die Mess-Spannung konstant, auch wenn sich die Spannung an der Quelle ändert. Aber nur von der Kondensator auch schnell genug geladen wird. Was nicht der Fall ist wenn Quelle sehr hochohmig ist.

Das ist witzig, nicht viel anders funktioniert es auch bei den alten 8 Bit Rechnern :slight_smile:
Und das ist schon ein paar Tage länger her...

Stefan

(deleted)

Ich habe den Sketch mal um eine Tonne Leerzeilen erleichtert und in Code-Tags gefasst:

/ Led VU Meter Example
// Version 1.0
// Written by James Newbould
// Edited a little by Zero the Geek 08-13-2013
int led[10] = { 6, 7, 8, 9, 10, 11, 12, 13}; // Assign the pins for the leds
int leftChannel = 0;  // left channel input
int left, i;

void setup()
{
for (i = 0; i < 10; i++)  // Tell the arduino that the leds are digital outputs
 pinMode(led, OUTPUT);
 //Serial.begin(9600); // Uncomment to enable troubleshooting over serial.
}

void loop()
{
left = analogRead(leftChannel);  // read the left channel
// Serial.println(left);  // uncomment to check the raw input.
left = left / 50 ;    // adjusts the sensitivity *edit My sensitivity is low because my phone does not have a good amplifier bulit in.
//  Serial.println(left);  // uncomment to check the modified input.
// left = 1500;  // uncomment to test all leds light.
//left = 0;    // uncomment to check the leds are not lit when the input is 0.
 if (left == 0)  // if the volume is 0 then turn off all leds
  {
  for(i = 0; i < 10; i++)
    {
    digitalWrite(led, LOW);
    }
 }
 else
 {
  for (i = 0; i < left; i++) // turn on the leds up to the volume level
   {
    digitalWrite(led, HIGH);
   }

   for(i = i; i < 10; i++)  // turn off the leds above the voltage level
    {
     digitalWrite(led, LOW);
    }
 }
}

Bleibt also nur noch der Versuch mit den anderen Widerständen.

Was hast du gegen den Stützkondensator?
Was gefällt dir an dem nicht?

Wie von Uwe und mir vorgeschlagen, solltest du die interne Referenz nutzen.
Hast du das schon probiert?
Nein!
Warum nicht?

Kann es sein, dass du einen Großteil der Vorschläge einfach ausblendest?

Wenn du irgendeine Antwort, oder Teile davon, nicht verstehst, dann ist Ausblenden nicht ganz so lehrreich wie kundig machen.

gregorss:
Ich habe den Sketch mal um eine Tonne Leerzeilen erleichtert und in Code-Tags gefasst:

Warum tust du das?


for(i = 0; i < 10; i++)

{
    digitalWrite(led, LOW);
    }

Es ist unglaublich Sinnvoll eine LED 10 mal nacheinander aus zu machen.
Oder?
:o Könnte ja sein, dass es die ersten 9 mal schief gehen… :o .

Ich habe mir gerade die Messreihe vom Eingangspost nochmal angeschaut. Für mich sieht das mach einem Kontaktproblem aus.

Mach mal einen Test, wackel an allen Kabeln und schau die die Messwerte dabei an.

combie:
Warum tust du das?

Weil ich derartiges sehr schnell erledige und dabei den Code querlese.

combie:
Es ist unglaublich Sinnvoll eine LED 10 mal nacheinander aus zu machen.
Oder?
:o Könnte ja sein, dass es die ersten 9 mal schief gehen... :o .

Sicher ist sicher, nä!

Gruß

Gregor

Quote from: combie on Today at 17:17:49

Es ist unglaublich Sinnvoll eine LED 10 mal nacheinander aus zu machen.
Oder?
:o Könnte ja sein, dass es die ersten 9 mal schief gehen... :o .

Aber es wirkt doch so elegant :smiling_imp: