Forum: Mikrocontroller und Digitale Elektronik Attiny45 kann Analogeingang nicht auswerten.


von Andreas M. (andreas_m672)


Angehängte Dateien:

Lesenswert?

Guten Tag.

Ich bin im ATMEL Thema recht neu und habe gleich ein kleines Problem.

Ich möchte mit einem ATTiny45 eine simple Batterie-Ladezustandsanzeige
umsetzen die sich selbst versorgt.
Also, Spannungsquelle 6,4V soll am Analogeingang (5,0 bis 6,4)
überwacht werden und mit 4 LEDs der Ladezustand angezeigt werden.

Vor dem VCC Eingang des Attiny habe ich zwei 1N4148 um die 6,4V Volt zu 
reduzieren. Am Analogeingang ist ein Spannungsteiler mit R5= 47k und R6 
100k.
Zur Simulation habe ich nach der Spannungsquelle ein Poti eingesetzt, 
welche
die Gesamtspannung der ganzen Schaltung reduziert.
Das funktioniert aber nicht, die Analogwerte werden nicht verändert, 
mein einfacher (Arduino)Code funktioniert nicht.

Wenn ich allerdings die µC Spannung konstant halte und die Spannung
am analogen Eingang (ADC2) verändere funktioniert es.

Ein 5V Spannungsregler funktioniert hier ja nicht.
Was könnte ich verändern um mit einer 6V Spannungsquelle auszukommen?
1
 
2
int pot = A2;
3
int led0 = 0;   
4
int led1 = 1;  
5
int led2 = 2; 
6
int led3 = 3; 
7
8
void setup(){
9
   pinMode(pot, INPUT);
10
   pinMode(led0, OUTPUT);
11
   pinMode(led1, OUTPUT);
12
   pinMode(led2, OUTPUT);
13
   pinMode(led3, OUTPUT);
14
   
15
   digitalWrite(led0, LOW);
16
   digitalWrite(led1, LOW);
17
   digitalWrite(led2, LOW);
18
   digitalWrite(led3, LOW);
19
   
20
}
21
22
 void loop(){
23
   if(analogRead(pot) >= 200){   
24
     digitalWrite(led0, HIGH);
25
     delay(2);
26
   }
27
   if(analogRead(pot) >= 300){   
28
     digitalWrite(led1, HIGH);
29
     delay(2);
30
   }
31
   if(analogRead(pot) >= 600){   
32
     digitalWrite(led2, HIGH);
33
     delay(2);
34
   }
35
   if(analogRead(pot) >= 900){    
36
     digitalWrite(led3, HIGH);
37
     delay(2);
38
   }
39
  
40
   else{        // 0V
41
     digitalWrite(led0, LOW);
42
     digitalWrite(led1, LOW);
43
     digitalWrite(led2, LOW);
44
     digitalWrite(led3, LOW);
45
     
46
   }
47
}

Vielen Dank für helfende Ideen oder Hinweise,
 Andreas

.

von Karl M. (Gast)


Lesenswert?

Hallo,
zum einen ist der Reset Pin nicht beschaltet (Pullup), ein Kondensator 
100nF fehlt Vcc-Gnd.

Dann musst Du dich mal Fragen, welche Spannungsreferenz für die ADC 
Wandlung verwendet wird.

Welche es gibt, steht im Datenblatt des Atmel µC.

Ich würde noch einen 10nF Kondensator an den ADC-Eingang ADC2 setzen.

von spekulazius (Gast)


Lesenswert?

Andreas M. schrieb:
> Wenn ich allerdings die µC Spannung konstant halte und die Spannung
> am analogen Eingang (ADC2) verändere funktioniert es.

Du brauchst wohl sowas wie eine Referenz Spannungsquelle.

von Mark S. (voltwide)


Lesenswert?

Zur Spannungsreduzierung würde ich eine grüne LED statt der beiden 
1N4148 wählen. Der interne AD-Wandler kann 1,1V, 2,56V oder die 
Betriebsspannung als Referenz benutzen. Hier würde ich die 2,56V 
vorschlagen, bei entsprechend angepaßtem Spannungsteiler. Wie man das in 
Arduino code umsetzt weiß ich nicht, ich programmiere in C.

