www.mikrocontroller.net

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


Autor: luki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: luki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: luki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann messen, Ergebnis wegwerfen, 150µs warten, nochmal messen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: luki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...
 
Config ADC =Single , Prescaler =Auto
'(vielleicht ist hier der Fehler ...muss der ADC = FREE sein)
Start ADC
On ADC _ADC Nosave

.
.
.

ersterWert=Getadc(&B1100001)
ZweiterWert=Getadc(&B11000010)
BandGapWert=Getadc(&B00011110)' Achtung REFS1&REFS0 für AVCC

Gruss Luki

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: luki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: luki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: luki (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hurra!
Endlich funktioniert mal ein erster Versuch

und zwar habe ich es wie oben erwähnt hingekriegt:

Config ADC =Single , Prescaler =Auto '(keine Reference = Internal)
Start ADC

.
.
.

ersterWert=Getadc(&B1100001)
ZweiterWert=Getadc(&B11000010)

STOP ADC
Config ADC =Single , Prescaler =Auto , Reference=AVCC
Start ADC
waitus 200

BandGapWert=Getadc(&B00011110)' Achtung REFS1&REFS0 für AVCC

Stop ADC
Config ADC =Single , Prescaler =Auto '(keine Reference = Internal)
Start ADC
waitus 200



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

Autor: luki (Gast)
Datum:

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

Gruss Luki

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.