postmaster-ino:
Dann ist die Batterie aber falsch herum
Der PLUS hat den langen Strich, der Minus den Kurzen.
Darauf werde ich in der Zukunft achten, versprochen!
SpaghettiCode:
Und noch die Frage, ob es nur um den 12V Akku geht, oder hängt da noch ein ganzes Auto dran? Falls letzteres, dann dürfte ein LM 1117 ziemlich schnell "dicke Backen" machen.
nach meiner Recherche wird es in einem KFZ ein oft ein USB-Ladegerät empfohlen.
Das werde ich so umsetzen, also LM 1117 bleibt in der Verpackung.
Wohnmobil von meinem Freund hat 2x 12V Batterien, die Wohnzellen-Batterie wird beim laufendem Motor
nicht geladen, nur durch extern ~220V, nach drei Tagen angeln hatte er kein "Saft" mehr, und die Saftschüssel
war natürlich ausgefahren, Schach & Matt :), als Option wird die Haupt-Batterie auch überwacht
und weckt den Besitzer, wenn`s sein muss bei Nacht.
(hey, der obere Satz reimt sich sogar, Gott sei dank, es war noch ein Angler da.)
SpaghettiCode:
@ postmaster-ino, Deine Aussage ergibt erst mit #117 Sinn, da sub7 in #108 von einer Referenz von 5.0V ausgeht, und die 1.1V Referenz nicht erwähnst.
Sorry dass ich mein Vorhaben nicht bis ins Detail beschrieben habe, 1.1V Referenz soll etwas genauer sein und ich habe nur den Analogen Port schützen wollen (max 5V).
Wenn ich jetzt die interne 1.1V Referenz ansprechen will spielen den die Widerstände vor dem A0 eine Rolle?
ja, die Stabilität der 1.1V Referenz ist höher, der genaue Wert muss aber ausgemessen werden.
Bei meinen Arduino-Clones liegen die eigentlich alle bei 1.07V bis 1.08V.
Die Widerstände vor dem A0 bilden einen Spannungsteiler, und sorgen dafür, daß Du auch höhere Spannungen als 5V messen kannst. Du brauchst aber einen Spannungsteiler, mit dem Du Deine ~ 12V mit der 1.1V Referenz messen kannst.
Du musst also einen Spannungsteiler wählen, bei dem Du am A0 immer unter Deinem Referenzwert (~ 1.1V) bleibst.
Mit zum Beispiel "oben" 15 KOhm und "unten" 1kOhm stehen über dem 1kOhm immer 1/16tel Deiner zu messenden Spannung, und bis mindestens 15V sollte Dein Spannungsteiler reichen.
Ein Analogengang verträgt immer die Versorgungsspannung zB 5V unabhängig von der gewählten Referenzspannung.
Wenn ich 1,1V Referenz wähle und die 12V mittels Spannungsteiler auf 1,1 reduziere. Die nominelle Ladeschlußspannug eines Bleiakkus liegt im Bereich 13,8 - 14,5V. Der Spannungsteiler muß auf diese Spannung dimensioniert sein und nicht auf 12V .
Nehmen wir mal an, ich dimensioniere den Spannungsteiler 14,5V auf 1,1V dann habe ich noch eine Reserve von 1,1V bis 5V für die Überspannung. Damit ich auf 5V komme brauche ich am Eingang des Spannungsteilers fast 66V. Das bringt schon mal eine gute Sicherheit. Eine Z-Diode von 4,7V - 5,1V zusätzlich, gibt weitere Sicherheit.
mit einem Widerstand von 22kOhm "oben" und 1kOhm "unten" hättest Du an A0 genau 1/23stel der Eingangsspannung.
Das wären im Beispiel für eine 1.1V Referenz 25.3V Vollausschlag (1.1V Referenz * 23), das lässt sich noch optimieren (15-16V)
Ich messe meine 1.1V Referenzen wie von Tommy vorgeschlagen.
Ich messe meine Referenz eigentlich gar nicht - ich gebe über Spannungsteiler eine bekannte (extern gemessene) Spannung auf den analog-IN und schaue, Was Der liefert - Das wird im Programm eingetragen und schon errechne ich die Spannung, Die am Spannungsteiler anliegt.
MfG
PS: Die 1,1V x 23 - die 23 ergibt Sich aus (1,1V x (obere Widerstand + untere Widerstand) : untere Widerstand - hier also 1,1 x (22k+1k) : 1k.
Wenn der untere Widerstand nicht '1' ist und die Größen unterschiedlich, kommt man mit 'zusammenzählen' nicht auf's korrekte Ergebnis.
mit Widerständen 15KΩ und 1KΩ messte ich wie der Tommy56 sagt nur Mist.
Da war nur Arduino`s Versorgungsspannung korrekt.
Heute habe ich 10KΩ und 1KΩ verlötet und siehe da, Abweichung zur der Messung mit Multimeter nur ein Zehntel Volt.
Getestet mit: 6V Block, 9V Block und PKW Batterie 12V
Danke für eure Tipps, Ihr seid KLASSE! ;D
PS: Natürlich teile ich auch den Code mit Euch (was viele nach der Problemlösung nicht machen).
// Values that you may need to adjust.
// Voltage divider capacitor at plus R1 (row 8) and R2 (row 9) at minus.
// In this example I use pin A0 (row 14)
//
// Regards Sub7
const float typVbg = 1.080; // 1.0 -- 1.2
const float R1 = 10150; // 10K
const float R2 = 1000; // 1K
float Vcc = 0.0;
float VoltResult = 0.0;
float MaxVoltage = 0.0;
#define A_PIN 0
#define COUNT 5
void setup() {
Serial.begin(9600);
analogReference(DEFAULT);
delay(100);
MaxVoltage = Vcc / (R2 / (R1 + R2));
analogWrite(A_PIN, 0);
}
void loop() {
Vcc = readVcc();
VoltResult = getVolt(A_PIN, R1, R2);
delay(5000);
}
float readVcc() {
byte i;
float result = 0.0;
float tmp = 0.0;
for (i = 0; i < 5; i++) {
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0);
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
ADMUX = _BV(MUX3) | _BV(MUX2);
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif
delay(3); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Start conversion
while (bit_is_set(ADCSRA,ADSC)); // measuring
uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
uint8_t high = ADCH; // unlocks both
tmp = (high<<8) | low;
tmp = (typVbg * 1024.0) / tmp;
result = result + tmp;
delay(5);
}
result = result / 5;
return result;
}
float getVolt (int input, float R1, float R2)
{
float curVoltage = 0.0;
float VoltResult = 0.0;
for (int i = 0; i < COUNT; i++) {
curVoltage = curVoltage + analogRead(input);
delay(10);
}
curVoltage = curVoltage / COUNT;
float v = (curVoltage * Vcc) / 1024;
VoltResult = v / (R2 / (R1 + R2));
Serial.print("Versorgungsspannung = ");
Serial.println(Vcc, 3);
Serial.print("Spannung am Pin ");
Serial.print(input);
Serial.print(" = ");
Serial.println(VoltResult, 3);
Serial.println("");
analogWrite(input, 0);
return VoltResult;
}