von HildeK (Gast)


Lesenswert?

Andreas M. schrieb:
> Wenn ich allerdings die µC Spannung konstant halte und die Spannung
> am analogen Eingang (ADC2) verändere funktioniert es.

Wenn du die Versorgungsspannung änderst, dann ändert sich auch die 
ADC-Referenz. Das ADC-Ergebnis bleibt dabe gleich.
In deinem Fall musst du eine interne Referenz verwenden, die unabhängig 
von VCC einen konstanten Wert hat.
Außerdem: die Quellimpedanz für den ADC soll 10k nicht übersteigen.

von c-hater (Gast)


Lesenswert?

HildeK schrieb:

> Wenn du die Versorgungsspannung änderst, dann ändert sich auch die
> ADC-Referenz. Das ADC-Ergebnis bleibt dabe gleich.

Ganz genau so ist das. Messen heißt nunmal: Vergleichen.

> Außerdem: die Quellimpedanz für den ADC soll 10k nicht übersteigen.

Da sollte man nicht drauf rumreiten. Für eine Batteriespannungsmessung 
dürfte es vollkommen genügen, wenn man sie mit z.B. 1Hz vornimmt. Wenn 
die einzige Aufgabe der ADC eben diese Spannungsmessung ist, kann man 
problemlos die Quellimpedanz mindestens um zwei Größenordnungen höher 
wählen.

Diesbezügliche Überlegungen sind aber garnicht nötig, wenn man eine 
interne Referenz verwendet, um Vcc zu messen. Vorausgesetzt, die 
Versorgung ist halbwegs nach dem Stand der Technik implementiert, ist 
sie von Hause aus auch niederohmig genug, um den ADC zu speisen.

von Andreas M. (andreas_m672)


Lesenswert?

Ich bedanke mich schon mal für die vielfältigen Vorschläge.
Ich werde mich mal mit der Referenz auseinandersetzen und dann 
zurückmelden.

Vielen Dank, Andreas

von HildeK (Gast)


Lesenswert?

c-hater schrieb:
> Diesbezügliche Überlegungen sind aber garnicht nötig, wenn man eine
> interne Referenz verwendet, um Vcc zu messen. Vorausgesetzt, die
> Versorgung ist halbwegs nach dem Stand der Technik implementiert, ist
> sie von Hause aus auch niederohmig genug, um den ADC zu speisen.

Bei langsamer Messrate hilft natürlich auch ein externes C am 
ADC-Eingang.
Aber diesen Einwand von dir verstehe ich doch nicht: es ging ja um den 
externen Spannungsteiler für den ADC-Eingang und nicht um die Anbindung 
der Referenz.
Man könnte auch mit VCC als Referenz die interne Spannungsreferenz 
messen, aber ich glaube, das geht mit den Tinys nicht. Nur mit einer 
externen Referenz = Zusatzbaustein, die gegen die als Referenz 
verwendete VCC gemessen wird. Erfordert dann ein wenig umrechnen.

von c-hater (Gast)


Lesenswert?

HildeK schrieb:

> Man könnte auch mit VCC als Referenz die interne Spannungsreferenz
> messen, aber ich glaube, das geht mit den Tinys nicht.

Stimmt, das habe ich wohl verdrängt, das geht tatsächlich längst nicht 
mit jedem Tiny.

Mit etlichen aber schon. Konkret z.B. Tiny25/45/85 und Tiny441/841. Das 
sind die, die mir sofort einfallen. Naja, meine persönlichen Lieblinge 
im Tiny-Reich, da brauch' ich nichtmal im DB nachschlagen...

Und, oops, es ging doch tatsächlich um einen Tiny45. Welch' günstiges 
Glück... Aber ich gebe zu: das war Zufall. Ich hatte das in dem Moment, 
als ich das Posting geschrieben habe, nicht wirklich auf dem Schirm.

von Dieter F. (Gast)


Lesenswert?

