Erledigt Fehlerhafte Messung des ADC beim Attiny45V

Bobbl

Neues Mitglied
15. März 2009
22
0
1
Frankenthal, Rheinland-pfalz, Germany
Sprachen
  1. BascomAVR
  2. Assembler
Hallo zusammen,

ich habe ein Problem mit dem ADC des Attiny45V, bei dem ich allein nicht mehr weiter komme. So wie es aussieht, misst der Kontroller Mist. Für eine Akkuüberwachung soll er die Spannung erfassen und bei zu niedriger Spannung die Last abschalten und ein erneutes Einschalten verhindern. Bei den ersten Tests, wurde aber erst bei einer niedrigeren Spannung abgeschaltet, als es vom Programm her sein sollte. Um Schaltungsfehler auszuschließen, wurde der Kontroller mit einer Minimalversion von Hard- und Software (siehe Schaltplan und Listing) getestet. Ein Minimalprogramm erfasst die Spannung die an ADC3 ( Pin2) anliegt und sendet sie über eine softwaremäßige serielle Schnittstelle an einen PC. Dabei ist aufgefallen, dass der Digitalwert nicht mit dem gemessenen Analogwert an Pin 2 übereinstimmt.

Analogwert Digitalwert

0,8040V 790 > 0,8486V

0,8925V 897 > 0,9635V

1,0027V 975 > 1,0473V

Wenn ihr einen Tipp habt, woran das Verhalten liegen könnte, ich bin für jeden Hinweis dankbar
LG Volker



CodeBox BascomAVR
'***************************************************************
'*ADC Messung
'*
'***************************************************************
$regfile "ATtiny45.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40
'***************************************************************
'* Definition Variablen
'***************************************************************
 Dim Spannung As Word  ' Wert Akkuspannung

'***************************************************************
'* ADC Konfiguration
'* Adc wird mit interner Referenz von 1,1 Volt betrieben
'* das bedeutet eine Auflösung von 0,001075 V / Bit
'*
'*
'**************************************************************
Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1
Start Adc
Baud = 1200
Open "comb.1:1200,8,n,1" For Output As #2

Waitms 500

Do
Spannung = Getadc(3)
Print #2 , Spannung

Waitms 1000

Loop


Schaltplan Messschaltung.JPG
 
Hi,

das kann schon so passen. Rechnerisch sieht das alles immer einfach aus. Wenn dann aber Toleranzen zB der Widerstände in deinem Spannungsteiler oder Toleranzen in der Referenzspannung des Tinys dazukommen, dann sieht das alles schon wieder ganz anders aus.

Ich hab auch mal die Batteriespannung einer Schaltung messen müssen. Für sowas baut man sich dann ein paar Zeilen für die Kalibrierung ein.
Also Nullpunkt und Steigung der Wandlungskurve änderbar mache. Sieh mal ins Datenblatt. Da steht auch was von Wandlungsfehlern drin.

Der Tiny ist kein fertig kalibriertes super genaues Multimeter ;)

Gruß
Dino
 
Hallo Dino.

Ein Fehler durch den Spannungsteiler fällt hier nicht ins Gewicht. Der Analogwert wurden direkt an Pin 2 ( ADC3) gemessen. Dass der Attiny45 kein Präzisionsinstrument ist, ist mir schon klar. Wenn ich das Datenblatt richtig verstanden habe, reden wir von einem maximalen Fehler in der Größenordnung von 3 Bit (Seite 122 Datenblatt - 1 LSB Integral Non-linearity ± 2 LSB Absolute Accuracy) . In meinem Fall ist der Fehler aber deutlich größer.

Analogwert___Digitalwert_____entspricht________Fehler in V / Bits

0,8040V______790___________0,8486V_________-0,0446V / 41 Bits

0,8925V______897___________0,9635V_________-0,071V / 66 Bits

1,0027V______975___________1,0473V_________-0,0446V / 41 Bits

Die Wertigkeit pro Bit liegt bei einer Referenzspannung von 1,1 V bei 1,074 mV/Bit.

Gruß Volker
 
