ADC-Test-Programm für AVR-Microcontroller

Seitenübersicht



 www.schramm-software.de

Für den Hobby-Bastler vielleicht der interessanteste Aspekt an Microcontrollern besteht darin, dass diese Bausteine gewissermaßen die analoge und die digitale Welt miteinander verbinden können. Sogar die kleinen und preiswerten µC aus der AVR-Tiny-Reihe wie bspw. der ATtiny13 verfügen über einen Analog-Digital-Wandler (ADC) sowie einen Analog-Komparator (AC) und damit über ausgesprochen leistungsfähige Komponenten, um Messwerte aus der analogen Welt (in Form elektrischer Spannungen) in die digitale Arbeitswelt des Prozessors zu übertragen.

Hier soll es darum gehen, den ADC einmal genauer zu betrachten. Dabei soll die Theorie, also die genaue Funktionsweise, außen vor bleiben. Wer sich darüber informieren möchte, findet ausreichend Informationen an anderer Stelle, etwa in der Wikipedia. Vielmehr sollen hier praktische Fragestellungen im Vordergrund stehen:

Wie genau arbeitet der ADC? Wie gut reproduzierbar sind die ADC-Messwerte? Was ist dran an der Empfehlung seitens AVR (nachzulesen in den Microcontroller-Datenblättern), man solle den ersten Messwert nach Umschalten eines ADC-Kanals immer verwerfen, weil er ungenau sei? Lohnt es sich, mehrere Messwerte eines stabilen Signals zu gewinnen und daraus den Mittelwert zu bilden, um den Effekt eines angeblichen Signalrauschens im ADC zu reduzieren? Welche Rolle spielt die Betriebsspannung für die ADC-Genauigkeit? usw., usw. - beim Experimentieren kommen einem dann sicher schnell weitere Fragestellungen in den Sinn.

Wie nähert man sich diesem Thema? Am besten mit einer kleinen Testschaltung! Wir stellen hier eine für den ATtiny13 entworfene Lösung vor.

Download

Die Dateien sind für den ATtiny13 und eine Taktrate von 4,8 MHz ausgelegt. Anpassungen für einen anderen Controller und/oder eine andere Taktfrequenz sollten leicht möglich sein, da das Programm ausführlich kommentiert ist. Das Programm benötigt die in dieser Rubrik vorgestellten Makros.


Die Schaltung und die Idee dahinter

Schaltbild des ADC-Testers
Schaltbild: ADC-Test mit ATtiny13

Die Schaltung ist denkbar einfach. Neben dem Microcontroller werden nur ein Piezo-Schallwandler, der obligatorische HF-Abblockkondensator und mindestens zwei Widerstände (wenn R3 = 0 gewählt wird) benötigt, außerdem einige Drähte.

Funktion der Schaltung: Bevor man einschaltet, legt man auf mindestens einen der vier ADC-Eingangspins eine Messspannung. Diese erzeugt man am einfachsten über einen Spannungsteiler R1/R2. Mit Hilfe von R3 kann man die Spannungsquelle mehr oder weniger hochohmig auslegen, also ihre Qualität beeinflussen. Das Programm schaltet den ADC nacheinander auf die Eingänge ADC1, ADC2, ADC3, ADC0 (= PB2, PB4, PB3, PB5) und veranlasst jeweils zwei Messungen mit sofortiger Messwertausgabe nach jeder einzelnen Messung. Der 10bit-Messwert von 0 bis 1023 wird akustisch am Piezo-Wandler signalisiert - die Details zu dieser Art von Ausgabe sind in diesem Tipp zu finden.

Die zweite Messung an jedem Eingang sollte ein recht genaues Ergebnis der am Eingang anliegenden Spannung ergeben. Die erste Messung unmittelbar nach Schalten des internen Multiplexers, um den richtigen Chip-Pin mit dem ADC-Eingang zu verbinden, sollte nach allem, was man lesen kann, kaum verwertbar sein. Da eine etwaige Ungenauigkeit sich nur dadurch erklären ließe, dass sich die internen Kapazitäten auf dem Weg vom Pin zum ADC über die unvermeidlichen internen Widerstände nicht schnell genug aufladen können, dürfte es interessant sein zu überprüfen, ob das erste Messergebnis sich verbessert, wenn man der Hardware etwas mehr Zeit vor dem Beginn der Messung gibt.