Andreas M. schrieb:
> Ich möchte mit einem ATTiny45 eine simple Batterie-Ladezustandsanzeige
> umsetzen die sich selbst versorgt.
> Also, Spannungsquelle 6,4V soll am Analogeingang (5,0 bis 6,4)
> überwacht werden und mit 4 LEDs der Ladezustand angezeigt werden.

3,3 V Festspannungsregler, Spannungsteiler und Formel anpassen und alles 
ist gut (bei roten, gelben und grünen LED).

ATtiny25/45/85: 0 – 10 MHz @ 2.7 - 5.5V

von HildeK (Gast)


Lesenswert?

c-hater schrieb:
> Mit etlichen aber schon. Konkret z.B. Tiny25/45/85 und Tiny441/841. Das
> sind die, die mir sofort einfallen. Naja, meine persönlichen Lieblinge
> im Tiny-Reich, da brauch' ich nichtmal im DB nachschlagen...

Entweder missverstehen wir uns - oder ich muss dich bitten, mir das zu 
erklären.
Tinyx5 sind auch meine Lieblinge. Aber da habe ich doch imho nur die 
Möglichkeiten:
- VCC als Referenz, messen über ADC-Eingang. Geht hier nicht, weil REF 
und ADC-Eingang voneinander abhängen
- eine der internen Referenzen (1.1V, 2.56V) verwenden. Das wäre die 
normale Lösung. Erfordert einen Teiler und belegt einen Pin.
- Pin PB0 als ARef nehmen und externe Referenz anlegen. Eine Möglichkeit 
mit Zusatzaufwand (Referenz und Teiler, zwei Pins belegt)
- VCC als Referenz verwenden und an ADC-Input eine externe 
Referenzquelle anlegen. Erfordert einen Pin und eine externe Ref-Quelle.

Nicht möglich nach meiner Kenntnis ist aber das hier:
- VCC als Referenz, mit dem ADC die eigene, interne Referenzquellen 
messen.

Ich meine, man kann die intern erzeugten 1.1V oder 2.56V nicht an einen 
ADC-Eingang legen. Wenn doch: bitte erleuchte mich :-).
Der Vorteil wäre: keinerlei Zusatzaufwand, kein Pinverbrauch, nur etwas 
anders rechnen - reziprok.

von Axel S. (a-za-z0-9)


Lesenswert?

HildeK schrieb:
> Ich meine, man kann die intern erzeugten 1.1V oder 2.56V nicht an einen
> ADC-Eingang legen. Wenn doch: bitte erleuchte mich :-)

Datenblatt lesen würde helfen. Die meisten (aber nicht alle?) Tinies 
haben eine Position des ADMUX, wo der ADC die Bandgap-Spannung mißt. 
Beim ATtiny25/45/85 wäre das Position 1100.

von Stefan F. (Gast)


Lesenswert?

Andreas M. schrieb:
> Am Analogeingang ist ein Spannungsteiler mit R5= 47k und R6
100k.
> Das funktioniert aber nicht, die Analogwerte werden nicht verändert,
> mein einfacher (Arduino)Code funktioniert nicht.

Dein Spannungsteiler hat als Ausgangsspannung also etwa 2/3 der 
Versorgungsspannung. An deinem Poti kannst du so viel drehen, wie du 
willst, das ändert nichts an der Spannung, weil der Eingang des ADC (im 
Idealfall) einen unendlich hohen Innenwiderstand hat. Wo kein Strom 
fliesst, fällt keine Spannung ab, ganz egal welchen Widerstandswert du 
am Poti einstellst.

In der Praxis hat der ADC aber leider doch keinen unendlich hohen 
Eingangswiederstand. Der ADC enthält eine Sample&Hold Schaltung, die im 
Wesentlichen aus einem Kondensator und ein paar Analogschaltern besteht. 
Dieser wird vor jeder Messung kurz mit dem Eingang verbunden und danach 
ausgemessen. Damit der interne Kondensator in dieser Zeit überhaupt 
annähernd vollständig geladen werden werden kann, empfiehlt der 
Chiphersteller, dass der Ausgangswiderstand der Signalquelle maximal 
10kΩ haben soll.

