Forum: Analoge Elektronik und Schaltungstechnik Akku Überwachung so machbar ?


von DAVID B. (bastler-david)


Angehängte Dateien:

Lesenswert?

Hallo
Ich möchte ein 1z lipo Akku überwachen und würde gerne den attiny 84/85 
nehmen.
Da die adc ja nur eine ref Spannung messen können kann ich den 85 ja 
nicht so an den Akku hängen die Referenz wäre dann immer null was ja 
klar ist.
Da kam ich auf die Idee ein 3,3 Volt Regler zunutzen geht das so ?

Und kann ich die Formel zum umrechnen der Spannung von 4,9 volt nehmen 
oder muss diese dann auf 3,3 Volt angepasst werden ?

Die Eingänge sind ja 5 Volt Tolerant also sollte es gehen.
Sorgen macht mir eher das ich schon erlebt habe das sich ein ein 
atmega48 den strom zum laufen über seriell Port geholt hat weil ich vcc 
vergessen hatte und damit sogar sauber lief.

Vielen dank.

von Löter (Gast)


Lesenswert?

Das geht so nicht die ADC Eingänge können nicht über VCC messen. Bau 
einen Spannungsteiler ein, sodass ein voller Akku knapp unter VRef 
liegt.
Den 3,3V Regler kannst du weg lassen, spart Strom.

Es geht auch ganz ohne Spannungsteiler, wenn du die Referenzspannung 
andersrum verwendest. D.h. VCC als VRef und dann die Referenz gegen die 
Betriebsspannung messen.

von Horst (Gast)


Lesenswert?

DAVID -. schrieb:
> Da die adc ja nur eine ref Spannung messen können kann ich den 85 ja
> nicht so an den Akku hängen die Referenz wäre dann immer null was ja
> klar ist.

Nö, da hast Du was falsch verstanden.

DAVID -. schrieb:
> Da kam ich auf die Idee ein 3,3 Volt Regler zunutzen geht das so ?

Du brauchst dann einen Spannungsregler mit einer sehr kleinen 
Spannungsdifferenz zwischen Ein- und Ausgang (Low Dropout) und Du kannst 
die Akkus nie benutzen bis sie wirklich leer sind (ok, sollte man auch 
nicht).

DAVID -. schrieb:
> Die Eingänge sind ja 5 Volt Tolerant also sollte es gehen.

Nein, sind sie nicht. Die Eingänge können Vcc+0,5V ab, also in Deinem 
Fall 3,8Volt.

Was Du suchst, ist ein Spannungteiler. Dann nimmst Du die 1,1V oder 
2,56V der internen Referenz und sparst Dir den Spannungsregler.

von THOR (Gast)


Lesenswert?

Und der Spannungsteiler sollte noch nen Pufferkondensator bekommen weil 
die ADC Messung sonst zu ungenau wird.

von DAVID B. (bastler-david)


Lesenswert?

Hmm ok nur (hoffe habe das richtig verstanden) hat der attiny85 mit sein 
8 pins keinen ref pin,
also MUSS ich den ic ja auf eine feste Spannung legen um die Abweichung 
zu messen oder messen diese adc unabhängig von der vcc ?

von Löter (Gast)


Lesenswert?

Lies mal das Datenblatt Kapitel zum ADC, der kann deutlich mehr als du 
denkst!
Eine feste Versorgung ist nicht nötig, bzw. müsste die ja so stabil und 
sauber sein wie eine Referenzspannung, das ist nicht sinnvoll machbar. 
Nutze einfach die interne Referenzquelle.

von DAVID B. (bastler-david)


Lesenswert?

Ok gleich 2 zugaben meiner seits.
Zum ersten hat der attiny 85 sehr woll ein Referenz pin (den habe ich 
aber schon belegen müssen daher nicht gesehen)

Zum 2ten verstehe ich die Funktion des refpins auch nach dem lesen der 
Lektüren und gucken einiger Videos immer noch nicht.

Und Bin jetzt aber zu einer Lösung gekommen, wenn ich das angleichen der 
Spannung nicht hin bekomme.
Muss ich eben VCC auf 7,5 Volt anheben (step up) und dann auf 5 Volt 
regeln (7805) und damit den 85 betreiben dann kann dieser von 4,2 bis 
3,60 sauber messen.

von Toxic (Gast)


Angehängte Dateien:

Lesenswert?

Vom Prinzip her solltest du es so machen wie im Anhang gezeigt.

von DAVID B. (bastler-david)


Lesenswert?

hmm ok vielen dank FRAGE fehlt da nicht VCC ?

von Koepi (Gast)


Lesenswert?

Antwort: Diese geringfügige Transferleistung musst du schon erbringen, 
ob du deinem uC auch eine Versorgungsspannung gönnst oder ob er ohne 
läuft.

von Bernd K. (prof7bit)


Lesenswert?

Die Lösung steht bereits in der ersten Antwort, zweiter Absatz.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

DAVID -. schrieb:
> Zum ersten hat der attiny 85 sehr woll ein Referenz pin

Den brauchst du doch gar nicht. Lies mal Kapitel 17.2 (ADC Overview):
> Internal reference voltages of nominally 1.1V / 2.56V are
> provided on-chip.

Du brauchst also gar keinen Referenz Pin, sondern lediglich eine der 
internen Referenzspannungen und einen Spannungsteiler für das zu 
messende Objekt. Mit z.B. 2,56V Referenz und einem 1:2 Spannungsteiler 
könntest du bis etwa 5,12V messen. Dazu braucht der Tiny auch keinen 
Spannungsregler oder so.

: Bearbeitet durch User
von Löter (Gast)


Lesenswert?

