Forum: Mikrocontroller und Digitale Elektronik attiny85 - ADC Wert hängt stark von VCC ab


von Michael H. (blubbla)


Lesenswert?

Liebe Profis,

ich experimentiere gerade mit ADC Messungen an einem attiny85. Beispiel: 
single ended Messung einer über einen Spannungsteiler angelegten 
Spannung. Interne Referenz 2,56V, Prescaler so, dass der ADC mit 125kHz 
getaktet wird.

Wenn ich nun bei konstanter Messspannung die Versorgungsspannung 
variere, z.B. zwischen 3V und 5V, bekomme ich ziemlich unterschiedliche 
Messwerte. Sieht so aus als ob die interne Referenz nicht stabil ist. 
Mache ich etwas falsch? Ich dachte die interne Referenz soll genau das 
sein: eine stabile Spannungsreferenz.

Um Fehler in meiner Minimalaußenbeschaltung auszuschließen, habe ich 
versucht die interne Temperatur zu messen (MUX = 1111). Genau das 
gleiche. Der AD Wert ist bei VCC 3V 290, bei VVV 5V 240. Verstehe ich 
nicht.

Wäre dankbar für jede Erklärung und Hilfe.

Danke

Michael

von Kümmelkorn H. (mrcrabs_muh)


Lesenswert?

du musst aref mit ner anderen stabilisierten 5V spannung betreiben, 
sonst ist klar, dass das schwankt

von Ingo L. (Gast)


Lesenswert?

Die intene Referenz ist ein Schätzeisen. Nimm eine externe an einer 
stabilen Spannung.

von error (Gast)


Lesenswert?

Siehe Datenblatt Seite 196 Abbildung 22-36

von Michael H. (blubbla)


Lesenswert?

Danke Euch. Das VCC/VRef Diagramm hatte ich schon gesehen. Mich wundert 
nur die riesige Abweichung, z.B. bei der Messung der internen 
Temperatur.
Bei Zimmertemperatur: 290-230 bei 3V-5V Eingansspannung.

Wenn ich die Kennlinie für 25 Grad nehme, hätte ich von 3V bis 5V -> 
1,15V bis 1,09V VREF. Das wären, wenn ich richtig rechne so ummara 5%. 
Nehme ich den AD Wert bei 3V 290 und ziehe 5% ab, käme ich auf 275. 
Irgendetwas stimmt da nicht.

von error (Gast)


Lesenswert?

>Wenn ich die Kennlinie für 25 Grad nehme, hätte ich von 3V bis 5V ->
>1,15V bis 1,09V VREF.
Da warst du zu großzügig, bei 3 Volt ist die Linie bei 1,11 Volt.
Also sollte die Abweichung nur ca. 1,9 % groß sein.

Da du von Single Mode sprichst:
Laut Datenblatt ist die erste Messung wenn man Vref wechseln vom Adc 
ungenau und sollte verworfen werden.

Ist Vref eingestellt mit oder ohne Kondensator?

Ist der Abblockkondensator nahe des Tiny vorhanden?

von TomTom (Gast)


Lesenswert?

Also mittes Präzisions-Referenzdiode (LMxxx - hab die Type vergessen) 
und einem Filter (L-C) habe ich bisher immer sehr gute Ergebnisse 
erzielt.

von Michael H. (blubbla)


Lesenswert?

error schrieb:
>>Wenn ich die Kennlinie für 25 Grad nehme, hätte ich von 3V bis 5V ->
>>1,15V bis 1,09V VREF.
> Da warst du zu großzügig, bei 3 Volt ist die Linie bei 1,11 Volt.
> Also sollte die Abweichung nur ca. 1,9 % groß sein.
>
> Da du von Single Mode sprichst:
> Laut Datenblatt ist die erste Messung wenn man Vref wechseln vom Adc
> ungenau und sollte verworfen werden.
>
> Ist Vref eingestellt mit oder ohne Kondensator?
>
> Ist der Abblockkondensator nahe des Tiny vorhanden?

Danke Euch vielmals für Eure Antworten.

