Forum: Mikrocontroller und Digitale Elektronik Batterieüberwachung Bandgap vs. AVCC?


von luki (Gast)


Lesenswert?

Hallo Zusammen
ich versuche schon seit mehreren Abenden erfolglos eine AVCC versus 
Bandgap-messung mit einem Attiny 26 durchzuführen. Ziel: wie schon 1000 
mal Versorgungsspannungsüberwachung...

gemäss Attiny26 Manual muss ich MUX1-4 auf 1 Setzen und logischerweise 
die REFS0 & REFS1 auf 0 Setzen

also sieht mein Basic Code wie folgt aus:
blabla= Getadc(&B00011110)

Denke eigentlich soweit richtig.....nur als Wert bekomme ich durchs Band 
weg einen Wert von 470 egal welche Spannung anliegt...

einige Zeilen vorher frage ich mit der Internen Referenz meine ADCs 
ab...funktioniert einwandfrei
blublu= Getadc(&B11000100)

kann es sein, dass ich nicht im gleichen Atemzug eine interne Referenz 
und und eine AVCC als Referenz verwenden kann??? wie müsste ich das dann 
ändern??

Gruss Luki

PS AREF mit 100nf an GND

von Peter D. (peda)


Lesenswert?

Man kann die Bandgap als Eingangsspannung mit VCC als Referenz messen.

Bloß gibts da einen Trick, die Bandgap ist sehr hochohmig, daher sind 
die ersten Messungen ungültig.
Ich mache erstmal 16 Dummy-Messungen der Bandgap, dann gehts.


Peter

von luki (Gast)


Lesenswert?

Danke Peter für das Feedback
verstehe ich das richtig dass ich Pro Messung 16 dummy Messungen machen 
soll? . Es genügt nicht z.b über eine Minute im 1 Sek. Takt zu messen
weil da ändert sich rein gar nichts......

Gruss Luki

von Justus S. (jussa)


Lesenswert?

ich hab jetzt keine Ahnung von Bascom, aber wenn ich die Hilfe richtig 
verstehe, wertet GetADC doch nur die Channelnummer aus, nicht die 
Ref-Bits...

von Benedikt K. (benedikt)


Lesenswert?

Man muss nicht 16x messen, es reicht nach dem Einschalten/Umschalten der 
Referenz ein paar 100µs zu warten.

von luki (Gast)


Lesenswert?

Hm...Danke für euere Antworten.
Scheint, dass ich etwas auf dem Schlauch stehe.

Wenn ich erst einen AD abgefragt habe mit interner Referenz
blublu= Getadc(&B11000100)

und als nächstes ein

Waitus 150

und dann

blabla= Getadc(&B00011110)

aufrufe, bringt das nichts, oder?? weil die Referenzumschaltung wird ja 
erst im Aufruf
blabla= Getadc(&B00011110) gemacht

Gruss Luki

von (prx) A. K. (prx)


Lesenswert?

Dann messen, Ergebnis wegwerfen, 150µs warten, nochmal messen.

von Peter D. (peda)


Lesenswert?

Benedikt K. schrieb:
> Man muss nicht 16x messen, es reicht nach dem Einschalten/Umschalten der
> Referenz ein paar 100µs zu warten.

Mit der Referenz hat das nichts zu tun.

Es ist die Zeit vom Umschalten des ADC-MUX bis die Sample&Hold-Stufe 
umgeladen ist.
Wurde vorher 5V gemessen, sieht man die Meßwerte absinken.
Wurde vorher 0V gemessen, sieht man die Werte ansteigen.

Man könnte auch nur den MUX umschalten und dann warten, bis man die 
Messung startet, sollte funktionieren.


Peter

von Benedikt K. (benedikt)


Lesenswert?

Peter Dannegger schrieb:

> Es ist die Zeit vom Umschalten des ADC-MUX bis die Sample&Hold-Stufe
> umgeladen ist.
> Wurde vorher 5V gemessen, sieht man die Meßwerte absinken.
> Wurde vorher 0V gemessen, sieht man die Werte ansteigen.

D.h. nach dem Umschalten der ADMUX Bits muss man die ersten paar 
Messungen verwerfen?
Kannst du diese Aussage belegen? Ich habe da nämlich andere Erfahrungen 
gemacht (ich lasse den ADC meist kontinuierlich laufen und schalte im 
Interrupt nacheinander alle benötigten Kanäle durch. Demnach müssten 
sich die Eingänge deiner Aussage nach gegenseitig beeinflussen, oder?)

von (prx) A. K. (prx)


Lesenswert?