Nimm die Schaltung von Toxic, evtl. mit anderen Widerstandswerten.
Zusätzlich: 100nF Glättung am Spannungsteiler Ausgang, statt 100u lieber 
4,7/10u + 100n am Controller.
Welche LEDs hast du gewählt? Wenn die nur mit ein paar mA laufen kannst 
du sie direkt am Tiny anschließen. Vorwiderstände nicht vergessen.

von Toxic (Gast)


Lesenswert?

DAVID -. schrieb:
> hmm ok vielen dank FRAGE fehlt da nicht VCC ?

Die VCC ist die Betriebsspannung des uCs - also die Batteriespannung.Und 
es ist auch diese Spannung die du messen moechtest.Um diese Messung 
durchfuehren zu koennen,brauchst du eine Referenz und wenn es auf hohe 
Genauigkeit nicht ankommt,bietet sich die Interne an:Vorteil ist 
offensichtlich:Es wird kein externer Pin benoetigt und man spart sich 
einige Bauteile....

Ich habe das Spannugsteilerverhaeltnis so ausgelegt,dass bei 
4.2V(maximale VCC)die Spannung auf ca. 2.56V heruntergeteilt 
wird.Benutzt du die interne 2.56V-Referenzquelle,wird nach der 
A/D-wandlung ein Wert von 1023 ausgegeben und entsprechend geringere 
Werte ,wenn die VCC abfaellt...



Löter schrieb:
> Nimm die Schaltung von Toxic, evtl. mit anderen Widerstandswerten.

Bei den PICs weiss ich,dass der Innenwiderstand der zu messenden 
Spannungsquelle nicht 10K ueberschreiten soll.Mit den gewaehlten 
Widerstaenden kommt man auf ca.4k.
Aber du hast recht: man kann durchaus etwas hoehere Widerstaendswerte 
waehlen.

==============
Soweit ich aus dem Datenblatt entnehmen konnte,ist die interne Referenz 
nicht ganz so flexibel ausgelegt wie die bei den PIcs.Mit entsprechender 
Konfiguration,kann man dort sogar auf den aeusseren Spannungsteiler 
verzichten....

von Bernd K. (prof7bit)


Lesenswert?

Mess doch einfach die Bandgap, dann brauchts überhaupt keinen 
Spannungsteiler und keine externen Pins.

von Toxic (Gast)


Lesenswert?

Bernd K. schrieb:
> Mess doch einfach die Bandgap, dann brauchts überhaupt keinen
> Spannungsteiler und keine externen Pins.

Mit dieser Aussage wird der TO nichts anfangen koennen,da er nach 
eigener Angabe ein generelles Verstaendnisproblem mit VCC/Referenz etc 
hat.
Das beste ist,wenn du ihm/uns eine brauchbare Skizze deines Vorschlages 
praesentierst.

von DAVID B. (bastler-david)


Lesenswert?

mal andere frage zwischen rein wenn der gesamte strom 6 mA über den 10 
kohm widerstand fliesen soll würde dann nicht die Spannung stark 
schwanken wenn ich nur eine LED oder 2 leds ansteuer?
Den die bc547 brauchen doch zum durch schalten um ein 1mA /0,8 volt und 
dann würde sich doch die Spannung ändern und der 85 nur noch müll messen 
oder ?

Danke euch für eure tipps.

von Toxic (Gast)


Lesenswert?

DAVID -. schrieb:
> mal andere frage zwischen rein wenn der gesamte strom 6 mA über den 10
> kohm widerstand fliesen soll

Diese Frage macht mich etwas "stutzig".Wieviel Erfahrung hast du mit 
uCs/Transistoren etc und deren Funktion?
Die Basisstroeme liefert der uC direkt ueber seinen VCC-Pin und den Pins 
die du als Ausgaenge programmiert hast - das hat mit dem 10k-Widerstand 
ueberhaupt nichts zu tun,da dieser nur als "Sensor" fuer die 
Batteriespannung dient.

von Manfred (Gast)


Angehängte Dateien:

Lesenswert?

Toxic schrieb:
> Diese Frage macht mich etwas "stutzig".Wieviel Erfahrung hast du mit
> uCs/Transistoren etc und deren Funktion?

Offenbar Null bis -1000.000. Ich kritzele Deinen Vorschlag mal weiter.

David: In Hellblau die Versorgungsspannung, klarer?

Wenn Deine LEDs nur ein paar wenige mA brauchen, geht das ohne 
Transistor - dazu habe ich LED Q4 umgemalt.

von DAVID B. (bastler-david)


Lesenswert?

ja so ergibt das einen sinn ich habe überlegt wie der ic seinen strom 
ohne vcc aufrecht erhalten soll.

Den bei Beitrag "Re: Akku Überwachung so machbar ?"
Ist KEIN vcc angegeben und auf rückfragen habe ich das so verstanden als 
würde der nicht benötig was ich aber nicht so recht glauben konnte.

Ich habe nicht viel Erfahrung mit ic ich lerne bei jeden Projekt ein 
bissel mehr.

Und nein die lEDs kann ich leider nicht direkt verbinden.
Q1 = 40mA
Q2 = 40mA
Q3 = 40mA
Q4 = 1,5A / (mosfet)

Und vielen lieben dank für die Zeichnung ich werde es mal testen.
Muss ich da jetzt so vorgehen :

int sensorValue = analogRead(0);
float voltage = sensorValue * (2.56 / 1024.0);

Oder weil ich ja einen 4,2 volt akku habe so;

int sensorValue = analogRead(0);
float voltage = sensorValue * (4.2 / 1024.0);

von Bernd K. (prof7bit)


Lesenswert?

Toxic schrieb:
> Bernd K. schrieb:
>> Mess doch einfach die Bandgap, dann brauchts überhaupt keinen
>> Spannungsteiler und keine externen Pins.
>
> Das beste ist,wenn du ihm/uns eine brauchbare Skizze deines Vorschlages
> praesentierst.

Na wie in der ersten Antwort schon beschrieben:

* den ADC so einstellen daß er Vcc als Referenz benutzt
* den Kanal 12 auswählen (Bandgap) und diesen messen.
  (Im Tiny 85 Datenblatt ist es 12, was Arduino für Nummern hat, k.A.)

Also: die zu messende Größe ist konstant (Bandgap) aber das Maß mit 
dem er sie mißt (Vcc) schwankt und ist die eigentlich interessierende 
Größe, so kann man ebenfalls auf Vcc schließen, bei der Wandlung wird 
ein ein Wert herauskommen der umgekehrt proportional zu Vcc ist.

Wenn ich wissen will ob die Bierkrüge zu viel Schaum enthalten kann ich 
entweder das Volumen direkt messen (umständlich und sieht blöd aus) oder 
ich mache es genau umgekehrt und zähle die gezapften Biere bis das Faß 
leer ist, ich messe also die bekannte konstante Größe (50l Faß) mit dem 
unbekannten Maß (Bierkrug), je kleiner die Krüge desto größer die 
Anzahl, so kann ich ebenfalls auf auf das Volumen schließen bis aufs 
Komma genau und brauche kein extra Werkzeug (kein externer Pin).

Mission erfüllt.

: Bearbeitet durch User
von Manfred (Gast)


Angehängte Dateien:

Lesenswert?

DAVID -. schrieb:
> Den bei Beitrag "Re: Akku Überwachung so machbar ?"
> Ist KEIN vcc angegeben und auf rückfragen habe ich das so verstanden als
> würde der nicht benötig was ich aber nicht so recht glauben konnte.
Erstmal "danke Toxic", dass er das für Dich überhaupt umgezeichnet hat!

Sein Text "Im Prinzip" ist eindeutig, das Vorhandensein einer 
Betriebsspannung an Integrierten Schaltkreisen wird hier als 
Grundlagenwissen der ersten Stunde vorausgesetzt.

> Ich habe nicht viel Erfahrung mit ic ich lerne bei jeden Projekt ein
> bissel mehr.
Du hast Handlungsbedarf, erstmal Grundlagen zu lesen - es gibt im Umfeld 
Arduino per Internet jede Menge Schulscripte zu finden, die genau solche 
Basisdinge klar machen.

> Und nein die lEDs kann ich leider nicht direkt verbinden.
> Q1 = 40mA
> Q2 = 40mA
> Q3 = 40mA
> Q4 = 1,5A / (mosfet)

Was für LEDs? Du hast im Mittel 3,6 Volt, nach oben 4,2V und zum Ende 
3,3V Betriebsspannung. Da wird sich der LED-Strom deutlich über die 
Akkuentladung verringern.

> Muss ich da jetzt so vorgehen :
> Oder weil ich ja einen 4,2 volt akku habe so;
>
> int sensorValue = analogRead(0);
> float voltage = sensorValue * (4.2 / 1024.0);

Ja, durch den Teiler wird Vollauschlag (1023) bei 4,2V erwartet.

Das muss noch justiert werden, Deine 2,56V könnnen eine Abweichung haben 
und auch die Widerstände haben ihre Toleranz. Die Widerstände sind 
falsch herum, den 10k und den 6k8 gegeneinander tauschen!

Mit einen zusätzlichen Trimmpoti könnte man es justierbar machen.

von Manfred (Gast)


Lesenswert?

Bernd K. schrieb:
> * den ADC so einstellen daß er Vcc als Referenz benutzt
> * den Kanal 12 auswählen (Bandgap) und diesen messen.
Das erspart zwar den Widerstandsteiler, aber verschenkt unnötig 
Auflösung. Ich würde es so nicht machen!

von Toxic (Gast)


Lesenswert?

Bernd K. schrieb:
> Na wie in der ersten Antwort schon beschrieben:
>
> * den ADC so einstellen daß er Vcc als Referenz benutzt
> * den Kanal 12 auswählen (Bandgap) und diesen messen.
>   (Im Tiny 85 Datenblatt ist es 12, was Arduino für Nummern hat, k.A.)

So mache ich dies mit meinen Pics - mit AVR habe ich nichts am Hut.Aber 
ein kurzer Blick ins Datenblatt des von mir (gestern)downgeloadeten 
ATiny oder ATmaxilein - weiss der Geier wie man auf solche Namen kommt - 
hat mir keinen Hinweis darauf gegeben,dass man die Referenz so 
verschalten kann.

Die Vorteile liegen klar auf der Hand,sind aber fuer Anfaenger etwas 
komplizierter zu verstehen.

von Bernd K. (prof7bit)


Lesenswert?

Toxic schrieb:
> hat mir keinen Hinweis darauf gegeben,dass man die Referenz so
> verschalten kann.

Doch, schau mal in der Tabelle für ADMUX, MUX[3:0]
(Tabelle 17-4 im ATiny85 Datenblatt)

von Bernd K. (prof7bit)


Lesenswert?

Manfred schrieb:
> Das erspart zwar den Widerstandsteiler, aber verschenkt unnötig
> Auflösung.

Um einen simplen Zustand wie Unterspannung oder "Akku leer" zu erkennen 
ist das noch mehr als genug Auflösung. Was willst Du da mit 10 Bit 
Auflösung?

: Bearbeitet durch User
von Toxic (Gast)


Angehängte Dateien:

Lesenswert?

Bernd K. schrieb:
> Toxic schrieb:
>> hat mir keinen Hinweis darauf gegeben,dass man die Referenz so
>> verschalten kann.
>
> Doch, schau mal in der Tabelle für ADMUX, MUX[3:0]
> (Tabelle 17-4 im ATiny85 Datenblatt)