In deinem Fall ist der Ausgangswiderstand etwa 30kΩ plus dem 
Innenwiderstand des Potentiometers. Also viel zu hoch, um präzise 
Messergebnisse zu erhalten.

Mache das so:
1
                 Poti
2
+    4,7kΩ       10kΩ
3
o---[===]-------[===]---| GND
4
                  ^
5
                  |
6
                  |
7
                  o zum ADC

Du kannst auch 47kΩ und ein 100kΩ Poti verwenden (oder gar 470kΩ und ein 
1MΩ Poti), wenn du den Spannungsteiler zusätzlich mit einem Kondensator 
abstützt:
1
                 Poti
2
+    47kΩ       100kΩ
3
o---[===]-------[===]------| GND
4
                  ^
5
                  |
6
                  |
7
        100nF     +---||---| GND 
8
                  |
9
                  |
10
                  o zum ADC

In diesem Fall musst du allerdings zwischen den ADC Messungen ein paar 
Millisekunden Pause einlegen, damit sich der Stützkondensator 
zwischenzeitlich wieder aufladen kann.

von c-hater (Gast)


Lesenswert?

HildeK schrieb:

> Nicht möglich nach meiner Kenntnis ist aber das hier:
> - VCC als Referenz, mit dem ADC die eigene, interne Referenzquellen
> messen.

Warum nicht? Natürlich ist das möglich. Du musst nur mal nachschlagen, 
was "Vbg" eigentlich bedeutet, also MUX3::0=0b1100...

Es steht also, wie fast immer, alles im DB. Man muss es einfach nur 
lesen können (und das dann auch tatsächlich irgendwann mal wirklich 
vollständig tun, ich meine: du bist ja nicht erst seit vorgestern im 
Thema, das kann man von dir schon irgendwie erwarten/verlangen).

Ich gebe allerdings gerne zu, dass die Angabe auf den ersten Blick 
zumindest nicht eindeutig ist, denn allein mit Table 17-4 kommt man hier 
nicht dahinter, schließlich gibt es ja zwei Bandgap-Referenzen in der 
verfügbaren Peripherie. Da hat Atmel schlicht Scheisse gebaut, das hätte 
man definitiv sinnvoller bezeichnen können. Allerdings: eine DB-weite 
Suche nach "Vbg" enthüllt die Sache innert weniger hundert 
Millisekunden. DAS kann doch nicht wirklich zu viel verlangt sein von 
einem Ingenieur, oder siehst du das anders?

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


Lesenswert?

Stefanus F. schrieb:
> In diesem Fall musst du allerdings zwischen den ADC Messungen ein paar
> Millisekunden Pause einlegen, damit sich der Stützkondensator
> zwischenzeitlich wieder aufladen kann.

Nö. Solange der externe Kondensator >> S&H Kondensator, ist das nicht 
nötig. Nur beim Drehen am Poti folgt der externe C verlangsamt, weils ja 
ein RC Tiefpass ist.
100nF ist allerdings völlig übertrieben. Da nimmt man 470pF - 4,7nF und 
ist immer auf der sicheren Seite.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Ich nehme 100nF weil die nächst kleineren Kondensatoren in meinem Vorrat 
22pF haben. Dazwischen gibt es viel Nichts.

von Carl D. (jcw2)


Lesenswert?

Stefanus F. schrieb:
> Ich nehme 100nF weil die nächst kleineren Kondensatoren in meinem Vorrat
> 22pF haben. Dazwischen gibt es viel Nichts.

Must hält mehr Audio machen, dann hast du auch Werte zwischen 
"Quarzlast" und "Vccabblocker". ;-)

von Stefan F. (Gast)


Lesenswert?

Stefanus F. schrieb:
>> Ich nehme 100nF weil die nächst kleineren Kondensatoren in meinem Vorrat
>> 22pF haben. Dazwischen gibt es viel Nichts.

Carl D. schrieb:
> Must hält mehr Audio machen, dann hast du auch Werte zwischen
> "Quarzlast" und "Vccabblocker". ;-)