Es dauert einige Zeit bis eine frisch eingeschaltete Referenz sauber 
funktioniert und das steht auch im Datasheet drin. Vielleicht wird die 
Referenz nur eingeschaltet, wenn ADC oder AC sie wirklich brauchen.

von Peter D. (peda)


Lesenswert?

Benedikt K. schrieb:
> D.h. nach dem Umschalten der ADMUX Bits muss man die ersten paar
> Messungen verwerfen?

Nur bei der Bandgap, weil die hochohmig ist (mehrere Megaohm).
Externe niederohmige Quellen (<100k) liefern sofort ne gültige Messung.

Peter


P.S.:
Die Bandgap ist bei mir immer eingeschaltet, weil ich Brownout brauche, 
damits mir nicht den EEPROM zerschießt.

von Benedikt K. (benedikt)


Lesenswert?

Ok, das könnte natürlich eine Erklärung sein. Hast du zufällig eine Zahl 
wie stark die erste Messung vom richtigen Wert abweicht?

von Peter D. (peda)


Lesenswert?

Benedikt K. schrieb:
> Ok, das könnte natürlich eine Erklärung sein. Hast du zufällig eine Zahl
> wie stark die erste Messung vom richtigen Wert abweicht?

Gemessen mit ATtiny25:

228
228
228
228
Channel: 1 (external signal near VCC)
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
Channel: 12 (internal Bandgap)
774
350
264
229
229
229
229
228
228
228
228
228
228
228
228
228


Peter

von Benedikt K. (benedikt)


Lesenswert?

Oh, das ist heftig. Ich hätte nicht gedacht, dass die Werte derart 
falsch sind. Gut zu wissen wenn ich das mal verwende. Sowas könnte Atmel 
auch mal im Datenblatt erwähnen...

von Justus S. (jussa)


Lesenswert?

luki schrieb:

> aufrufe, bringt das nichts, oder?? weil die Referenzumschaltung wird ja
> erst im Aufruf
> blabla= Getadc(&B00011110) gemacht

so wie ich die Hilfe zu Getadc verstehe, ändert das die Referenz doch 
gar nicht? meines Erachtens ist es schnuppe, ob du (&B00011110) oder 
(&B11011110) schreibst, die Funktion wertet nur die MUX-Bits aus...

von (prx) A. K. (prx)


Lesenswert?

Damit ist nicht die Umschaltung der ADC-Referenz gemeint, sondern die 
Umschaltung des Muxers auf die Bandgap-Referenz als zu messenden 
Analogwert. Eben um VCC zu messen: mit AVCC als Referenz die Bandgap 
messen und umrechnen.

von Justus S. (jussa)


Lesenswert?

A. K. schrieb:
> Damit ist nicht die Umschaltung der ADC-Referenz gemeint, sondern die
> Umschaltung des Muxers auf die Bandgap-Referenz als zu messenden
> Analogwert. Eben um VCC zu messen: mit AVCC als Referenz die Bandgap
> messen und umrechnen.

schon klar, aber so wie ich seinen Code verstehe, will der doch 
gleichzeitig mit dem Channelwechsel auch die Referenz ändern...und ich 
kann aus der Bascom-Hilfe nicht ersehen, dass dies gehen sollte. Dazu 
müsste man kurz mal in den Assembler-Code schauen, wie dort das Register 
gesetzt wird...

von (prx) A. K. (prx)


Lesenswert?

Über seinen Code kann ich nichts sagen, weil der mir nicht bekannt ist. 
Die Schnipsel oben sind dafür nicht aussagekräftig genug und meine 
Glaskugel streikt.

von Justus S. (jussa)


Lesenswert?

A. K. schrieb:
> Über seinen Code kann ich nichts sagen, weil der mir nicht bekannt ist.
> Die Schnipsel oben sind dafür nicht aussagekräftig genug und meine
> Glaskugel streikt.

schon klar...aber er schreibt eben:

> die REFS0 & REFS1 auf 0 Setzen
>
> blabla= Getadc(&B00011110)

und

> Internen Referenz meine ADCs
>
> blublu= Getadc(&B11000100)

als ob der Channelwert einfach ins ADMUX geschrieben wird..kann aber 
eigentlich nicht sein, da es ja auch AVRs gibt, bei denen es noch MUX5 
und REFS2 gibt...

von luki (Gast)


Lesenswert?

Hallo zusammen
Danke vielmal für eure wertvollen Beiträge!

Justus Skorps schrieb:
>schon klar, aber so wie ich seinen Code verstehe, will der doch
>gleichzeitig mit dem Channelwechsel auch die Referenz ändern

