This is an old revision of the document!
Analog-zu-Digital Umsetzer (ADC) transformieren ein analogen Spannungswert in einen digitalen Wert. Die erlaubte Spannungsreichweite am ADC-Input eines AVR Microcontrollers ist 0-5.5V. Die Größe des digitalen Werts ist 10 Bits, aber die Genauigkeit beträgt +-2 Einheiten. Der Fehler kann sogar größer sein, wenn die Betriebsspannung micht gegen Interferenz geschützt ist. Der AVR hat seperate Betriebs- und Vergleichsspannungs Pins für den ADV. Die seperate Betriebsspannung hilft die Interferenz klein zu halten und darf sich nicht mehr als 0.3V von der Hauptbetriebsspannung unterscheiden. Die Vergleichsspannung definiert den maximalen digitalen Wert. Zum Beispiel wenn die Vergleichsspannung 3V beträgt, dann wird ein Input mit der gleichen Spannung mit 210 - 1 (1023) ausgelesen.
Der AVR ADC arbeitet nach dem Prinzip der schrittweisen Annäherung. Kurz gesagt, die gemessene Spannung wird mit bestimmten Spannungslevels verglichen und die Ergebnisse werden als Bit-Array ausgegeben. Diese Methode ist relativ langsam, da jedes Bit im Endergebnis sperat berechnet wird. Der AVR benötigt 13 Taktzyklen für jede Messung, ausser der Ersten (beim Start-up), welcher 25 Taktzyklen benötigt. Diese Taktzyklen sind jedoch die des Arbeitstakts des Controllers, sondern spezielle Taktzyklen die der ADC-Einheit durch den Frequenzteiler zugewiesen wurden. Die ADC-Frequenz sollte 50-200 kHz sein um die maximale Präzision zu erreichen, bei höheren Frequenzen sind die Präzision. In machen Fällen jedoch ist es wichtiger eine Menge an Daten zu bekommen anstatt weniger, aber präzisere. Dann rentiert sich eine höhere Frequenz. Laut dem AVR-Handbuch dauert eine Messung 13-260 µs.
Der gemessene Wert kann als 8- oder 10-Bit Wert gelesen werden. Da der AVR ein 8-Bit Gerät ist, hat er zwei 8-Bit Register um ADC-Werte zu speichern. Es ist möglich in dem Einstellungen anzugeben ob die ersten oder letzten zwei Bits in das seperate Register sollen. Falls die zwei jüngeren Bits, welche das Ergebnis weniger widergeben, separiert werden, kann das Ergebnis als 8-Bit Wert ausgelesen werden - eine Kombination wie diese nennt man “left aligned result” Die andere Kombination, in der beide Register gelesen werden, und der Wert im 10-Bit Format ist, wird “right aligned result” genannt.
Ein normaler AVR hat 8 analoge Spannungs-Input-Kanäle, die ATtiny Serie hat weniger, und einige ATmega haben 16, aber es gibt immer nur einen ADC. Um es möglich zu machen, verschiedene Inputs zu nutzen hat das Gerät einen eingebauten Multiplexer. Der Input des Multiplexer kann durch ein spezielles Register definiert werden. Die ADC Einheit hat noch mehere Eigenschaften: Es nutzt den Sleepmodus des Prozessors zum Umwandeln, um die Interferenz zu verringern. Ausserdem gibt es eine Option um eine interne feste Vergleichspannung zu nutzen (normalerweise 2.65 V, bei manchen Modellen aber 1V)
Example
Aufgabe: Miss die Spannung des ADC Kanals 3 eines ATmega128. Der Spannungsberei liegt zwischen 0-5 V und des Ergebnis sollte eine 8-bit Präzision haben.
#include <avr/io.h> int main() { unsigned char result; // Choose AREF pin for the comparison voltage // (it is assumed AREF is connected to the +5V supply) // Choose channel 3 in the multiplexer // Left align the result ADMUX = (1 << REFS0) | (1 << ADLAR) | (3); // Start the ADC unit, // set the conversion cycle 16 times slower than the duty cycle ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADSC); // Wait for the measuring process to finish while (ADCSRA & (1 << ADSC)) continue; // Read the 8-bit value result = ADCH; }