Both sides previous revisionPrevious revisionNext revision | Previous revision |
de:avr:adc [2010/10/15 10:21] – Wember | de:avr:adc [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
---|
====== Analog-to-digital converter ====== | ====== Analog-zu-Digital Konverter ====== |
| |
Analog-zu-Digital Konverter (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 separate Betriebs- und Vergleichsspannungs-Pins für den ADC. Die separate 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 2<sup>10</sup> - 1 (1023) ausgelesen. | Analog-zu-Digital Konverter (ADC) transformieren einen analogen Spannungswert in einen digitalen Wert. Die erlaubte Spannungsreichweite am ADC-Input eines AVR Microcontrollers liegt bei 0-5.5V. Der digitale Wert ist 10 Bit groß und bis auf ± 2 Einheiten genau. Der Fehler kann jedoch auch noch größer sein, wenn die Betriebsspannung nicht vor Störungen geschützt ist. Der AVR hat separate Betriebs- und Vergleichsspannungs-Pins für den ADC. Die separate Betriebsspannung trägt dazu bei, Störungen möglichst klein zu halten wobei sie sich nicht mehr als 0.3V von der Hauptbetriebsspannung unterscheiden darf. Die Vergleichsspannung definiert den maximalen digitalen Wert. Beträgt sie zum Beispiel 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 seperat berechnet wird. Der AVR benötigt 13 Taktzyklen für jede Messung, außer 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 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 einzeln berechnet wird. Der AVR benötigt 13 Taktzyklen für jede Messung, für die Erste jedoch (beim Start-up ) werden, 25 Taktzyklen benötigt. Diese Taktzyklen entsprechen jedoch nicht den Arbeitstakten des Controllers, sondern sind spezielle Taktzyklen die der ADC-Einheit durch den Frequenzteiler zugewiesen wurden. Um die maximale Präzision zu erreichen, sollte die ADC-Frequenz sollte 50-200 kHz betragen, bei höheren Frequenzen sinkt die Genauigkeit. Eine höhere Frequenz ist dann sinnvoll, wenn viele Daten ausgelesen werden sollen wobei die Genauigkeit dieser vernachlässigt wird. Gemäß 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. | Der gemessene Wert kann als 8- oder 10-Bit Wert gelesen werden. Da der AVR ein 8-Bit Mikrocontroller ist, verfügt er über zwei 8-Bit Register um ADC-Werte zu speichern. In den Einstellungen kann festgelegt werden, ob die ersten oder letzten zwei Bits in ein seperates Register sollen. Falls die zwei zuletzt ausgelesenen Bits, welche das Ergebnis weniger widergeben, separiert werden, kann das Ergebnis als 8-Bit Wert ausgelesen werden. Eine solche Kombination nennt man „left aligned result“. Darüber hinaus kennzeichnet „right aligned result“ jene Kombination, bei der beide Register gelesen werden, und der Wert ein 10-Bit Format hat. |
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 mehrere Eigenschaften: Es nutzt den Sleepmodus des Prozessors zum Umwandeln, um die Interferenz zu verringern. Außerdem gibt es eine Option um eine interne feste Vergleichsspannung zu nutzen (normalerweise 2.65 V, bei manchen Modellen aber 1V) | Ein normaler AVR verfügt über 8 analoge Spannungs-Input-Kanäle. Die Mikrocontroller der ATtiny Serie besitzen weniger, einige ATmega haben 16, allerdings existiert immer nur ein ADC. Um verschiedene Inputs nutzen zu können hat das Gerät einen eingebauten Multiplexer. Der Input des Multiplexer kann durch Nutzung eines speziellen Registers definiert werden. Die ADC Einheit weist darüber hinaus noch weitere Eigenschaften auf: Der Sleepmodus des Prozessors wird für die Umwandlung genutzt, um Störungen zu verringern. Außerdem gibt es die Option zur Nutzung einer internen festen Vergleichsspannung (gewöhnlich 2.65 V, bei manchen Modellen aber 1 V) |
~~PB~~ | |
| |
<box 100% round #EEEEEE|Example> | |
| |
Aufgabe: Miss die Spannung des ADC Kanals 3 eines ATmega128. Der Spannungsbereich liegt zwischen 0-5 V und des Ergebnis sollte eine 8-Bit Präzision haben. | <pagebreak> |
| |
| <box 100% round #EEEEEE|Beispiel> |
| |
| Aufgabe: Messen Sie die Spannung des ADC Kanals 3 eines ATmega128. Der Spannungsbereich liegt bei 0-5 V und das Ergebnis sollte 8-Bit präzise sein. |
<code c> | <code c> |
#include <avr/io.h> | #include <avr/io.h> |
unsigned char result; | unsigned char result; |
| |
// Choose AREF pin for the comparison voltage | // Wähle den AREF Pin zum Vergleich der Spannung |
// (it is assumed AREF is connected to the +5V supply) | // (es wird angenommen, dass AREF mit der +5V Stromversorgung verbunden ist)) |
// Choose channel 3 in the multiplexer | // Wähle Kanal 3 im Multiplexer r |
// Left align the result | // ordne das Ergebnis links an |
ADMUX = (1 << REFS0) | (1 << ADLAR) | (3); | ADMUX = (1 << REFS0) | (1 << ADLAR) | (3); |
| |
// Start the ADC unit, | // Starte den ADC, |
// set the conversion cycle 16 times slower than the duty cycle | // setze den Umwandlungszyklus 16 mal langsamer als das Tastverhältnis |
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADSC); | ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADSC); |
| |
// Wait for the measuring process to finish | // Warte auf Beendigung des Messvorganges |
while (ADCSRA & (1 << ADSC)) continue; | while (ADCSRA & (1 << ADSC)) continue; |
| |
// Read the 8-bit value | // Lies den 8-Bit Wert aus |
result = ADCH; | result = ADCH; |
} | } |