@error
Ich meinte single ended Messung (vs differentiell), d.h. PB2 gegen GND 
in meinem Fall. Gemessen wird jede Millisekunde mit einem 20 Werte 
gleitenden Mittelwert.

VRef ist 2,56V ohne Kondensator (REF 110), kein Kondensator zw. VCC und 
GND. Wollte eine minimalst Außenbeschaltung. Versorgt wird aus einer 
Batterie, gemessen wird ebenfalls eine Batterie mit höherer Spannung als 
VCC. Beide auf gemeinsamer Masse.

Werde das aber mal mit Kondensatoren probieren.

@TomTom
Könntest Du dazu eine kleine Skizze anhängen?

von Jürgen L. (jliegner)


Lesenswert?

Für die 2,56V Referenz muss die min. Betriebsspannung 3V betragen. Liegt 
deine 3-V Messung eventuell im Grenzbereich?

von Michael H. (blubbla)


Lesenswert?

Jürgen Liegner schrieb:
> Für die 2,56V Referenz muss die min. Betriebsspannung 3V betragen. Liegt
> deine 3-V Messung eventuell im Grenzbereich?

Bin nicht ganz auf 3V runter gegangen. Auch zwischen 3,5 und 5V ist die 
Veränderung sehr stark und sieht fast proportional zur Änderung VCC aus.

von Falk B. (falk)


Lesenswert?

@  Michael H. (blubbla)

>Bin nicht ganz auf 3V runter gegangen. Auch zwischen 3,5 und 5V ist die
>Veränderung sehr stark und sieht fast proportional zur Änderung VCC aus.

Dann ist was faul. Die Referenz ist schon sehr konstant, wenn gleich sie 
eine hohe, jedoch KONSTANTE Toleranz nach der Produktion hat. Kann man 
leicht rauskalibrieren.

MFG
Falk

von Dietrich L. (dietrichl)


Lesenswert?

Michael H. schrieb:
> Werde das aber mal mit Kondensatoren probieren.

Ohne Kondensatoren sollte man nie arbeiten - der Spareffekt steht in 
keinem Verhältnis zu der Möglichkeit von Fehlverhalten.

Andere Frage: Wie hochohmig ist der Spannungsteiler der zu messenden 
Spannung? Hier kannst Du testweise auch mal einen 100nF zwischen 
A/D-Eingang und GND schalten.

Gruß Dietrich

von Michael H. (blubbla)


Lesenswert?

Hallo Dietrich,

60K und 10K Spannungsteiler. Abgriff zw. 60k und 10k, Messspannung an 
60k, 10k an GND.

VG Michael

von Dietrich L. (dietrichl)


Lesenswert?

Michael H. schrieb:
> 60K und 10K Spannungsteiler.

Das sollte niederohmig genug sein, aber Test mit Kondensator solltest Du 
mal machen.

Gruß Dietrich

von error (Gast)


Lesenswert?

>Versorgt wird aus einer Batterie, gemessen wird ebenfalls eine Batterie mit 
>höherer Spannung als VCC. Beide auf gemeinsamer Masse.
Sorry aber das Verstehe ich nicht ganz, mach mal ein Beispiel.
Der Adc kann doch nicht eine höhere Spannung messen wie Vcc ist...

>60K und 10K Spannungsteiler
Ich weiss jetzt nicht wie das beim Tiny ist aber beim Atmega8 steht 
folgendes im Datenblatt:
"The ADC is optimized for analog signals with an output impedance of 
approximately 10 kΩ or less."
Eventuell hilft hier den S&H Kondensator länger aufladen zu lassen in 
dem man mit der Adc Frequenz ein wenig zurückgeht.

Die Versorgungsspannung des Spannungsteilers bleibt schon gleich wenn du 
die Versorgungsspannung von dem Tiny änderst?
Sprich sie sind unabhängig von einander.

von error (Gast)


Lesenswert?

P.s.:
Wenn du den Programmausschnitt mit der Initialisierung des Adc zeigst 
könnt man ihn auf Fehler überprüfen.

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


Lesenswert?

error schrieb:
> "The ADC is optimized for analog signals with an output impedance of
> approximately 10 kΩ or less."

Genau das steht auch beim Tiny25/45/85 Datenblatt 12/06 auf Seite 133.

