Attiny45 kann Analogeingang nicht auswerten.

#5677670
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

.
Angehängte Dateien:
Gast #5677684
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.
Gast #5677707
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.
Gast #5677741
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.
Gast #5679259
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.
Gast #5679407
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
Gast #5679464
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.
Gast #5679538
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.
Gast #5679550
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?
(Firma: matzetronics) #5679560
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.
Gast #5679578
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.
Gast #5679666
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 :-).
Gast #5679691
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.
Gast #5679692
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...
Gast #5679736
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.
Gast #5679764
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.
Gast #5680428
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.
Gast #5680498
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.
Gast #5680514
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren