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
intpot=A2;
3
intled0=0;
4
intled1=1;
5
intled2=2;
6
intled3=3;
7
8
voidsetup(){
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
voidloop(){
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
.
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.
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.
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.
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.
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.
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
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.
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.
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
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.
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.
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.
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?
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.
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". ;-)
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.
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 :-).
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.
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...
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.
> 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.
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...
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.
> 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?
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.
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.
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.