Kein Bedarf, meine selbst gebauten Audiogeräte sind über 20 Jahre alt 
und wollen einfach nicht kaputt gehen oder schlechter werden.

von HildeK (Gast)


Lesenswert?

c-hater schrieb:
> Warum nicht? Natürlich ist das möglich. Du musst nur mal nachschlagen,
> was "Vbg" eigentlich bedeutet, also MUX3::0=0b1100...

Vielen Dank, auch an Axel S.! Schön, dass es die Möglichkeit doch gibt. 
Muss ich bei Gelegenheit mal ausprobieren.

c-hater schrieb:
> Es steht also, wie fast immer, alles im DB. Man muss es einfach nur
> lesen können (und das dann auch tatsächlich irgendwann mal wirklich
> vollständig tun, ich meine: du bist ja nicht erst seit vorgestern im
> Thema, das kann man von dir schon irgendwie erwarten/verlangen).

Ja, aber außer im Zusammenhang mit diesem Thread hatte ich mich mit 
dieser Variante bisher noch nicht beschäftigt. Ich hatte mir nur Bild 
17-1 angeschaut und daraus geht diese Möglichkeit nicht hervor.
Lesen kann ich durchaus - schnell das Richtige finden nicht immer :-).

von c-hater (Gast)


Lesenswert?

HildeK schrieb:

> Vielen Dank, auch an Axel S.! Schön, dass es die Möglichkeit doch gibt.
> Muss ich bei Gelegenheit mal ausprobieren.

Works. Natürlich nur in den lt. DB erwartbaren Grenzen bezüglich der 
"Treffsicherheit" der BG-Quelle...

Sprich: für ernsthafte Anwendungen führt kein Weg um eine Kalibrierung 
herum. Und ja: Selbst die simple Messung einer Batteriespannung kann 
durchaus ein ernsthafte Anwendung sein, kommt halt auf die "Batterie" 
an.

Für die handelsüblichen Primärelemente ist die Referenz von Hause aus 
genau genug. Auch für NiCd- oder NiMH-Akkus, nicht aber für LiIO- oder 
LiPO. Da muss man kalibrieren, damit am Ende was Sinnvolles rauskommen 
kann.

von Bastler (Gast)


Lesenswert?

Das Entscheidende um die Betriebsspannung (ohne externe Referenz) zu 
ermitteln ist doch, dass man VCC und die interne Referenz vergleicht. 
Ist doch egal ob man die interne Referenz misst mit VCC als 
Referenzspannung oder VCC über einen Spannungsteiler mit der internen 
Referenz vergleicht.

OK, Vorteil der ersten Variante ist man braucht gar keine externen 
Bauteile nud keinen Analog Pin - in der zweiten Variante braucht man 
zwei Widerstände und eben einen Analog Pin.

Spannungsteiler so dimensionieren, dass bei VCCmax die Spannung der 
internen Referenz (steht im Datenblatt, 1.1/2.56V oder was auch immer) 
nicht überschirtten wird und dann den Analog Pin eben nicht gegen VCC 
messen sondern gegen die Referenz. Die ändert sich nämlich nicht wenn 
VCC sich ändert. Mit etwas Mathe hat man dann VCC...

von Bastler (Gast)


Lesenswert?

Vergessen: das ist halt interessant für die µC's die die interene 
Referenz nicht gegen VCC messen können. Da kann man es dann außenrum 
machen...

von HildeK (Gast)


Lesenswert?

c-hater schrieb:
> Für die handelsüblichen Primärelemente ist die Referenz von Hause aus
> genau genug. Auch für NiCd- oder NiMH-Akkus, nicht aber für LiIO- oder
> LiPO. Da muss man kalibrieren, damit am Ende was Sinnvolles rauskommen
> kann.

Klar, aber das ist bei Verwendung der internen Referenz immer so. 
Entweder jede einzelne Schaltung kalibrieren oder eine präzise externe 
Referenz nehmen.

von foobar (Gast)


Lesenswert?

> OK, Vorteil der ersten Variante ist man braucht gar keine externen
> Bauteile nud keinen Analog Pin - in der zweiten Variante braucht man
> zwei Widerstände und eben einen Analog Pin.