Ja,dann muss ich das nochmal downloaden,sofern du dir im Gegenzug 
Microchips AN-Note antust?.
Es ist eine Ergaenzung zu deinem Bierkrugvergleich.

https://www.google.ie/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjo6-b8rvfSAhWIAcAKHct2BfAQFggbMAA&url=http%3A%2F%2Fww1.microchip.com%2Fdownloads%2Fen%2FAppNotes%2F01072A.pdf&usg=AFQjCNEm6imq69_7Mg4jnVlHrZpyS9_OWw

===========================
Unabhaengig davon stellt sich nun die Frage wie man @David weiterhilft.
Als Vorschlag bietet sich an ihn erstmal mit der 
Spannungsteilergeschichte werkeln zu lassen.Wenn dies dann funktioniert 
kann er ja die 2.Loesung angehen.Genauigkeit spielt eh keine Rolle.

DAVID -. schrieb:
> int sensorValue = analogRead(0);
> float voltage = sensorValue * (2.56 / 1024.0);
>
> Oder weil ich ja einen 4,2 volt akku habe so;
>
> int sensorValue = analogRead(0);
> float voltage = sensorValue * (4.2 / 1024.0);

Wenn du den Spannungsteiler mit dem 10k und 6k8 verwendest muesste die 
Grundgleichung folgendermassen lauten:

ADvalue/(Ubat/1.64) = 1023/2.56

=> ADvalue = (1023/2.56)*(Ubat/1.64)
=> ADvalue = 400 *(Ubat/1.64)

Setzt man fuer Ubat verschiedene Werte ein,erhaelt man entsprechende 
ADvalues

Der Wert 1.64 ergibt sich aus dem Spannungsteilerverhaeltnis,bzw dem 
Spannungsverhaeltnis von 4.2V/2.56V (= 1.64)
Der 6k8 muesste korrekterweise etwa 6k betragen - dies ist aber kein 
Standardwert - gerechnet habe ich mit 6k......
Die Diagramme im Anhang zeigen dir ADvalues fuer verschiedene 
Batteriespannungen.

von Jakob (Gast)


Lesenswert?

Der Vorschlag von Bernd K. ist optimal für den gewünschten
Zweck, weil er mit den wenigsten Bauteilen ausreichend
Auflösung (0,05 V) bietet.

Bei V_BG = 1,1 V:
4,2 V ergibt 268
4,0 V ergibt 281
3,8 V ergibt 296
3,6 V ergibt 313

Aber egal: Die internen Referenzen (2,56 V, oder 1,1 V) haben
eine Toleranz von +/-9%!
Sonst käme noch ein (hier überflüssiger) Spannungsteiler dazu.

Es geht also nicht ohne Abgleich!

von DAVID B. (bastler-david)


Lesenswert?

danke euch 3 ja ich teste erst mal mit Widerständen solle was unklar 
sein melde ich mich zeitnah :-)

Und so genau muss es nicht sein sinn und zeck des Chips soll es sein die 
Spannung in 0,100v schritten zumessen und zu verfolgen.

4 LEDs = 6 Abstufungen
> 4,18 Volt Blicken alle LEDs ( Zeichen das Akku lade Chip mist baut)
<4,00 LED 1 aus
<3,90 LED 2 aus
<3,80 LED 3 aus
<3,70 LED 4 aus / LED 2 an
<3,60 LED 2 Blickt.

Und noch bissel was anderes was aber keine Spannungsmessung braucht.

: Bearbeitet durch User
von Manfred (Gast)


Lesenswert?

Toxic schrieb:
> Unabhaengig davon stellt sich nun die Frage wie man @David weiterhilft.
> Als Vorschlag bietet sich an ihn erstmal mit der
> Spannungsteilergeschichte werkeln zu lassen.
Sehe ich auf jeden Fall so.

> Der Wert 1.64 ergibt sich aus dem Spannungsteilerverhaeltnis,bzw dem
> Spannungsverhaeltnis von 4.2V/2.56V (= 1.64)
> Der 6k8 muesste korrekterweise etwa 6k betragen - dies ist aber kein
> Standardwert - gerechnet habe ich mit 6k......
Wer von uns Beiden hat denn da ein Problem mit dem Rechnen?

Erstmal hast' die Beiden gegeneinander verdreht, der 6k8 muß in Reihe 
und der 10k nach GND!

Wenn ich rechne: 4,2/(10+6,8)*10 komme ich auf 2,5 Volt.
6k würde exact passen, wenn Vollausschlag bei 4,1V sein soll.

von Toxic (Gast)


Lesenswert?

Manfred schrieb:
> Wer von uns Beiden hat denn da ein Problem mit dem Rechnen?

Ups - jo da ist mir ein (leicht korrigierbarer)Rechenfehler 
unterlaufen.Aber was hat das mit dir zu tun? Ich habe mich meist auf 
meine eigene Postings bezogen - kann mich nicht erinnern etwas negatives 
ueber dich ausgesagt zu haben....

von Manfred (Gast)


Lesenswert?

Toxic schrieb:
> Ups - jo da ist mir ein (leicht korrigierbarer)Rechenfehler
> unterlaufen.
Danke!

> Aber was hat das mit dir zu tun? Ich habe mich meist auf
> meine eigene Postings bezogen - kann mich nicht erinnern etwas
> negatives ueber dich ausgesagt zu haben....
Ich kann mich nicht erinnern, etwas derartiges vernommen zu haben. Aus 
welcher meiner Formulierungen entnimmst Du das? Welchen Grund hätten 
wir, uns anzumeckern - ich sehe keinen!

von DAVID B. (bastler-david)


Lesenswert?