Pin an GNDZahlWarte-
zeit
kein Pin3keine
nur PB320,1 ms
nur PB411 ms
PB3 + PB4010 ms
  Auch das ist vorgesehen. Das Programm fragt unmittelbar nach dem Start einmalig den digitalen Zustand (also ohne ADC) der Pins PB3 und PB4 ab und berücksichtigt diesen Zustand bei den folgenden ADC-Messungen. Nur wenn beide auf logisch 1 liegen, startet die erste ADC-Messung immer sofort nach interner Umschaltung des ADC-Kanals. Anderenfalls wird zunächst kurz gewartet, wie nebenstehend dargestellt. Vor der PB3-PB4-Messung werden die internen Pull-Up-Widerstände aktiviert. Daher genügt es, die Eingänge offen zu lassen, um logisch 1 zu erhalten. Man muss ggf. nur Verbindungen zu GND (Minus) herstellen. Möchte man die PB3 und PB4 entsprechenden ADC-Eingänge verwenden, muss man die Masseverbindungen entfernen, bevor der jeweilige Eingang an der Reihe ist. Da mit ADC1 = PB2 begonnen wird, bleiben einige Sekunden Zeit hierfür. Kleine Messspannungen (unter 2 Volt) an niederohmigen Spannungsteilern sollten vorsichtshalber erst eine Sekunde nach Programmstart an ADC2 oder ADC3 gelegt werden, um eine Verwechslung mit GND-Verbindung zu verhindern. Damit man sicher ist, wie der Mikrocontroller den Startzustand interpretiert hat und mit welcher Messverzögerung er arbeitet, wird dieser Zustand als Zahlenwert 0 bis 3 vor den eigentlichen Messergebnissen ausgegeben (entspricht Zahl in der nebenstehenden Tabelle).
Einfacher Aufbau auf einem Steckbrett
ADC-Testschaltung auf Steckbrett/Breadboard

Die Schaltung lässt sich schnell auf einem Steckbrett aufbauen und ausprobieren.

Eine gewisse Sonderrolle nimmt ADC0 = PB5 ein: In der Standardkonfiguration übernimmt dieser Pin die Rolle eines Reset-Eingangs. Man kann diese Funktion bei der Chip-Programmierung durch entsprechende Fuses-Einstellungen ausschalten, verliert dann aber die Möglichkeit, den Controller weiterhin über die ISP-Schnittstelle zu programmieren. Erstaunlich genug: Auch wenn PB5 als Reset-Eingang fungiert, lässt er sich als ADC-Kanal verwenden! Allerdings muss man hierbei Einschränkungen in Kauf nehmen. Zum einen darf die Spannung nicht zu gering werden - sonst wird ein Reset ausgelöst. Zum anderen bleibt trotz Abschaltung der Pull-Up-Widerstände durch das Programm ein Widerstand von etwa 60 kΩ gegen VCC geschaltet, der natürlich die Spannung am Pin bei Verbindung mit einem Spannungsteiler beeinflusst. Aber immerhin - wenn für eine Anwendung eine Eingangsleitung am kleinen Tiny13 zu fehlen scheint, lässt sich womöglich über ADC0 doch noch ein weiterer Inputkanal mobilisieren. Möchten Sie mehr zum ADC0-Thema erfahren? Hermann Nieder nutzt ADC0 des ATtiny13, um ein Zweikanal-Netzgerät zu steuern, und beschreibt seine Schaltung in diesem Beitrag auf der Webseite des ELO-Magazins.

Ein paar Vorschläge für Fragestellungen, denen man nachgehen könnte


Sie bekommen immer gleiche Messwerte, unabhängig von der eingestellten Wartezeit? Dann sollten Sie R3 drastisch erhöhen! Mindestens 10 MΩ wären schon nicht schlecht. Schalten Sie notfalls alles in Reihe, was Sie haben... Oder der altbewährte Do-it-yourself-Widerstand: Ein kräftiger Bleistiftstrich auf einem Blatt Papier, am besten in Kombination mit zwei Krokodilklemmenkabeln.


PB4 PB3 / WartezeitMesswert 1Messwert 2
3 / 0288514
2 / 0,1 ms325514
1 / 1 ms473514
0 / 10 ms514514
  Beispielmessung an einem einzelnen Port-Pin bei 4,8 Volt Betriebsspannung mit R1 = R2 = 30 kΩ und R3 = 17,6 MΩ (!). Deutlich ist erkennbar, dass der jeweils zweite Messwert immer gleich ist und sich der erste dem zweiten mit zunehmender Wartezeit zwischen interner Leitungsumschaltung und Messungsbeginn annähert. Bei zu kleinem Widerstand R3 ist der Einfluss der Wartezeit auf den ersten Messwert kaum wahrnehmbar. Die Abweichung des Messwertes vom erwarteten Wert (511 oder 512) erklärt sich durch die Widerstandstoleranz - nach Vertauschen von R1 mit R2 ergibt sich der Messwert 510.

Zurück zur Übersicht