Für mich ist der Hauptgrund für die erste Variante, dass sie keinen 
Ruhestromverbrauch durch den Spannungsteiler hat. Bei 
batteriebetriebenen Geräten, die die meiste Zeit schlafen, ist der 
Spannungsteiler sonst schnell mal der größte Verbraucher[1].  Dass man 
das "umsonst" bekommt, ohne externe Beschaltung, ohne Pin, ist nen Bonus 
obendrauf.



[1] das zu verhindern, kann kniffelig werden.

von Bastler (Gast)


Lesenswert?

foobar schrieb:
> Für mich ist der Hauptgrund für die erste Variante, dass sie keinen
> Ruhestromverbrauch durch den Spannungsteiler hat

Stimmt, daran hatte ich noch gar nicht gedacht. Ich hab den Ansatz noch 
aus der Zeit als die Bandgap noch keinen Platz im ADC-Mux bekommen 
hatte...

von HildeK (Gast)


Lesenswert?

foobar schrieb:
> Bei
> batteriebetriebenen Geräten, die die meiste Zeit schlafen, ist der
> Spannungsteiler sonst schnell mal der größte Verbraucher[1].  Dass man
> das "umsonst" bekommt, ohne externe Beschaltung, ohne Pin, ist nen Bonus
> obendrauf.

Genau. Aber sie hat auch einen kleinen Nachteil: durch die 1/x-Kennlinie 
ist die Auflösung über den Bereich unterschiedlich und insgesamt etwas 
schlechter.

> [1] das zu verhindern, kann kniffelig werden.
In einer anderen Anwendung (Poti-Wert lesen) mit Batteriebetrieb habe 
ich mit einem kleine FET den Teiler nur zur Messung eingeschaltet. 
Kostet halt einen GPIO.

von Stefan F. (Gast)


Lesenswert?

> In einer anderen Anwendung (Poti-Wert lesen) mit Batteriebetrieb habe
> ich mit einem kleine FET den Teiler nur zur Messung eingeschaltet.
> Kostet halt einen GPIO.

Kann man den Spannungsteiler nicht einfach direkt an einen Ausgangs-Pin 
anschließen?

von HildeK (Gast)


Lesenswert?

Stefanus F. schrieb:
> Kann man den Spannungsteiler nicht einfach direkt an einen Ausgangs-Pin
> anschließen?

Ja, geht auch, wenn man noch ein wenig mehr Ungenauigkeit in Kauf nimmt.

von Stefan F. (Gast)


Lesenswert?

Stefanus F. schrieb:
>> Kann man den Spannungsteiler nicht einfach direkt an einen Ausgangs-Pin
>> anschließen?

HildeK schrieb:
> Ja, geht auch, wenn man noch ein wenig mehr Ungenauigkeit in Kauf nimmt.

Falls es dann noch ein bisschen ungenauer sein darf, könnte man sogar 
mit einem I/O Pin auskommen:
1
               10k         22k
2
Ausgang  o----[===]---+---[===]---|
3
und ACD               |
4
                      +-----||----|
5
                          100nF (?)

Zuerst den Ausgang auf High schalten, um den Kondensator zu laden. Dann 
den Ausgang deaktivieren und die Spannung schnell mit dem ADC einlesen.

Ist nur so eine Idee, habe ich nicht ausprobiert.

von HildeK (Gast)


Lesenswert?

Stefanus F. schrieb:
> Ist nur so eine Idee, habe ich nicht ausprobiert.

Sollte man mal tun.
Ich fürchte aber, die 100nF sind etwas wenig, eine Erhöhung wird aber 
die Ladezeit verlängern und damit den Ruhestromverbrauch erhöhen. 
Außerdem wird das Teilerverhältnis eher umgekehrt sein müssen: auch hier 
muss man mit der internen Referenz (1.1V, 2.56V, je nach µC und dessen 
Versorgungsspannung) messen, wenn es um die Batteriespannung geht.
Für mein Beispiel (Poti-Wert lesen) eher schlecht, weil die 
Entladezeitkonstante dann stark von der Poti-Einstellung abhängt.

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.