So habe jetzt die Platine fertig gebaut und die Software dafür auch 
FAST.
Wie man die Spannung normal über ein adc Pin ausliest weist ich in etwa 
aber wie geht das bei ein nicht adc Pin ?

analogReference(EXTERNAL);

Pause

int sensorValue = analogRead(PB0);
float voltage = sensorValue * (4.18 / 1023.0);

PB0 Refef
PB1 LED1
PB2 LED2
PB3 LED3
PB4 LED4
PB5 / Reset (freigelassen)
Die arduino IDE gibt mir keine Fehler zurück also richtig ?

DANKE euch
Und mit 10k + 6,2Kohm bei 4,15v habe ich genau 2,564 Volt ist das genau 
genug oder müssen die 0,004 Volt noch weg ?

DANKE

von DAVID B. (bastler-david)


Lesenswert?

So aufgebaut auf der Platine und mit 4,15 Volt Akku gemessen habe ich an 
Referenz Pin genaue 2,560 Volt na super!

Wenn mir noch jemand sagen könnte wie ich über den Referenz Pin die 
Spannung noch messe wäre ich am ziel.

von DAVID B. (bastler-david)


Angehängte Dateien:

Lesenswert?

So habe es noch mal überarbeitet und gesehen das ich den Reset Pin als 
ADC Pin miss brauchen kann.
Aber leider stimmt was mit der Messung nicht er geht IMMER von einen 
leeren Akku aus.

Ich habe die Software mal aufs nötigste runter gebrochen aber das ändert 
nix.
Zuerst das Setup Da werden >alle< LEDS eingeschalten (kleines 
Lichtspiel)/(läuft auch) und dann 6 sek warten,
Dann Reset Pin als Input deklarieren und normal messen mit:

int sensorValue1 = analogRead(5);
float voltage1 = sensorValue1 * (4.20 / 1023.0);

