- Was ist ADC (Analog-Digital-Wandlung)?
- ADC im AVR-Mikrocontroller Atmega16
- Erforderliche Komponenten
- Schaltplan
- Einrichten von ADC-Steuerregistern in Atmega16
- Atmega16 für ADC programmieren
Eine gemeinsame Funktion, die in fast jeder eingebetteten Anwendung verwendet wird, ist das ADC-Modul (Analog-Digital-Wandler). Diese Analog-Digital-Wandler können die Spannung von analogen Sensoren wie Temperatursensor, Neigungssensor, Stromsensor, Flex-Sensor usw. lesen. In diesem Tutorial erfahren Sie, was ADC ist und wie ADC in Atmega16 verwendet wird. Dieses Tutorial beinhaltet das Anschließen eines kleinen Potentiometers an den ADC-Pin von Atmega16 und 8 LEDs werden verwendet, um die sich ändernde Spannung des ADC-Ausgangswerts in Bezug auf die Änderung des ADC-Eingangswerts anzuzeigen.
Zuvor haben wir ADC in anderen Mikrocontrollern erklärt:
- Verwendung von ADC in ARM7 LPC2148 - Messen der analogen Spannung
- Verwendung des ADC in STM32F103C8 - Messung der analogen Spannung
- Verwendung des ADC in MSP430G2 - Messung der analogen Spannung
- Wie verwende ich ADC in Arduino Uno?
- Verwendung des ADC-Moduls des PIC-Mikrocontrollers mit MPLAB und XC8
Was ist ADC (Analog-Digital-Wandlung)?
ADC steht für Analog-Digital-Wandler. In der Elektronik ist ein ADC ein Gerät, das ein analoges Signal wie Strom und Spannung in digitalen Code (binäre Form) umwandelt. In der realen Welt sind die meisten Signale analog und jeder Mikrocontroller oder Mikroprozessor versteht die binäre oder digitale Sprache (0 oder 1). Damit Mikrocontroller die analogen Signale verstehen, müssen wir diese analogen Signale in digitale Form umwandeln. ADC macht genau das für uns. Es gibt viele Arten von ADC für verschiedene Anwendungen. Nur wenige beliebte ADCs sind Flash, sukzessive Approximation und Sigma-Delta.
Der kostengünstigste ADC-Typ ist die sukzessive Approximation. In diesem Lernprogramm wird der ADC mit sukzessiver Approximation verwendet. Bei einem ADC-Typ mit sukzessiver Approximation wird nacheinander eine Reihe digitaler Codes erzeugt, die jeweils einem festen Analogpegel entsprechen. Ein interner Zähler wird verwendet, um mit dem zu konvertierenden analogen Signal zu vergleichen. Die Erzeugung wird gestoppt, wenn der Analogpegel gerade größer als das Analogsignal wird. Der digitale Code entspricht dem analogen Pegel ist die gewünschte digitale Darstellung des analogen Signals. Damit ist unsere kleine Erklärung zur sukzessiven Approximation abgeschlossen.
Wenn Sie sich eingehend mit dem ADC befassen möchten, lesen Sie unser vorheriges Tutorial zu ADC. ADCs sind in Form von ICs erhältlich, und auch Mikrocontroller sind heutzutage mit eingebauten ADCs ausgestattet. In diesem Tutorial verwenden wir den eingebauten ADC von Atmega16. Lassen Sie uns über den eingebauten ADC von Atmega16 diskutieren.
ADC im AVR-Mikrocontroller Atmega16
Atmega16 verfügt über einen eingebauten 10-Bit- und 8-Kanal-ADC. 10 Bit entspricht dem, wenn die Eingangsspannung 0-5 V beträgt, wird sie in 10-Bit-Werte aufgeteilt, dh 1024 Pegel diskreter Analogwerte (2 10 = 1024). Jetzt entspricht 8-Kanal den dedizierten 8 ADC-Pins auf Atmega16, an denen jeder Pin die analoge Spannung lesen kann. Der vollständige PortA (GPIO33-GPIO40) ist für den ADC-Betrieb vorgesehen. Standardmäßig sind die PORTA-Pins allgemeine E / A-Pins. Dies bedeutet, dass die Port-Pins gemultiplext werden. Um diese Pins als ADC-Pins zu verwenden, müssen bestimmte Register für die ADC-Steuerung konfiguriert werden. Aus diesem Grund werden die Register als ADC-Steuerregister bezeichnet. Lassen Sie uns diskutieren, wie diese Register eingerichtet werden, damit der eingebaute ADC funktioniert.
ADC-Pins in Atmega16
Erforderliche Komponenten
- Atmega16 Mikrocontroller IC
- 16 MHz Kristalloszillator
- Zwei 100nF Kondensatoren
- Zwei 22pF-Kondensatoren
- Druckknopf
- Überbrückungsdrähte
- Steckbrett
- USBASP v2.0
- LED (beliebige Farbe)
Schaltplan
Einrichten von ADC-Steuerregistern in Atmega16
1. ADMUX-Register (ADC Multiplexer Selection Register) :
Das ADMUX-Register dient zur Auswahl des ADC-Kanals und der Referenzspannung. Das folgende Bild zeigt die Übersicht des ADMUX-Registers. Die Beschreibung wird unten erklärt.
- Bit 0-4: Kanalauswahlbits.
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
ADC-Kanal ausgewählt |
0 |
0 |
0 |
0 |
0 |
ADC0 |
0 |
0 |
0 |
0 |
1 |
ADC1 |
0 |
0 |
0 |
1 |
0 |
ADC2 |
0 |
0 |
0 |
1 |
1 |
ADC3 |
0 |
0 |
1 |
0 |
0 |
ADC4 |
0 |
0 |
1 |
0 |
1 |
ADC5 |
0 |
0 |
1 |
1 |
0 |
ADC6 |
0 |
0 |
1 |
1 |
1 |
ADC7 |
- Bit-5: Hiermit wird das Ergebnis nach rechts oder links angepasst.
ADLAR |
Beschreibung |
0 |
Richtig das Ergebnis einstellen |
1 |
Links das Ergebnis anpassen |
- Bit 6-7: Sie dienen zur Auswahl der Referenzspannung für den ADC.
REFS1 |
REFS0 |
Auswahl der Spannungsreferenz |
0 |
0 |
AREF, Interne Vref ausgeschaltet |
0 |
1 |
AVcc mit externem Kondensator am AREF-Pin |
1 |
0 |
Reserviert |
1 |
1 |
Interne 2,56-Spannungsreferenz mit externem Kondensator am AREF-Pin |
Beginnen Sie nun damit, diese Registerbits im Programm so zu konfigurieren, dass der interne ADC gelesen und an alle Pins von PORTC ausgegeben wird.
Atmega16 für ADC programmieren
Das vollständige Programm finden Sie weiter unten. Brennen Sie das Programm in Atmega16 mit JTAG und Atmel Studio und drehen Sie das Potentiometer, um den ADC-Wert zu variieren. Hier wird der Code Zeile für Zeile erklärt.
Beginnen Sie mit einer Funktion zum Lesen des ADC-konvertierten Werts. Dann Kanalwert passiert, wie ‚Chnl‘ in ADC_Read Funktion.
unsigned int ADC_read (unsigned char chnl)
Die Kanalwerte müssen zwischen 0 und 7 liegen, da wir nur 8 ADC-Kanäle haben.
chnl = chnl & 0b00000111;
Durch Schreiben von '40', dh '01000000' in das ADMUX-Register haben wir PORTA0 als ADC0 ausgewählt, wo der Analogeingang für die digitale Konvertierung angeschlossen wird.
ADMUX = 0x40;
Dieser Schritt umfasst nun den ADC-Konvertierungsprozess, bei dem durch Schreiben von ONE in das ADSC-Bit im ADCSRA-Register die Konvertierung gestartet wird. Warten Sie danach, bis das ADIF-Bit den Wert zurückgibt, wenn die Konvertierung abgeschlossen ist. Wir stoppen die Konvertierung, indem wir '1' in das ADIF-Bit im ADCSRA-Register schreiben. Wenn die Konvertierung abgeschlossen ist, geben Sie den ADC-Wert zurück.
ADCSRA - = (1 <
Hier wird die interne ADC-Referenzspannung durch Setzen des REFS0-Bits ausgewählt. Aktivieren Sie danach ADC und wählen Sie Prescaler als 128.
ADMUX = (1 <
Speichern Sie nun den ADC-Wert und senden Sie ihn an PORTC. In PORTC sind 8 LEDs angeschlossen, die den digitalen Ausgang im 8-Bit-Format anzeigen. Das gezeigte Beispiel variiert die Spannung zwischen 0 V und 5 V mit einem 1K-Poti.
i = ADC_read (0); PORTC = i;
Das Digitalmultimeter wird verwendet, um die analoge Eingangsspannung im ADC-Pin anzuzeigen, und 8 LEDs werden verwendet, um den entsprechenden 8-Bit-Wert des ADC-Ausgangs anzuzeigen. Drehen Sie einfach das Potentiometer und sehen Sie das entsprechende Ergebnis sowohl auf dem Multimeter als auch auf den leuchtenden LEDs.
Der vollständige Code und das Arbeitsvideo sind unten angegeben.