Absolut Richtig...das will ich!
Wie oder was muss ich dann ändern

A. K. schrieb:
>Über seinen Code kann ich nichts sagen, weil der mir nicht bekannt ist.
>Die Schnipsel oben sind dafür nicht aussagekräftig genug und meine
>Glaskugel streikt

Sorry das war nicht mein Ziel. Ich bin einfach absolut ein Neuling in 
dem Bereich... Der Code sieht wirklich nicht anders aus...
1
 
2
Config ADC =Single , Prescaler =Auto
3
'(vielleicht ist hier der Fehler ...muss der ADC = FREE sein)
4
Start ADC
5
On ADC _ADC Nosave
6
7
.
8
.
9
.
10
11
ersterWert=Getadc(&B1100001)
12
ZweiterWert=Getadc(&B11000010)
13
BandGapWert=Getadc(&B00011110)' Achtung REFS1&REFS0 für AVCC

Gruss Luki

von Justus S. (jussa)


Lesenswert?

luki schrieb:

> Absolut Richtig...das will ich!
> Wie oder was muss ich dann ändern

Wie gesagt, ich benutze kein Bascom und kann dir nicht sicher sagen, 
dass deine Methode nicht funktioniert oder das sie deinen Fehler 
produziert. Aber eigentlich übergibt man Getadc() nur den Channel, also 
eine Zahl zwischen 0 und 15(?). Die Referenz stellt man über Config ADC 
ein, siehe http://avrhelp.mcselec.com/index.html?config_adc.htm

von luki (Gast)


Lesenswert?

Danke Justus

Langsam gehen mir die Augen auf!

>so wie ich die Hilfe zu Getadc verstehe, ändert das die Referenz doch
>gar nicht? meines Erachtens ist es schnuppe, ob du (&B00011110) oder
>(&B11011110) schreibst, die Funktion wertet nur die MUX-Bits aus...

was heisst denn "wertet nur die MUX-Bits" aus? Was KÖNNTE ich damit dann 
anfangen??

Gruss Luki

von Justus S. (jussa)


Lesenswert?

luki schrieb:

> was heisst denn "wertet nur die MUX-Bits" aus? Was KÖNNTE ich damit dann
> anfangen??

eben den Kanal/Pin einstellen, welcher geADCt werden soll

von luki (Gast)


Lesenswert?

Du hast mich falsch verstanden.
Die Frage was mir die REFS Bit bringen, der Rest ist klar?

Aber zurück zum Topic:
Also muss ich den ADC eigentlich erst Stoppen und neu starten mit der 
neuen Config

Config ADC =Single , Prescaler =Auto , Reference = AVCC

und dann die BANDGAP Messung machen und danach den ADC wieder stoppen 
und wieder mit Internal Reference starten...


Poahh ob das gut geht? Muss ich warscheinlich erst testen

Gruss Luki

von Justus S. (jussa)


Lesenswert?

luki schrieb:

> Die Frage was mir die REFS Bit bringen, der Rest ist klar?

Die stellen schon die Referenz ein. Allerdings ist das imo der 
Getadc()-Funktion egal, die nimmt nur die untersten Bits von dem Wert, 
den sie bekommt, und stellt damit den Channel ein. kA ob man in Bascom 
auch Register direkt beschrieben kann, dann könnte man Channel & 
Referenz gleichzeitig einstellen...könnte dann aber wahrscheinlich den 
Rest der Getadc-Funktion nicht benutzen...

von luki (Gast)


Angehängte Dateien:

Lesenswert?

Hurra!
Endlich funktioniert mal ein erster Versuch

und zwar habe ich es wie oben erwähnt hingekriegt:
1
Config ADC =Single , Prescaler =Auto '(keine Reference = Internal)
2
Start ADC
3
4
.
5
.
6
.
7
8
ersterWert=Getadc(&B1100001)
9
ZweiterWert=Getadc(&B11000010)
10
11
STOP ADC
12
Config ADC =Single , Prescaler =Auto , Reference=AVCC
13
Start ADC
14
waitus 200
15
16
BandGapWert=Getadc(&B00011110)' Achtung REFS1&REFS0 für AVCC
17
18
Stop ADC
19
Config ADC =Single , Prescaler =Auto '(keine Reference = Internal)
20
Start ADC
21
waitus 200


nur schwingen nun die "normalen Eingänge" durch das ein und ausschalten 
des ADCs wie die Sau
Siehe angehängtes Bild

von luki (Gast)


Lesenswert?

Uups die Aussage mit dem Schwingen war falsch!
Lag nur daran dass sie nicht terminiert waren!!

Gruss Luki

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.