Und mit
if ( voltage1 <= 3.60) // Unterspannung
  {
    digitalWrite(2, LOW);
    digitalWrite(1, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    delay(15000);
    return;
  }

noch Auswerten

Wo mache ich den Fehler ?Habe ich was überlesen oder vergessen ?

von atzem (Gast)


Lesenswert?

Code Zitat:
"
int sensorValue1 = analogRead(5);
float voltage1 = sensorValue1 * (4.20 / 1023.0);
"

sensorValue1 wird als int deklariert.
In der zweiten Zeile rechnechst Du aber mit float,
daher solltest Du in der zweiten Zeile "sensorValue1" casten.
->
float voltage1 = (float)sensorValue1 * (4.20 / 1023.0);


Oder Deine Berechnungen kommplett auf Integer (Ganzahlen) umschreien 
(meist von der Porformance auf kleinen 8-Bittern schneller und weniger 
Code)...

von atzem (Gast)


Lesenswert?

Zudem Klammerung in der zweiten Zeile ändern:

Erst Multiplizieren, dann dividieren
float voltage1 = ((float)sensorValue1 * 4.20) / 1023.0;

von Manfred (Gast)


Angehängte Dateien:

Lesenswert?

DAVID -. schrieb:
> So habe es noch mal überarbeitet und gesehen das ich den Reset Pin als
> ADC Pin miss brauchen kann.
Die Schaltung ist grober Unfug, da hilft auch keine Software gegen!

Der Spannungsteiler 10k - 6k2 an 4,15V gibt keinesfalls 2,56V, das kann 
man rechnen. Befasse Dich mit Grundlagen! Wenn an dem Anschluss 2,56V 
liegen, kommen die aus dem Tiny raus und arbeiten gegen Deinen 
Spannungsteiler.

An den AREF kann man eine externe Referenzspannung legen, wenn der 
Controller entsprechend programmiert wird. Das Signal vom Deinem 
Spannungsteiler hat dort nichts zu suchen. Programmiere den Tiny auf 
interne Referenz 2,56V und lasse den AREF unbeschaltet bzw. 100nF nach 
GND.

Der PB5 wird als Analog-Input ADC0 deklariert. Der Ausgang des 
Spannungsteilers kommt an diesen Pin. R2 wird 6,8kOhm, R1 wird 10kOhm.

von DAVID B. (bastler-david)


Lesenswert?

Ok danke atzem werde ich mal testen.
Und Manfred die Widerstände habe ich nur beim plan vertauscht sorry.
Und Manfred du verwirrst mich wieso den pin wieder jetzt doch wieder wo 
anderes hin ?

ich will die Akku Spannung messen und nicht die ref Spannung ??

von Paul B. (paul_paul)


Lesenswert?

Schau doch mal bei Kondensatorschaden auf Youtube vorbei. Er hat so 
einen Batteriewächter gebaut (zumindest für 12V)

von Manfred (Gast)


Lesenswert?

DAVID -. schrieb:
> Und Manfred du verwirrst mich wieso den pin wieder jetzt doch wieder wo
> anderes hin ?
Gebe Dir etwas mehr Mühe beim Schreiben!

In dem Entwurf "Lalala-Solala.png" vor einigen Tagen ist der AREF 
unbeschaltet, warum musst Du das nun wieder ändern?

Grob_vereinfacht erfolgt eine digitale Spannungsnessung durch den 
Vergleich zweier Spannungen. Eine dieser muß genau bekannt und stabil 
sein, das ist die Referenzspannung. Unter "AD-Wandler" oder 
"Dual-Slope-Verfahren" findet Google detaillierte Erklärungen dazu.

Der Atmel kann als Referenzspannung die Betriebsspannung verwenden, kann 
sie intern selbst erzeugen oder mit einer externen Referenzspannung 
versorgt werden. In Deinem Falle wurde geraten, die interne "BandGap" 
einzuschalten, damit hat er seine 2,56V. Beim ATMega kann man diese am 
AREF-Anschluß messen. Beim Tiny (ich benutze ihn nicht) dürfte es von 
dessen Programmierung abhängen, ob diese am AREF erscheint oder der Pin 
für etwas anderes verwendet werden soll. Wie gesagt, lasse den Anschluß 
offen oder, wenn Du ihn einschaltest, lege 0,1µF gegen GND dran.

In Deinem Entwurf würde die Referenzspannung mit abnehmender 
Batteriespannung ebenfalls geringer werden - das gibt kein verwertbares 
Ergebnis.

Deine Meßgröße (vom Spannungsteiler) kommt an einen Eingang, den Du 
natürlich als ADC0, also Analogeingang, programmierst.

Liegen nun am ADC0 2,56V an, wird der Vergeich gegen die interne 
Referenz von 2,56V einen Wert von 1023 ergeben. Liegen am ADC0 1,25V, 
sollte der Wert 500 sein.

Wie schon zuvor gesagt wurde, sind diese 1023 / 500 theoretische 
Idealwerte, in Deinem Aufbau können die um einige Prozent abweichen. Das 
nennt man "Bauteiletoleranzen", musst Du für jeden Aufbau individuell 
nachmessen und justieren. Für diesen Zweck hatte ich vorgeschlagen, 
zuätzlich ein Trimmpoti zu setzen. Trimmpoti muss nicht, man kann auch 
die digitalen Zahlenwerte anpassen.

von DAVID B. (bastler-david)


Lesenswert?

Ok nach dem umlöten musste ich zumein bedauern feststellen das die 
arduino IDE den Reset Pin nicht setzten kann/will und der IMMER auf vcc 
bleibt egal was ich anstelle.

Also musste ich umplanen (schon wieder).
Pin 0 1 3 4 Sind meine Ausgänge jetzt und messen tute ich nach dem 
Spannungsteiler mit Pin 2:

float sensorValue1 = analogRead(2);
float voltage1 = sensorValue1 * (2.56 / 1023.0);

Jetzt mist er aber gar nix jeden falls ist vcc total egal er reagiert 
auf KEINE Spannungsänderung von voll (4,2 bis total leer 3,1v)

Die Spannungen sind am Pin 2 gemessen.
2.23 = 3,60
2.28 = 3,70
2.35 = 3,80
2.41 = 3,90
2.56 = 4,15 Volt

Da alle Ausgänge geschaltet werden muss die vom attiny85 gemessene 
Spannung immer im bereich von 2.40-2,56 Volt liegen was aber nicht sein 
kann.

Auf was habe ich mich hier eingelassen :-(
hätte ich gleich ein größeres Gehäuse gekauft (wooh 70 Cent gespart) und 
einfach ein step up verbaut wäre ich schon lange fertig mit dem mist 
.....

von Manfred (Gast)


Lesenswert?

DAVID -. schrieb:
> Ok nach dem umlöten musste ich zumein bedauern feststellen das die
> arduino IDE den Reset Pin nicht setzten kann/will und der IMMER auf vcc
> bleibt egal was ich anstelle.
Wie kommen jetzt Arduino-IDE und ATTiny zusammen?

> Pin 0 1 3 4 Sind meine Ausgänge jetzt und messen tute ich nach dem
Tuuut tuut :-)

> Spannungsteiler mit Pin 2:
> float sensorValue1 = analogRead(2);
> float voltage1 = sensorValue1 * (2.56 / 1023.0);
Was ist PIN2? Im 8pol-DIP ist Pin2 der ADC3 - wenn passend deklariert.

> Jetzt mist er aber gar nix jeden falls ist vcc total egal er reagiert
> auf KEINE Spannungsänderung von voll (4,2 bis total leer 3,1v)
Genau das ist es - Mist.

> Die Spannungen sind am Pin 2 gemessen.
> 2.23 = 3,60
> 2.28 = 3,70
> 2.35 = 3,80
> 2.41 = 3,90
> 2.56 = 4,15 Volt
Die Wertereihe passt doch fuer 6k2 - 10k sauber hin.

> Auf was habe ich mich hier eingelassen :-(
Das frage ich mich auch. So ein Gebilde hätte ich mit einem Arduino 
ProMini an einem Abend gemacht!

Für Dich ist es zwei Nummern zu groß, weil Dir jegliche Grundlagen zu 
fehlen scheinen. Ich habe leider den Eindruck, dass Du in dieser 
Richtung nichts unternehmen möchtest. Weihnachten ist leider vorbei - da 
wären ein Arduino-Baukasten mit dem UNO, eine Tüte Bauelemente und das 
Arduino-Kochbuch ein sinnvoller Wunsch gewesen. Dann ist erstmal ein 
paar Wochen Spielen angesagt, um die Basis für ein reales Projekt zu 
setzen.

von DAVID B. (bastler-david)


Lesenswert?

Ich nehme zum beschreiben meiner Chips ausschließlich die arduino ide.
ich habe aber auch normale GEKAUFTE arduinos wie nanos und mega.
Beschreiben mache ich mit ein 4€ usb teil.
Die Pin Nummer ist bei arduino anderes da ist PB2 Pin 2 am Chip aber 
selber aber pin 7 also ADC1 habe auch erst gebraucht bis ich das 
verstanden habe.
Und ein fertigen arduino wollte ich wegen der Größe nicht nehmen und mit 
dem bissel Code was ich auch noch auf den attiny 45 mit nur 4 Kb 
speicher packen könnte (habe ich aber grade kein da) wäre der mir auch 
zu schade.

Ich versuche es heute Abend noch mal.

Aber du hast recht ich mache es wieder schwerer wie es ist.
Ich weiß der Akku hat bei der gemessen last von 1,51A eine Laufzeit von 
genau 125 Minuten bis 3,60 Volt erreicht sind so muss ich nur vorher 
wieder aufladen und gut ging das letzte Jahr auch ohne irgendeine 
Überwachung.

Ich danke euch für euere Hilfe habe immer hin wieder was gelernt.

von DAVID B. (bastler-david)


Angehängte Dateien:

Lesenswert?

So nach fast 2 Wochen ein neuer versuch.
Ich habe die Schaltung jetzt mal so um gebaut (siehe plan) und die 
Firmware so (siehe unten) angepasst aber es erfolgt keinem Messung oder 
keine Auswertung.
Kann doch nicht so schwer sein.
Ich habe die verkabelung x mal getestet die ist ok auch ein anderer 85 
attiny Chip macht das selbe = nix)

void setup() {

  pinMode(0, OUTPUT);//L
  pinMode(1, OUTPUT);//S
  pinMode(2, INPUT); // Messung
  pinMode(3, OUTPUT); //R
  pinMode(4, OUTPUT); //L

  digitalWrite(0, HIGH);//L
  digitalWrite(1, LOW); //S
  digitalWrite(3, LOW); //R
  digitalWrite(4, HIGH); //L
  delay(2000);

  digitalWrite(0, HIGH);//L
  digitalWrite(1, LOW); //S
  digitalWrite(3, HIGH); //R
  digitalWrite(4, HIGH); //L

  delay(2000);

  digitalWrite(0, HIGH);//L
  digitalWrite(1, HIGH); //S
  digitalWrite(3, HIGH); //R
  digitalWrite(4, HIGH); //L
}

Soweit kommt er noch dann gibt es keine Änderungen mehr.

void loop()
{

  int sensorValue = analogRead(2);
  float voltage = sensorValue * (5.00 / 1023.0);

  if ( voltage < 2.23) // Unterspannung 3,60
  {
    digitalWrite(0, LOW); //L
    digitalWrite(1, LOW); //S
    digitalWrite(3, LOW); //R
    digitalWrite(4, HIGH);//L
    delay(10000);

  } else if ( voltage < 2.28)// Unterspannung 3,70
  {
    digitalWrite(0, HIGH); //L
    digitalWrite(3, LOW); //R
    digitalWrite(1, LOW); //S
    digitalWrite(4, LOW);//L
    delay(10000);

  } else if ( voltage < 2.35)// Unterspannung 3,80
  {
    digitalWrite(0, HIGH); //L
    digitalWrite(1, LOW); //S
    digitalWrite(3, HIGH);//R
    digitalWrite(4, LOW);//L
    delay(10000);

  } else if ( voltage < 2.41)// Normalspannung (3,90
  {
    digitalWrite(0, HIGH); //L
    digitalWrite(1, LOW); //S
    digitalWrite(3, HIGH); //R
    digitalWrite(4, HIGH); //L
    delay(10000);

    } else if ( voltage > 2.41)// (3,90
  {
    digitalWrite(0, HIGH); //L
    digitalWrite(1, HIGH); //S
    digitalWrite(3, HIGH); //R
    digitalWrite(4, HIGH); //L
  }
  delay(8000);
}

Das einzigste was mir noch einfehlt ist das die delay Zeiten zulang sind 
und sich der chip auf hängt?

Wo liegt der Fehler ?

VIELEN DANK

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Die Überprüfung auf genau 2,41V wird Dir nicht das gewünschte Ergebnis 
liefern (da Du nur auf Kleiner und auf Größer prüfst).
Die letzte Prüfung kannst Du also weg lassen, statt dem else if nur ein 
else.

Wird die void loop() wirklich laufend aufgerufen?
Lasse am Anfang der loop-Routiene einen der Ausgangs-Pins toggeln oder 
Dir Debug-Werte ausgeben (was ungefähr das Gleiche wäre).

Wenn loop() nur 1x aufgerufen wird (... wäre der Name widersinnig), 
kannst Du die ganzen Abfragen in eine while(1) - Schleife einpacken.

MfG

PS: Sind die delay-Werte Sekunden?
Dann wäre 8000 vll. zu Testzwecken 'etwas' kleiner zu wählen.
Auch bei ms wären die Überprüfungen immernoch 8 Sek auseinander (sofern 
immer wieder aufgerufen wird) ... zum Testen wären mir hier Zeiten von 
500ms lieber, da man ja noch was Anderes am Abend vor hat und auch nicht 
jünger wird ;)