von Michael H. (blubbla)


Angehängte Dateien:

Lesenswert?

Danke für Eure Mühe. Anbei eine Skizze meiner externen Beschaltung nach 
Versuch mit Kondensator. Vin und Vcc sind unabhängig, aber auf der 
gleichen Masse.

Um das einzukreisen, habe ich aber auf den internen Temperatursensor 
geschalten. (MUX 1111). Damit entfällt zunächst die Frage nach Impedanz 
des Spannungsteilers und ob VRef mit (REFS 111) oder ohne externem 
Entkoppelkondensator (REFS 110) gewählt ist.

Mit Kondensator zwischen VCC und GND sind die Fehler in der 
Temperaturmessung bei Zimmertemperatur und Variation von VCC zwischen 4V 
und 5.5V schon mal deutlich besser, sind aber immer noch 7,5%.

Bei 4V lese ich einen ADC Wert von 283 (ohne Kondensator 270)
Bei 5.5V lese ich einen ADC Wert von 262 (ohne Kondensator 228)

Zur Software. Ich initialisiere den ADC und anschließend eine 2ms Timer 
Interruptroutine. In der Interruptroutine laufen verschiedene Tasks. 
Alle 50 Interrupts (also 100ms, nicht wie ich oben geschrieben habe 1ms) 
wird Vin dann gemessen und in einen 20 Werte gleitenden Mittelwert 
verrechnet. Da der ADC in der Interruptroutine gestartet und gelesen 
wird, gibt es von außen keine Störungen.

Initialisierung nach power up:

ADCSRA = 0b10000110;                // set ADEN and 1/64 prescaler
ADCSRB = 0b00000000;                // clear ADCSRB
ADMUX  = 0b10010001;                 // set 2.56V reference and singled 
ended input on ADC1 (PB2)

Zyklisch alle 100ms:

ADCSRA = ADCSRA | 0b01000000;    // start conversion
while (bit_is_set(ADCSRA, ADSC));     // wait for conversion finished
low  = ADCL;                                     // get results
high = ADCH;                                    // get results

für die Testmessung der interne Temperatur wird so initialisiert:

ADCSRA = 0b10000110;                // set ADEN and 1/64 prescaler
ADCSRB = 0b00000000;                // clear ADCSRB
ADMUX  = 0b10001111;                 // set 1.1V reference and int temp 
sensor

von error (Gast)


Lesenswert?

>Kondensator zwischen VCC und GND
Der Kondensator ist ein 100 nF Kerko?

Die Init und das auslesen sieht Ok aus, daran sollte es nicht liegen.

Sind die Lötstellen Ok?

>In der Interruptroutine laufen verschiedene Tasks.
Teste den Adc mal ohne restliches Programm, nicht das es an einem 
Überlauf oder verschluckten Interrupt liegt.

von Michael H. (blubbla)


Lesenswert?

error schrieb:
>>Kondensator zwischen VCC und GND
> Der Kondensator ist ein 100 nF Kerko?
>
> Die Init und das auslesen sieht Ok aus, daran sollte es nicht liegen.
>
> Sind die Lötstellen Ok?
>
>>In der Interruptroutine laufen verschiedene Tasks.
> Teste den Adc mal ohne restliches Programm, nicht das es an einem
> Überlauf oder verschluckten Interrupt liegt.

Hallo error,

ja, 100nF Keramik. Ich habe das auf dem Steckbrett und auf einer kleinen 
Lochrasterplatine (mit Fassung) aufgebaut.Verhalten sich beide 
identisch.