Zuletzt bearbeitet:
Du verwendest Wait. Nutz lieber den ADC Interrupt und "parke" den Tiny in den Sleep Modus (ADC Noise Reduction). Dann läuft die CPU nur dann wenn sie benötigt wird und stört somit den ADC weniger. Bei Wait rennt die CPU dauerhaft irgendwelche Schleifen ab um (aus Sicht der Hardware) sinnlos Zeit zu fressen.
Das bringt schon etwas.

Mit Prescaler auf Auto wird glaube ich immer die höchstmögliche Frequenz für den ADC genommen, ist häufig aber nicht nötig. Bei langsamen Frequenzen laufen die meist besser. Willst ja kein Oszilloskop bauen ;)

Dann könntest du auch noch den Durchschnittswert aus mehreren Messungen nehmen. Zumindest jetzt fragst du ja nur 1x die Sekunde ab. Sammle z. B. 32 Werte (in Variable addieren). Sind 32 Werte gesammelt teilst du die, gibt die aus und setzt den Wert und Zähler wieder auf 0.

Dann kann man noch mit Kalibrierungstabellen oder Schwellwerten arbeiten die im EEPROM gespeichert sind, als Feintuning. Ist so in der Art was @dino03 schon sagte. (Könnte man auch im Programm selbst umsetzen, im EEPROM find ich aber schöner, da man so die Werte ändern kann ohne jedes Mal neu kompilieren zu müssen)

Thema saubere Versorgungsspannung ist ja schon gefallen. Abblock Kondensatoren nicht vergessen, ggf. auch nicht den am Aref Pin.
 
Hatten wir beim Tiny25/45/85 nicht schon mal die Frage, ob bei gewählter 1V1-Referenz B0 konventioneller I/O ist, oder Aref (für 'nen Abblockkerko)?
Bei 2V65 gibt's ja beides...
Beim Durchschnitt gehen auch sehr schön 256 Samples - da vergisst man dann einfach das untere Byte nach dem integrieren...
 
Zuletzt bearbeitet:
Hatten wir beim Tiny25/45/85 nicht schon mal die Frage, ob bei gewählter 1V1-Referenz B0 konventioneller I/O ist, oder Are (für 'nen Abblokkerko)?

Ja, ich meine auch, dass bei der 1,1V Referenz der VREF Pin nicht verwendet wird, also kein Pufferkondensator. Die 1,1V Referenz hat auch Fehlergrenzen, abhängig von der Betriebsspannung und der Temperatur. Grob sind das +/- 100mV über den VCC- und Temperaturbereich.
 
Das ging aus dem Datenblatt nicht so recht hervor (flüchtiger Blick).
Vorschlag war, einfach mal den offenen Pin bei gewählter Referenz zu messen.
 
Hast du denn mal mit einem "hochwertigen" Multimeter die Spannung vor und zwischen dem Spannungsteiler gemessen?
 
Hallo zusammen.

Danke für eure Tipps und Ratschläge.

@LotadaC, @Dirk

An die 1,1V – Referenz kommt man direkt leider nicht heran. Das geht nur bei der 2,56V Referenz. Die kann man auf Pin 5 legen. Ich hab mal das Datenblatt gewälzt und eine Formel gefunden mit der man die Referenzspannung berechnen kann.
Vref= (Vin *1024)/Wert ADC
Wenn man Werte einsetzt kommt man auf eine Referenzspannung von 1,042V. Ich habe auch mal die andere Referenz auf dem Pin 5 gelegt und nachgemessen. Statt 2,56 V liegt der Wert bei 2,40V. Das liegt aber noch im Rahmen. Die erlaubte Differenz liegt laut Datenblatt bei +-10%. Da liegt wohl das Problem. Ich war immer der Meinung, die Referenzen bei den AVRs wären genauer. Aber man lernt nie aus ;-). Atmel hat die Angaben gut im Datenblatts versteckt.

@TommyB

Ich werde den ADC über den Prescaler langsamer laufen lassen. Ich möchte wirklich keinen Oszi bauen ;-) . Die Sache mit der ADC Noise Reduktion werde ich mir auf jeden Fall zu Gemüte führen.

@Janiiix3

Hab ich.

Nochmal vielen Dank für eure Hilfe
 
