(→Betriebsmodi) |
(→ADMUX) |
||
(18 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
''Für allgemeine Informationen zum Analog-Digital-Wandler siehe Artikel [[ADC]].'' | ''Für allgemeine Informationen zum Analog-Digital-Wandler siehe Artikel [[ADC]].'' | ||
− | Mit einem Analog-Digital-Wandler ([[ADC]], für Analog Digital Converter) ist es mit den AVRs möglich, auf einfache Art und Weise analoge Größen in digitale Werte umzuwandeln. Dies bietet sich z.B. an, wenn | + | Mit einem Analog-Digital-Wandler ([[ADC]], für Analog Digital Converter) ist es mit den AVRs möglich, auf einfache Art und Weise analoge Größen in digitale Werte umzuwandeln. Dies bietet sich z.B. an, wenn die Batteriespannung eines Roboters bestimmt werden soll. |
= Kanäle = | = Kanäle = | ||
− | Ein AVR hat normalerweise nur einen [[ADC]] integriert. | + | Ein AVR hat normalerweise nur einen [[ADC]] integriert. Des öfteren müssen aber mehrere analoge Größen von verschiedenen Quellen umgewandelt werden. Deswegen besitzen die AVRs Kanäle (ein ATmega32 z.B. besitzt acht Kanäle auf Port A). Diese Kanäle werden dann mit Hilfe eines Multiplexer auf den [[ADC]] geschaltet, der dann die anliegende analoge Spannung in einen digitalten Wert wandelt. |
= Betriebsmodi = | = Betriebsmodi = | ||
Zeile 22: | Zeile 22: | ||
|}</div> | |}</div> | ||
− | Um zu bestimmen welcher Teilungsfaktor geeignet ist, kann | + | Um zu bestimmen, welcher Teilungsfaktor geeignet ist, kann folgende Formel verwenden werden.<br> |
<math>Taktfrequenz = 8 MHz</math> | <math>Taktfrequenz = 8 MHz</math> | ||
Zeile 29: | Zeile 29: | ||
<math>Teilungsfaktor_{max} = {Taktfrequenz \over {50 kHz}} = {{8000000 Hz} \over {50000 Hz}} = 160</math> | <math>Teilungsfaktor_{max} = {Taktfrequenz \over {50 kHz}} = {{8000000 Hz} \over {50000 Hz}} = 160</math> | ||
− | Deswegen kann | + | Deswegen kann nun zwischen einem der folgenden Teilungsfaktor gewählt werden: 64 und 128. Im Interesse der Geschwindigkeit sollte 64 gewählt werden. |
− | Siehe bitte die Registerübersicht weiter unten. Dort wird gezeigt, welches Register entsprechend eingestellt werden muss, damit | + | Siehe bitte die Registerübersicht weiter unten. Dort wird gezeigt, welches Register entsprechend eingestellt werden muss, damit einer der oben aufgelisteten Teilungsfaktoren gewählt werden kann. |
= Referenzspannung = | = Referenzspannung = | ||
− | Das Ergebnis der Wandlung des [[ADC]] bezieht sich auf eine bestimmte Referenzspannung. | + | Das Ergebnis der Wandlung des [[ADC]] bezieht sich auf eine bestimmte Referenzspannung. Diese Referenzspannung ist gleich der maximal zu messenden Spannung. Wenn die Spannung höher ist (kleiner als Vcc+0.3V, um den Port nicht zu beschädigen) gibt der AD Wandler das maximale Ergebnis. Um einzustellen, welche Referenzspannung verwendet werden soll, gibt es das Register ''ADMUX''. |
Je nach verwendetem AVR sind verschiedene Möglichkeiten als Referenzspannung vorhanden: | Je nach verwendetem AVR sind verschiedene Möglichkeiten als Referenzspannung vorhanden: | ||
Zeile 42: | Zeile 42: | ||
!| Referenz- spannungsquelle|| Bedeutung | !| Referenz- spannungsquelle|| Bedeutung | ||
|- | |- | ||
− | |AREF || es wird die externe Spannung als Referenz verwendet die an Pin AREF anliegt | + | |AREF || es wird die externe Spannung als Referenz verwendet, die an Pin AREF anliegt |
|- | |- | ||
− | |AVCC || besitzt der AVR eine eigene Spannungsversorgung für den ADC<br />wird der Pin AVCC als Referenz gewählt,<br />ansonsten wird Vcc verwendet,<br />mit externen Kondensator am AREF Pin | + | |AVCC || besitzt der AVR eine eigene Spannungsversorgung für den ADC<br />, wird der Pin AVCC als Referenz gewählt,<br />ansonsten wird Vcc verwendet,<br />mit externen Kondensator am AREF Pin |
|- | |- | ||
|Intern || Spannung 1,1V und/oder 2,56V, je nach AVR einer der beiden Spannungen, oder beide zur Auswahl, wie zB. beim [[ATmega644]], mit oder ohne (zB. beim Tiny15L) externem Kondensator am AREF Pin | |Intern || Spannung 1,1V und/oder 2,56V, je nach AVR einer der beiden Spannungen, oder beide zur Auswahl, wie zB. beim [[ATmega644]], mit oder ohne (zB. beim Tiny15L) externem Kondensator am AREF Pin | ||
Zeile 52: | Zeile 52: | ||
Config Adc = Single , Prescaler = Auto , Reference = | Config Adc = Single , Prescaler = Auto , Reference = | ||
OFF {{vbcomment|AREF}} | OFF {{vbcomment|AREF}} | ||
− | AVCC {{vbcomment|AVCC oder VCC}} | + | AVCC {{vbcomment|AVCC oder VCC (intern geschaltet)}} |
INTERNAL {{vbcomment|Wenn nur eine interne Spannung möglich ist}} | INTERNAL {{vbcomment|Wenn nur eine interne Spannung möglich ist}} | ||
INTERNAL_1.1 {{vbcomment|Wenn mehr interne Spannungen auswählbar sind}} | INTERNAL_1.1 {{vbcomment|Wenn mehr interne Spannungen auswählbar sind}} | ||
Zeile 60: | Zeile 60: | ||
Siehe bitte die Registerübersicht. Dort steht genauer wie man das Register einzustellen hat. | Siehe bitte die Registerübersicht. Dort steht genauer wie man das Register einzustellen hat. | ||
− | + | Die Referenzspannung wird auch (oder besser deren analoge Größe) benötigt, um den Wert, den der ADC zurückgibt, in V umzurechnen. Um den zurückgegebenen Wert des ADC umzuwandel, wird wie folgt vorgegangen: | |
# Bestimmen der Auflösung des ADC. Bei den ATMegas normalerweise 10 Bit. 10 Bit entsprechen einer Stufung von 1024. | # Bestimmen der Auflösung des ADC. Bei den ATMegas normalerweise 10 Bit. 10 Bit entsprechen einer Stufung von 1024. | ||
Zeile 70: | Zeile 70: | ||
<math>V = 2960 / 2 ^{Bit} = 2960 / 2 ^{10} = \underline {\underline { 2{,}9V }}</math> | <math>V = 2960 / 2 ^{Bit} = 2960 / 2 ^{10} = \underline {\underline { 2{,}9V }}</math> | ||
+ | |||
+ | = Beschaltung der Eingänge = | ||
+ | Die AD-Eingänge sind im Mittel sehr hochohmig (Größenordnung 100 MOhm, wenn nur der eine Kanal ausgelesen wird). Trotzdem sollte der Widerstand der Signalquelle nicht mehr als ca. 20 kOhm betragen, denn innerhalb von nur 1,5 Zyklen des AD Taktes muss der Speicherkondensator von etwa 15 pF für die Signalabtastung (Sample & Hold) geladen werden. | ||
+ | |||
+ | Bei einer hochohmigeren Spannungsquelle kann ein kleiner Kondensator (mindestens 15 nF, typisch 100 nF) am AD- Eingang die Spannung für die kurze Zeit puffern. Der Kondensator wirkt mit dem Ausgangswiderstand des Teilers auch als RC Tiefpassfilter. Hohe Frequenzen oder schnelle Änderungen sind dann nicht mehr messbar, stören aber auch nicht mehr so stark. | ||
+ | |||
+ | Wenn die Signalquelle (z.B. eine Schaltung mit Operationsverstärker) mehr als Vcc liefern kann, oder eine unabhängige Spannungsversorgung hat, sollte als Schutz ein Widerstand vor dem AD Eingang sein. Am Eingang sind Schutzdioden nach GND und AVcc, die etwas Strom (angeblich bis ca. 1 mA) nach GND bzw. AVcc ableiten können, wenn die Spannung zu groß oder zu klein wird. | ||
+ | |||
+ | Ein Widerstand am AD-Eingang reduziert außerdem HF Störungen vom µC in Richtung Signalquelle. Wenn man den Widerstand als Teil eines Tiefpassfilters (z.B. Anti-Aliasing) nutzen will, muss man bei Kondensatoren unter etwa 10 nF am Eingang aufpassen. Das ist zu wenig, um den Speicher-Kondensator ohne merkliche Spannungsänderung zu laden. Der Kondensator kann dann aber nicht mehr schnell genug nachgeladen werden. | ||
= Programmbeispiele = | = Programmbeispiele = | ||
Zeile 75: | Zeile 84: | ||
=== C/C++ === | === C/C++ === | ||
− | Dieses Beispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht, die mit einer Taktfrequenz von 8 MHz laufen. Je nach Einsatzart muss | + | Dieses Beispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht, die mit einer Taktfrequenz von 8 MHz laufen. Je nach Einsatzart muss das Beispielprogramm entsprechend abgeändert werden (also diese Zeile mit ADMUX |= (1<<REFS1) | (1<<REFS0);). |
<pre> | <pre> | ||
#include <avr/io.h> | #include <avr/io.h> | ||
Zeile 88: | Zeile 97: | ||
// Kanal des Multiplexers waehlen | // Kanal des Multiplexers waehlen | ||
− | |||
// Interne Referenzspannung verwenden (also 2,56 V) | // Interne Referenzspannung verwenden (also 2,56 V) | ||
− | ADMUX | + | ADMUX = channel | (1<<REFS1) | (1<<REFS0); |
// Den ADC initialisieren und einen sog. Dummyreadout machen | // Den ADC initialisieren und einen sog. Dummyreadout machen | ||
Zeile 150: | Zeile 158: | ||
{| {{GrauRotDesignSchmal}} | {| {{GrauRotDesignSchmal}} | ||
|- | |- | ||
− | |Hinweis: Diese Registertabellen wurden für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren | + | |Hinweis: Diese Registertabellen wurden für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden, kann es sein, dass ein oder mehrere Register nicht existieren oder sie eine andere Bezeichnung haben. |
|} | |} | ||
Zeile 162: | Zeile 170: | ||
{{Registertabelle8BitFix|ADEN|ADSC|ADATE|ADIF|ADIE|ADPS2|ADPS1|ADPS0}} | {{Registertabelle8BitFix|ADEN|ADSC|ADATE|ADIF|ADIE|ADPS2|ADPS1|ADPS0}} | ||
− | *'''ADEN (ADC Enable)'''<br/>Wird dieses Bit gesetzt (also 1), dann wird der ADC aktiviert. | + | *'''ADEN (ADC Enable)'''<br/>Wird dieses Bit gesetzt (also 1), dann wird der ADC aktiviert. Wird eine 0 geschrieben, wird der ADC deaktiviert. Wird der ADC während einer Wandlung deaktiviert, wird die Wandlung abgebrochen. |
*'''ADSC (ADC Start Conversion)'''<br/>Dieses Bit startet den Messvorgang, je nachdem in welchem Betriebsmodi der ADC läuft. Wird dieses Bit nach der Aktivierung des ADC über '''ADEN''' zum ersten Mal gesetzt, wird der ADC erst eine Initialisierungswandlung durchführen und danach erst die eigentliche Wandlung. Das Schreiben einer 0 auf das Bit hat keinen Effekt. | *'''ADSC (ADC Start Conversion)'''<br/>Dieses Bit startet den Messvorgang, je nachdem in welchem Betriebsmodi der ADC läuft. Wird dieses Bit nach der Aktivierung des ADC über '''ADEN''' zum ersten Mal gesetzt, wird der ADC erst eine Initialisierungswandlung durchführen und danach erst die eigentliche Wandlung. Das Schreiben einer 0 auf das Bit hat keinen Effekt. | ||
*'''ADATE (ADC Auto Trigger Enable)'''<br/>Wird dieses Bit gesetzt, wird das Auto Triggering des ADC aktiviert. Die genaue Triggerquelle wir im Register '''SFIOR''' eingestellt. Default ist das der Free-runnng mode. | *'''ADATE (ADC Auto Trigger Enable)'''<br/>Wird dieses Bit gesetzt, wird das Auto Triggering des ADC aktiviert. Die genaue Triggerquelle wir im Register '''SFIOR''' eingestellt. Default ist das der Free-runnng mode. | ||
− | *'''ADIF (ADC Interrupt Flag)'''<br/>Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende [[ISR]] abgearbeitet wird. Alternativ kann | + | *'''ADIF (ADC Interrupt Flag)'''<br/>Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende [[ISR]] abgearbeitet wird. Alternativ kann es gelöscht werden, indem eine 1 auf das Bit geschrieben wird. |
− | *'''ADIE (ADC Interrupt Enable)'''<br/>Wird dieses Bit gesetzt und die globalen Interrupts sind aktiviert, wird der ADC Complete Interrupt aktiviert, auf den | + | *'''ADIE (ADC Interrupt Enable)'''<br/>Wird dieses Bit gesetzt und die globalen Interrupts sind aktiviert, wird der ADC Complete Interrupt aktiviert, auf den dann in der entsprechenden [[ISR]] reagiert werden kann. |
*'''ADPS2 (ADC Prescaler Select Bit 2)'''<br/>Diese Bits bestimmen den Teilungsfaktor zwischen der CPU-Frequenz und dem Eingangstakt des [[ADC]]. Zum Wandeln benötigt der [[ADC]] einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt sollte zwischen 50kHz und 200kHz liegen. Siehe [[#Teilungsfaktor|Teilungsfaktor]]. Folgende Teilungsfaktoren sind verfügbar: | *'''ADPS2 (ADC Prescaler Select Bit 2)'''<br/>Diese Bits bestimmen den Teilungsfaktor zwischen der CPU-Frequenz und dem Eingangstakt des [[ADC]]. Zum Wandeln benötigt der [[ADC]] einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt sollte zwischen 50kHz und 200kHz liegen. Siehe [[#Teilungsfaktor|Teilungsfaktor]]. Folgende Teilungsfaktoren sind verfügbar: | ||
Zeile 198: | Zeile 206: | ||
ADC Multiplexer Selection Register | ADC Multiplexer Selection Register | ||
− | Mit diesem Register wird u.a. der Multiplexer gesteuert. | + | Mit diesem Register wird u.a. der Multiplexer gesteuert. Das Register ist intern gepuffert. Eine gerade laufende Wandlung wird ggf. noch mit den alten Einstellungen ausgeführt, bevor die neue Einstellung übernommen wird. |
<div align="center">{{Registertabelle8BitFix|REFS1|REFS0|ADLAR|MUX4|MUX3|MUX2|MUX1|MUX0}}</div> | <div align="center">{{Registertabelle8BitFix|REFS1|REFS0|ADLAR|MUX4|MUX3|MUX2|MUX1|MUX0}}</div> | ||
− | *'''REFS1 (Reference Selection | + | *'''REFS0, REFS1 (Reference Selection Bits 0,1)''' |
− | + | Diese Bits bestimmen, welche Referenzspannung der ADC verwenden soll. Die möglichen Quellen sind unten aufgelistet. | |
<div align="center"> | <div align="center"> | ||
Zeile 223: | Zeile 231: | ||
|}</div> | |}</div> | ||
− | + | ||
*'''ADLAR (ADC Left Adjust Result)'''<br/>Dieses Bit beeinflusst, wie der ermittelte Messwert im ADC Data Register abgelegt wird. Bei '''ADLAR'''=1 liegen die oberen 8 Bits im Register ADCH. | *'''ADLAR (ADC Left Adjust Result)'''<br/>Dieses Bit beeinflusst, wie der ermittelte Messwert im ADC Data Register abgelegt wird. Bei '''ADLAR'''=1 liegen die oberen 8 Bits im Register ADCH. | ||
− | *''' | + | *'''MUX3,MUX4 (Analog Channel and Gain Selection Bits 3,4)'''<br/>Mit diesen Bits können Gain und Differenz-Kanäle gewählt werden. Speziell steht 00 für keine Verstärkung und einfache Eingänge. Weitere Möglichkeiten stehen im Datenblatt. |
<div align="center"> | <div align="center"> | ||
{| {{Blauetabelle}} | {| {{Blauetabelle}} | ||
|- {{Hintergrund1}} | |- {{Hintergrund1}} | ||
− | !|MUX4..0 || | + | !|MUX4..0 || Eingang |
|- | |- | ||
|00000 || ADC0 | |00000 || ADC0 | ||
Zeile 248: | Zeile 256: | ||
|- | |- | ||
|00111 || ADC7 | |00111 || ADC7 | ||
+ | |- | ||
+ | |10000 || ADC0-ADC1 | ||
+ | |- | ||
+ | |11110 || Ref. 1.22 V | ||
|}</div> | |}</div> | ||
− | + | *'''MUX0...MUX2 (Analog Channel and Gain Selection Bits 0..2)'''<br/>Auswahl des Eingangskanals. Siehe Tabelle. Für die einfachen Kanäle reicht es also einfach die Kanalnummer in die unteren Bits von ADMUX zu schreiben. | |
− | *''' | + | |
=== ADCL / ADCH === | === ADCL / ADCH === | ||
− | Desweiteren gibt es noch die Register '''ADCL/ADCH''' hier steht das Ergebnis einer Wandlung. Wie bei den meisten auf 2 Register verteilten Werten, bewirkt das lesen des Low-Bytes ein puffern des High-bytes. | + | Desweiteren gibt es noch die Register '''ADCL/ADCH''' hier steht das Ergebnis einer Wandlung. Wie bei den meisten auf 2 Register verteilten Werten, bewirkt das lesen des Low-Bytes ein puffern des High-bytes. Der Wert wird folgendermaßen ausgelesen: |
Zeile 262: | Zeile 273: | ||
// oder besser | // oder besser | ||
x = ADCW; | x = ADCW; | ||
+ | // Der Compiler sorgt hier für die richtige Reihenfolge beim Zugriff | ||
= Siehe auch = | = Siehe auch = |
Aktuelle Version vom 13. November 2010, 17:49 Uhr
Für allgemeine Informationen zum Analog-Digital-Wandler siehe Artikel ADC.
Mit einem Analog-Digital-Wandler (ADC, für Analog Digital Converter) ist es mit den AVRs möglich, auf einfache Art und Weise analoge Größen in digitale Werte umzuwandeln. Dies bietet sich z.B. an, wenn die Batteriespannung eines Roboters bestimmt werden soll.
Inhaltsverzeichnis
Kanäle
Ein AVR hat normalerweise nur einen ADC integriert. Des öfteren müssen aber mehrere analoge Größen von verschiedenen Quellen umgewandelt werden. Deswegen besitzen die AVRs Kanäle (ein ATmega32 z.B. besitzt acht Kanäle auf Port A). Diese Kanäle werden dann mit Hilfe eines Multiplexer auf den ADC geschaltet, der dann die anliegende analoge Spannung in einen digitalten Wert wandelt.
Betriebsmodi
Der ADC bietet verschiedene Betriebsmodi. Diese wären:
- Single Conversion: Der ADC wandelt eine analoge Größe um und gibt diese zurück.
- Free Running: Der ADC wandelt wie in einer Endlosschleife ständig die anliegende analoge Größe in digitale Werte um und gibt diese zurück.
- Autotrigger: Bei neueren AVRs (z.B. Mega48,Mega88,Mega32,..) kann der ADC auch direkt vom Timer oder über den analogen Komperator gestartet werden.
Teilungsfaktor
Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Eine Wandlung braucht normalerweise 13 Zyklen des ADC-Taktes. Allerdings ist die Taktfrequenz des Mikrocontrollers zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt sollte beim AVR zwischen 50kHz und 200kHz liegen. Mit reduzierter Genauigkeit ist bis 1000 kHz möglich. Folgende Teilungsfaktoren sind verfügbar:
Teilungsfaktoren | 2 | 4 | 8 | 16 | 32 | 64 | 128 |
Um zu bestimmen, welcher Teilungsfaktor geeignet ist, kann folgende Formel verwenden werden.
[math]Taktfrequenz = 8 MHz[/math]
[math]Teilungsfaktor_{min} = {Taktfrequenz \over {200 kHz}} = {{8000000 Hz} \over {200000 Hz}} = 40[/math]
[math]Teilungsfaktor_{max} = {Taktfrequenz \over {50 kHz}} = {{8000000 Hz} \over {50000 Hz}} = 160[/math]
Deswegen kann nun zwischen einem der folgenden Teilungsfaktor gewählt werden: 64 und 128. Im Interesse der Geschwindigkeit sollte 64 gewählt werden.
Siehe bitte die Registerübersicht weiter unten. Dort wird gezeigt, welches Register entsprechend eingestellt werden muss, damit einer der oben aufgelisteten Teilungsfaktoren gewählt werden kann.
Referenzspannung
Das Ergebnis der Wandlung des ADC bezieht sich auf eine bestimmte Referenzspannung. Diese Referenzspannung ist gleich der maximal zu messenden Spannung. Wenn die Spannung höher ist (kleiner als Vcc+0.3V, um den Port nicht zu beschädigen) gibt der AD Wandler das maximale Ergebnis. Um einzustellen, welche Referenzspannung verwendet werden soll, gibt es das Register ADMUX. Je nach verwendetem AVR sind verschiedene Möglichkeiten als Referenzspannung vorhanden:
Referenz- spannungsquelle | Bedeutung |
---|---|
AREF | es wird die externe Spannung als Referenz verwendet, die an Pin AREF anliegt |
AVCC | besitzt der AVR eine eigene Spannungsversorgung für den ADC , wird der Pin AVCC als Referenz gewählt, ansonsten wird Vcc verwendet, mit externen Kondensator am AREF Pin |
Intern | Spannung 1,1V und/oder 2,56V, je nach AVR einer der beiden Spannungen, oder beide zur Auswahl, wie zB. beim ATmega644, mit oder ohne (zB. beim Tiny15L) externem Kondensator am AREF Pin |
Verwendet man Bascom als Programmiersprache, gibt es, je nach verwendetem AVR, folgende Möglichkeiten zur Angabe als Referenz :
Config Adc = Single , Prescaler = Auto , Reference = OFF ' AREF AVCC ' AVCC oder VCC (intern geschaltet) INTERNAL ' Wenn nur eine interne Spannung möglich ist INTERNAL_1.1 ' Wenn mehr interne Spannungen auswählbar sind INTERNAL_2.56 ' Wenn mehr interne Spannungen auswählbar sind INTERNALEXTCAP ' Wenn, zB. beim Tiny15L, ein Kondensator an AREF angeschlossen ist
Siehe bitte die Registerübersicht. Dort steht genauer wie man das Register einzustellen hat.
Die Referenzspannung wird auch (oder besser deren analoge Größe) benötigt, um den Wert, den der ADC zurückgibt, in V umzurechnen. Um den zurückgegebenen Wert des ADC umzuwandel, wird wie folgt vorgegangen:
- Bestimmen der Auflösung des ADC. Bei den ATMegas normalerweise 10 Bit. 10 Bit entsprechen einer Stufung von 1024.
- Ermitteln des digitalen Wertes der analogen Größe. In der Beispielrechnung verwende ich den Wert 592.
- Größe der Referenzspannung. In der Beispielrechnung wird 5V verwendet.
Mit diesen Werten kann folgende Berechnung ausführen.
[math]V = 592 * 5V[/math]
[math]V = 2960 / 2 ^{Bit} = 2960 / 2 ^{10} = \underline {\underline { 2{,}9V }}[/math]
Beschaltung der Eingänge
Die AD-Eingänge sind im Mittel sehr hochohmig (Größenordnung 100 MOhm, wenn nur der eine Kanal ausgelesen wird). Trotzdem sollte der Widerstand der Signalquelle nicht mehr als ca. 20 kOhm betragen, denn innerhalb von nur 1,5 Zyklen des AD Taktes muss der Speicherkondensator von etwa 15 pF für die Signalabtastung (Sample & Hold) geladen werden.
Bei einer hochohmigeren Spannungsquelle kann ein kleiner Kondensator (mindestens 15 nF, typisch 100 nF) am AD- Eingang die Spannung für die kurze Zeit puffern. Der Kondensator wirkt mit dem Ausgangswiderstand des Teilers auch als RC Tiefpassfilter. Hohe Frequenzen oder schnelle Änderungen sind dann nicht mehr messbar, stören aber auch nicht mehr so stark.
Wenn die Signalquelle (z.B. eine Schaltung mit Operationsverstärker) mehr als Vcc liefern kann, oder eine unabhängige Spannungsversorgung hat, sollte als Schutz ein Widerstand vor dem AD Eingang sein. Am Eingang sind Schutzdioden nach GND und AVcc, die etwas Strom (angeblich bis ca. 1 mA) nach GND bzw. AVcc ableiten können, wenn die Spannung zu groß oder zu klein wird.
Ein Widerstand am AD-Eingang reduziert außerdem HF Störungen vom µC in Richtung Signalquelle. Wenn man den Widerstand als Teil eines Tiefpassfilters (z.B. Anti-Aliasing) nutzen will, muss man bei Kondensatoren unter etwa 10 nF am Eingang aufpassen. Das ist zu wenig, um den Speicher-Kondensator ohne merkliche Spannungsänderung zu laden. Der Kondensator kann dann aber nicht mehr schnell genug nachgeladen werden.
Programmbeispiele
C/C++
Dieses Beispiel ist für die Atmel Controller Mega16 und Mega32 gedacht, die mit einer Taktfrequenz von 8 MHz laufen. Je nach Einsatzart muss das Beispielprogramm entsprechend abgeändert werden (also diese Zeile mit ADMUX |= (1<<REFS1) | (1<<REFS0);).
#include <avr/io.h> #include <inttypes.h> uint16_t readADC(uint8_t channel) { uint8_t i; uint16_t result = 0; // Den ADC aktivieren und Teilungsfaktor auf 64 stellen ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); // Kanal des Multiplexers waehlen // Interne Referenzspannung verwenden (also 2,56 V) ADMUX = channel | (1<<REFS1) | (1<<REFS0); // Den ADC initialisieren und einen sog. Dummyreadout machen ADCSRA |= (1<<ADSC); while(ADCSRA & (1<<ADSC)); // Jetzt 3x die analoge Spannung and Kanal channel auslesen // und dann Durchschnittswert ausrechnen. for(i=0; i<3; i++) { // Eine Wandlung ADCSRA |= (1<<ADSC); // Auf Ergebnis warten... while(ADCSRA & (1<<ADSC)); result += ADCW; } // ADC wieder deaktivieren ADCSRA &= ~(1<<ADEN); result /= 3; return result; } int main(void) { uint16_t result = readADC(0); //Auslesen der analogen Spannungen an Pin 0, // also ADC0. In result steht das Ergebnis. return 0; }
Bascom
Dieses Programmbeispiel ist für den Atmel Controller Mega32 gedacht. Es gibt nacheinander die Spannungen der einzelnen Kanäle (ADC0..7) aus. Dazwischen macht es immer 800 ms pause.
' Die gemessene Spannung wird in der Variablen W gespeichert. ' Channel ist der Pin, an dem die Spannung gemessen werden soll. $baud = 9600 $crystal = 1000000 $regfile "m32def.dat" Config Adc = Single , Prescaler = Auto Start Adc Dim W As Word , Channel As Byte Channel = 0 Do W = Getadc(channel) Print "ADC-Pin " ; Channel ; ": Wert " ; W Incr Channel If Channel > 7 Then Channel = 0 Waitms 800 Loop End
Registerübersicht
Hinweis: Diese Registertabellen wurden für den aktuellen Atmel Controller Mega16 und Mega32 erstellt. Wenn Sie ein anderes Modell verwenden, kann es sein, dass ein oder mehrere Register nicht existieren oder sie eine andere Bezeichnung haben. |
ADCSRA
ADC Control and Status Register A
Dieser Register dient dazu den ADC zu kontrollieren.
Bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Name: | ADEN | ADSC | ADATE | ADIF | ADIE | ADPS2 | ADPS1 | ADPS0 |
- ADEN (ADC Enable)
Wird dieses Bit gesetzt (also 1), dann wird der ADC aktiviert. Wird eine 0 geschrieben, wird der ADC deaktiviert. Wird der ADC während einer Wandlung deaktiviert, wird die Wandlung abgebrochen. - ADSC (ADC Start Conversion)
Dieses Bit startet den Messvorgang, je nachdem in welchem Betriebsmodi der ADC läuft. Wird dieses Bit nach der Aktivierung des ADC über ADEN zum ersten Mal gesetzt, wird der ADC erst eine Initialisierungswandlung durchführen und danach erst die eigentliche Wandlung. Das Schreiben einer 0 auf das Bit hat keinen Effekt. - ADATE (ADC Auto Trigger Enable)
Wird dieses Bit gesetzt, wird das Auto Triggering des ADC aktiviert. Die genaue Triggerquelle wir im Register SFIOR eingestellt. Default ist das der Free-runnng mode. - ADIF (ADC Interrupt Flag)
Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das ADIE-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann es gelöscht werden, indem eine 1 auf das Bit geschrieben wird. - ADIE (ADC Interrupt Enable)
Wird dieses Bit gesetzt und die globalen Interrupts sind aktiviert, wird der ADC Complete Interrupt aktiviert, auf den dann in der entsprechenden ISR reagiert werden kann. - ADPS2 (ADC Prescaler Select Bit 2)
Diese Bits bestimmen den Teilungsfaktor zwischen der CPU-Frequenz und dem Eingangstakt des ADC. Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt sollte zwischen 50kHz und 200kHz liegen. Siehe Teilungsfaktor. Folgende Teilungsfaktoren sind verfügbar:
ADPS2 | ADPS1 | ADPS0 | Teilungsfaktor |
---|---|---|---|
0 | 0 | 0 | 2 |
0 | 0 | 1 | 2 |
0 | 1 | 0 | 4 |
0 | 1 | 1 | 8 |
1 | 0 | 0 | 16 |
1 | 0 | 1 | 32 |
1 | 1 | 0 | 64 |
1 | 1 | 1 | 128 |
- ADPS1 (ADC Prescaler Select Bit 1)
Siehe ADPS2 für eine Beschreibung. - ADPS0 (ADC Prescaler Select Bit 0)
Siehe ADPS2 für eine Beschreibung.
ADMUX
ADC Multiplexer Selection Register
Mit diesem Register wird u.a. der Multiplexer gesteuert. Das Register ist intern gepuffert. Eine gerade laufende Wandlung wird ggf. noch mit den alten Einstellungen ausgeführt, bevor die neue Einstellung übernommen wird.
Bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Name: | REFS1 | REFS0 | ADLAR | MUX4 | MUX3 | MUX2 | MUX1 | MUX0 |
- REFS0, REFS1 (Reference Selection Bits 0,1)
Diese Bits bestimmen, welche Referenzspannung der ADC verwenden soll. Die möglichen Quellen sind unten aufgelistet.
REFS1 | REFS0 | Referenzspannungsquelle |
---|---|---|
0 | 0 | AREF, internes Vref deaktiviert |
0 | 1 | AVCC mit externen Kondensator am AREF Pin |
1 | 0 | Keine Funktion, reserviert |
1 | 1 | Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin |
- ADLAR (ADC Left Adjust Result)
Dieses Bit beeinflusst, wie der ermittelte Messwert im ADC Data Register abgelegt wird. Bei ADLAR=1 liegen die oberen 8 Bits im Register ADCH.
- MUX3,MUX4 (Analog Channel and Gain Selection Bits 3,4)
Mit diesen Bits können Gain und Differenz-Kanäle gewählt werden. Speziell steht 00 für keine Verstärkung und einfache Eingänge. Weitere Möglichkeiten stehen im Datenblatt.
MUX4..0 | Eingang |
---|---|
00000 | ADC0 |
00001 | ADC1 |
00010 | ADC2 |
00011 | ADC3 |
00100 | ADC4 |
00101 | ADC5 |
00110 | ADC6 |
00111 | ADC7 |
10000 | ADC0-ADC1 |
11110 | Ref. 1.22 V |
- MUX0...MUX2 (Analog Channel and Gain Selection Bits 0..2)
Auswahl des Eingangskanals. Siehe Tabelle. Für die einfachen Kanäle reicht es also einfach die Kanalnummer in die unteren Bits von ADMUX zu schreiben.
ADCL / ADCH
Desweiteren gibt es noch die Register ADCL/ADCH hier steht das Ergebnis einer Wandlung. Wie bei den meisten auf 2 Register verteilten Werten, bewirkt das lesen des Low-Bytes ein puffern des High-bytes. Der Wert wird folgendermaßen ausgelesen:
uint16_t x = ADCL; x += (ADCH<<8); // oder besser x = ADCW; // Der Compiler sorgt hier für die richtige Reihenfolge beim Zugriff
Siehe auch