Habe um die Interruptroutine zu testen mit einem toggle an einem Output 
Pin versehen. Logicanalyzer sagt alles i.O. Keine Überläufe (Testoutput 
auch in der Endlosschleife Main. Ca. 65% Prozessorlast, d.h. der 
Prozessor verbringt ca. 35% seiner Zeit in der Endlossschleife Main Die 
Messungen an sich sind ja in Ordnung. Stabile Werte ohne große 
Schwankungen bei konstanter Vcc.

Und falls ein Interrupt verloren gehen würde, sollte auch nichts 
passieren. Dann wird halt in diesem Zyklus überhaupt keine Messung 
gestartet.

VG Michael

von error (Gast)


Lesenswert?

Sorry, einen Versuch noch ins Blaue aber dann bin ich mit meinem Latein 
am ende.

>Mit Kondensator zwischen VCC und GND sind die Fehler in der
>Temperaturmessung bei Zimmertemperatur und Variation von VCC zwischen 4V
>und 5.5V schon mal deutlich besser, sind aber immer noch 7,5%.
Du sagst der Tiny wird mit einer Batterie versorgt, vielleicht schafft 
diese zu wenig Impulsstorm und der 100 nF ist auch gleich leer...
Eventuell hilft ein Elko mit ein paar µF parallel zu dem Kerko oder mal 
Brownout versuchen.

von Michael H. (blubbla)


Lesenswert?

error schrieb:
> Sorry, einen Versuch noch ins Blaue aber dann bin ich mit meinem Latein
> am ende.
>
>>Mit Kondensator zwischen VCC und GND sind die Fehler in der
>>Temperaturmessung bei Zimmertemperatur und Variation von VCC zwischen 4V
>>und 5.5V schon mal deutlich besser, sind aber immer noch 7,5%.
> Du sagst der Tiny wird mit einer Batterie versorgt, vielleicht schafft
> diese zu wenig Impulsstorm und der 100 nF ist auch gleich leer...
> Eventuell hilft ein Elko mit ein paar µF parallel zu dem Kerko oder mal
> Brownout versuchen.

Denke nicht, dass die Batterie ein Problem hat. Wie gesagt, die 
Messungen sind absolut ok und stabil, solange sich die Eingangsspannung 
nicht ändert.

Das mit dem Elko werde ich aber trotzdem probieren.

Was meinst Du mit "brownout versuchen"?

@all: hat jemand eine simple und stabile Beschaltung (z.B. für VRef) des 
attiny zur halbwegs sauberen und temperaturunabhängigen AD Messung?

von error (Gast)


Lesenswert?

>Was meinst Du mit "brownout versuchen"?
Die Brownout Fuse, dass ein Reset erfolgt falls die Versorgungsspannung 
in einen Bereich kommt in dem er nicht mehr richtig arbeitet.

>hat jemand eine simple und stabile Beschaltung (z.B. für VRef)
http://www.mikrocontroller.net/articles/Standardbauelemente#Shuntregler.2FSpannungsreferenz

von Michael H. (blubbla)


Lesenswert?

Hallo,

habe jetzt einen Versuch mit einem LM336-2.5 an einem 2,5K Widerstand 
als externe Referenz (REFS: 001) gemacht. Und siehe da, alles stabil. 
Kein Einfluss der Versorgungsspannung mehr. Etwa 40 Grad 
Temperaturunterschied machen etwa 2 Digits aus. Damit kann ich gut 
leben.

Ist also scheinbar wirklich so, dass die interne Referenzspannung meiner 
Attiny85 (habe zwei probiert) für die Tonne ist. Könnt ihr das 
bestätigen?

Zum LM336-2.5 hätte ich noch eine Frage: kann man den ADJ Eingang offen 
lassen. Lt. Datenblatt geht das scheinbar. Den Abgleich der 
Referenzspannung bräuchte ich nicht, da ich ohnehin in Software 
kalibriere.

Danke nochmal an alle, die mitgeholfen haben.

VG Michael

von error (Gast)


Lesenswert?

>Ist also scheinbar wirklich so, dass die interne Referenzspannung meiner
>Attiny85 (habe zwei probiert) für die Tonne ist. Könnt ihr das
>bestätigen?

Komische Sache, woran das nur liegen mag, mangels Tiny85 kann ich den 
leider nicht testen...

Normalerweise ist es aber schon so wie Falk Brunner treffend sagte:
"Die Referenz ist schon sehr konstant, wenn gleich sie
eine hohe, jedoch KONSTANTE Toleranz nach der Produktion hat."

>kann man den ADJ Eingang offen lassen. Lt. Datenblatt geht das scheinbar.
Ja, der soll offen bleiben wenn kein Abgleich nötig ist.

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.