Die 2V56-Referenz kann man auf B0 schalten, um sie dort zur Stabilisierung (extern) abzupuffern. Man sollte sie dort also nicht belasten (was wir hier allerdings trotzdem mal gemacht haben (@TommyB ?))
Bei der 1V1 läßt sich dem DB nicht konkret entnehmen, ob da ein Puffer an B0 erwartet wird - Dirk und ich vermuteten nicht. Danke fürs nachmessen.

Wegen der Genauigkeit: wie genau ist Dein Multimeter?
Wenn die Umgebungsbedingungen nicht sehr schwanken, kannst Du die tatsächliche Referenzspannung ermitteln, und in der Software berücksichtigen.
Oder eben 'ne genauere externe Referenz verwenden.

P.S.: Das schöne an der 2V56 ist, daß sie für die weitere Verrechnung so'ne schöne Zweierpotenz ist...
 
National S.: LM385Z-2.5
ONS: LM385Z-2.5G/NOPB
Texas Instr.: LM385LP-2-5


TO92
 
Man sollte sie dort also nicht belasten (was wir hier allerdings trotzdem mal gemacht haben (@TommyB ?))
Jupp, hab ich, aber die 1V1 vom Mega xx8 Serie, glaube 168 wars. Aber waren ja nur Maximum 200µA. 1mA hat er ja noch geschafft, dann war Ende.
Allerdings hab ich den ADC selbst dabei nicht verwendet, von daher gut möglich dass auch schon bei geringer Last die Messwerte einbrechen was die Qualität angeht. Man sollte es nicht übertreiben :)
Für das Projekt wars ok, für Andere wär eine vernünftige Referenzspannungsquelle die bessere Wahl.
 
@LotadaC
So wie ich das Datenblatt verstanden habe, wird bei der 1,1V Referenz kein Kondensator an Pin 5 ( PB0) angeschlossen. Bei der 2,56V Refernz kann man wählen, ob man einen Kondensator an Pin 5 anschließen möchte oder nicht.
Mein Digitalmultimeter hat bei Gleichspannungsmessung im Messbereich 4V eine Genauigkeit von +-(0,08% +10dgt) bei einer Auflösung von 40.000 dgt.

@Janiiix3
Danke für deinen Tipp. Sind schon bestellt.
 
Ja, habs jetzt auch gefunden (17.3):
The voltage reference for the ADC may be selected by writing to the REFS[2:0] bits in ADMUX. The VCC supply, the AREF pin or an internal 1.1V / 2.56V voltage reference may be selected as the ADC voltage reference. Optionally the internal 2.56V voltage reference may be decoupled by an external capacitor at the AREF pin to improve noise immunity.
Bei den Alternate Port Functions fand sich nur:
AREF: External Analog Reference for ADC. Pullup and output driver are disabled on PB0 when the pin is used
as an external reference or Internal Voltage Reference with external capacitor at the AREF pin.
Laut Tabelle 10-5 beeinflußt nur das Signal USI_TWO_WIRE PUOE (Pullup Override Enable) und DDOE (Data Direction Override Enable) - bezüglich Aref/ADC ist da gar nichts zu finden...

Bei anderen Controllern kann das natürlich anders sein (beim Tiny441/841 z.B. kann für jede der drei internen Referenzen ein externer Kerko draufgeschaltet werden - der neue Tiny102/104 hat hingegen gar keinen Aref-Pin. Trotz der drei Referenzen. Die Electrical Characteristics sind leider noch nicht im Datenblatt...)
 
Zuletzt bearbeitet:
Hallo zusammen.

Sorry, dass ich eine Weile nichts von mir hab hören lassen. Aber man hat leider noch andere Sachen, die erledigt werden müssen ;-). Das Problem ist mittlerweile gelöst. Ich habe, wie Janiiix3 vorgeschlagen hatte, eine externe Referenz des Typs LM385Z-2.5 genommen und an Pin 05 angeschlossen. Das Ganze funktioniert prima und die Messungen sind wesentlich genauer, als mit der eingebauten Referenz im Kontroller. Was vielleicht im Bezug auf die externe Referenz noch ganz interessant ist, sie muss größer als 2 V sein ( Datenblatt Seite 167 / unten ).

Noch einen schönen Pfingstmontag
LG Volker
 
Zuletzt bearbeitet:

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)