MfG²

: Bearbeitet durch User
von Manfred (Gast)


Lesenswert?

DAVID -. schrieb:
> Ich habe die Schaltung jetzt mal so um gebaut (siehe plan)
>
> Kann doch nicht so schwer sein.
Ein Voltmeter besitzt Du nicht und einen Spannungsteiler zu rechnen hast 
Du noch immer nicht nachgelesen?

Gemäß Deinem Schaltplan werden am Pin 7 niemals mehr als 1,6V 
erscheinen.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Manfred schrieb:
> Gemäß Deinem Schaltplan werden am Pin 7 niemals mehr als 1,6V
> erscheinen.

Wurde oben schon erwähnt, daß die beiden Widerstände in dem Plan 
vertauscht wurden - und wurden auch schon Mal richtig herum gezeichnet 
:)

Bisher sieht es aber eher so aus, daß die loop()-Routine nicht oder nur 
1x durchlaufen wird.

Warum wurde eigentlich versucht, PB5 am ATtiny85 (Reset) zu beschalten?
Wenn dieser Pin nicht mehr RESET ist, ist der Chip nicht mehr per 
normalem ISP ansprechbar - also im Hobby-Normalfall Edel-Schrott.

MfG

von DAVID B. (bastler-david)


Lesenswert?

Patrick J. schrieb:
Die letzte Prüfung kannst Du also weg lassen, statt dem else if nur ein
else.

Ok danke werde ich ändern und mit toggeln gute Idee mal testen.
Und ja die delay-Werte sollen sek sein so das in etwa alle 10 sek eine 
neue Messung erfolgt.

Manfred schrieb:
> Ein Voltmeter besitzt Du nicht

Hast ja recht habe nur >4< stück.
ehm an Pin 7 liegen doch Spannungen bis zu 2,56 Volt an  (selber 
gemessen)

Unabhängig davon scheint er KEINE Messung zumachen.
egal ob die Spannung am pin 7 (in Software 2) in bereich von 0 - 2,56 
Volt liegt ist ihm alles egal.

Und der Reset ist ja frei den zu belegen ist Woll nicht so einfach 
möglich.

von DAVID B. (bastler-david)


Lesenswert?

Ich habe jetzt noch mal ein andren attiny85 genommen und auf Steckbrett 
gesetzt mit minimal Beschaltung:
VCC 5 volt
GND
PB3 LED + 3,3 Kohm
PB4 An ein Poti um von 0-5 Volt zuregeln.

Habe auch mal andere Pins genutzt aber es bleibt beim alten es wird 
keine Spannung eingelesen oder erkannt.

void setup()
{
  pinMode(PB3, OUTPUT);
  pinMode(PB4, INPUT);

  digitalWrite(PB3, HIGH);
  delay(1000);
  digitalWrite(PB3, LOW);
  delay(1000);
  digitalWrite(PB3, HIGH);
}

void loop()
{
  int sensorValue = analogRead(PB4);
  float voltage = ((float)sensorValue * (5.00) / 1023.0);


  if ( voltage < 2.50) (hier scheint es hängen zubleiben egal ob es mehr 
als 3,5 volt sind oder nicht.)
  {
    digitalWrite(PB3, HIGH);
    delay(500);
  }
  if ( voltage > 2.50)
  {
    digitalWrite(PB3, LOW);
    delay(500);
  }
}

Hier mal die Ereignisse der Arduino ide:

Der Sketch verwendet 1672 Bytes (20%) des Programmspeicherplatzes. Das 
Maximum sind 8192 Bytes.
Globale Variablen verwenden 9 Bytes (1%) des dynamischen Speichers, 503 
Bytes für lokale Variablen verbleiben. Das Maximum sind 512 Bytes.
C:\Users\S\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0- 
arduino9/bin/avrdude 
-C:\Users\S\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0 
-arduino9/etc/avrdude.conf  -v -attiny85 -cusbasp -Pusb -Uflash:w:
C:\Users\S\AppData\Local\Temp\arduino_build_46730/sketch_apr13a.ino.hex: 
i

avrdude: Version 6.3, compiled on Jan 17 2017 at 12:00:53
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch
         System wide configuration file is 
"C:\Users\S\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0 
-arduino9/etc/avrdude.conf"

         Using Port                    : usb
         Using Programmer              : usbasp
         AVR Part                      : ATtiny85
         Chip Erase delay              : 400000 us
         PAGEL                         : P00
         BS2                           : P00
         RESET disposition             : possible i/o
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page 
Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages 
MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ 
----- ----- ---------
           eeprom        65    12     4    0 no        512    4      0 
4000  4500 0xff 0xff
           flash         65     6    32    0 yes      8192   64    128 
30000 30000 0xff 0xff
           signature      0     0     0    0 no          3    0      0 
0     0 0x00 0x00
           lock           0     0     0    0 no          1    0      0 
9000  9000 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0 
9000  9000 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0 
9000  9000 0x00 0x00
           efuse          0     0     0    0 no          1    0      0 
9000  9000 0x00 0x00
           calibration    0     0     0    0 no          1    0      0 
0     0 0x00 0x00

         Programmer Type : usbasp
         Description     : USBasp, http://www.fischl.de/usbasp/

avrdude: auto set sck period (because given equals null)
avrdude: warning: cannot set sck period. please check for usbasp 
firmware update.
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 
0.00s

avrdude: Device signature = 0x1e930b (probably t85)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be 
performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: auto set sck period (because given equals null)
avrdude: warning: cannot set sck period. please check for usbasp 
firmware update.
avrdude: reading input file 
"C:\Users\S\AppData\Local\Temp\arduino_build_46730/sketch_apr13a.ino.hex 
"
avrdude: writing flash (1672 bytes):

Writing | ################################################## | 100% 
1.11s

avrdude: 1672 bytes of flash written
avrdude: verifying flash memory against 
C:\Users\S\AppData\Local\Temp\arduino_build_46730/sketch_apr13a.ino.hex:
avrdude: load data flash data from input file 
C:\Users\S\AppData\Local\Temp\arduino_build_46730/sketch_apr13a.ino.hex:
avrdude: input file 
C:\Users\SPEED\AppData\Local\Temp\arduino_build_46730/sketch_apr13a.ino. 
hex  contains 1672 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 
0.90s

avrdude: verifying ...
avrdude: 1672 bytes of flash verified

avrdude done.  Thank you.

von DAVID B. (bastler-david)


Lesenswert?

So Problem ist gelöst und Schaltung läuft.
Es ist Woll nicht möglich den PB2 zum messen zu nutzen nach sehr langen 
hin und her habe ihn dann mal auf PB3 gesetzt und den Spannungsteiler 
raus gehauen und PB2 dafür als Ausgang und es geht ???
Das ist mal komisch aber ok es geht.
Habe auch das umrechnen in Volt aufgegeben und die roh werte nutzen 
lassen.
735//3,602
756//3,702
776//3,800
796//3,900
Danke an alle die mit geholfen haben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.