Inhaltsverzeichnis:

Einführung in ADC im AVR-Mikrocontroller - für Anfänger: 14 Schritte
Einführung in ADC im AVR-Mikrocontroller - für Anfänger: 14 Schritte

Video: Einführung in ADC im AVR-Mikrocontroller - für Anfänger: 14 Schritte

Video: Einführung in ADC im AVR-Mikrocontroller - für Anfänger: 14 Schritte
Video: Einführung [01 | AVR - Mikrocontroller C] by Fusel 2024, Juli
Anonim
Einführung in ADC im AVR-Mikrocontroller | für Anfänger
Einführung in ADC im AVR-Mikrocontroller | für Anfänger

In diesem Tutorial erfahren Sie alles über ADC im avr-Mikrocontroller

Schritt 1: Was ist ein ADC?

Ein ADC oder Analog-Digital-Wandler ermöglicht es, eine analoge Spannung in einen digitalen Wert umzuwandeln, der von einem Mikrocontroller verwendet werden kann. Es gibt viele Quellen für analoge Signale, die man messen möchte. Es stehen analoge Sensoren zur Verfügung, die Temperatur, Lichtintensität, Abstand, Position und Kraft messen, um nur einige zu nennen.

Schritt 2: Wie ADC im AVR-Mikrocontroller funktioniert

Der AVR-ADC ermöglicht es dem AVR-Mikrocontroller, analoge Spannungen mit wenigen bis gar keinen externen Teilen in digitale Werte umzuwandeln. Der ATmega8 verfügt über einen 10-Bit-ADC mit sukzessiver Approximation. ATmega8 verfügt über einen 7-Kanal-ADC an PortC. Der ADC hat einen separaten analogen Versorgungsspannungs-Pin, AVCC. AVCC darf nicht mehr als ± 0,3V von VCC abweichen. Die Spannungsreferenz darf am Pin AREF extern entkoppelt werden. Als Spannungsreferenz wird AVCC verwendet. Der ADC kann auch so eingestellt werden, dass er kontinuierlich läuft (Freilaufmodus) oder nur eine Konvertierung durchführt.

Schritt 3: ADC-Umwandlungsformel

ADC-Umwandlungsformel
ADC-Umwandlungsformel

Dabei ist Vin die Spannung am ausgewählten Eingangspin und Vref die ausgewählte Spannungsreferenz

Schritt 4: Wie konfiguriere ich ADC in ATmega8?

Wie konfiguriere ich ADC in ATmega8?
Wie konfiguriere ich ADC in ATmega8?

Die folgenden Register werden für die Implementierung von ADC in ATmega8 verwendet

Auswahl des ADC-Multiplexers

Schritt 5: ADLAR-Auswahl

ADLAR-Auswahl
ADLAR-Auswahl
ADLAR-Auswahl
ADLAR-Auswahl

Ergebnis der ADC-Linksanpassung Das ADLAR-Bit beeinflusst die Darstellung des ADC-Umwandlungsergebnisses im ADC-Datenregister. Schreiben Sie eins in ADLAR, um das Ergebnis nach links anzupassen. Ansonsten ist das Ergebnis richtig eingestellt

Wenn eine ADC-Umwandlung abgeschlossen ist, wird das Ergebnis in ADCH und ADCL gefunden. Wenn ADCL gelesen wird, wird das ADC-Datenregister nicht aktualisiert, bis ADCH gelesen wird. Folglich reicht es aus, ADCH zu lesen, wenn das Ergebnis linksabgeglichen wird und nicht mehr als 8-Bit-Präzision erforderlich ist. Andernfalls muss zuerst ADCL gelesen werden, dann ADCH. Auswahlbits für analoge Kanäle Der Wert dieser Bits wählt aus, welche analogen Eingänge mit dem ADC verbunden sind.

Schritt 6: ADCSRA-Auswahl

ADCSRA-Auswahl
ADCSRA-Auswahl
ADCSRA-Auswahl
ADCSRA-Auswahl

• Bit 7 – ADEN: ADC Enable Das Schreiben dieses Bits auf eins aktiviert den ADC. Durch Schreiben auf Null wird der ADC ausgeschaltet

• Bit 6 – ADSC: ADC Start Conversion Im Single Conversion-Modus schreiben Sie dieses Bit auf eins, um jede Konvertierung zu starten. Schreiben Sie dieses Bit im Free Running-Modus auf eins, um die erste Konvertierung zu starten.

• Bit 5 – ADFR: ADC-Freilaufauswahl Wenn dieses Bit gesetzt (eins) ist, arbeitet der ADC im Freilaufmodus. In diesem Modus tastet der ADC die Datenregister kontinuierlich ab und aktualisiert sie. Das Löschen dieses Bits (Null) beendet den Freilaufmodus.

• Bit 4 – ADIF: ADC-Interrupt-Flag Dieses Bit wird gesetzt, wenn eine ADC-Wandlung abgeschlossen ist und die Datenregister aktualisiert werden. Der ADC-Umwandlungs-Abschluss-Interrupt wird ausgeführt, wenn das ADIE-Bit und das I-Bit im SREG gesetzt sind. ADIF wird von der Hardware gelöscht, wenn der entsprechende Interrupt-Handling-Vektor ausgeführt wird. Alternativ wird ADIF gelöscht, indem eine logische Eins in das Flag geschrieben wird.

• Bit 3 – ADIE: ADC Interrupt Enable Wenn dieses Bit auf eins geschrieben und das I-Bit im SREG gesetzt ist, wird der ADC Conversion Complete Interrupt aktiviert.

• Bits 2:0 – ADPS2:0: ADC Prescaler Select Bits Laut Datenblatt muss dieser Preskalar so eingestellt werden, dass die ADC-Eingangsfrequenz zwischen 50 KHz und 200 KHz liegt. Der ADC-Takt wird mit Hilfe von ADPS2:0 aus dem Systemtakt abgeleitet. Diese Bits bestimmen den Teilungsfaktor zwischen der XTAL-Frequenz und dem Eingangstakt des ADC.

Schritt 7: Wenn Sie den ADC-Wert nutzen möchten, müssen Sie einige der unten aufgeführten Arbeiten ausführen

  • ADC-Wert einstellen
  • Ausgangs-LED-Pin konfigurieren
  • ADC-Hardware konfigurieren
  • ADC aktivieren
  • Analog-Digital-Wandlungen starten
  • WÄHREND für immer

WENN ADC-Wert höher als eingestellter Wert, LED einschalten ELSE LED ausschalten

Schritt 8: ADC-Wert einstellen

Code: uint8_t ADCValue =128;

Schritt 9: Ausgangs-LED-Pin konfigurieren

Code: DDRB|= (1 << PB1);

Schritt 10: ADC-Hardware konfigurieren

ADC-Hardware konfigurieren

Dies erfolgt durch Setzen von Bits in den Steuerregistern für den ADC. Legen wir zunächst den Preskalar für den ADC fest. Laut Datenblatt muss dieser Preskalar so eingestellt werden, dass die ADC-Eingangsfrequenz zwischen 50 KHz und 200 KHz liegt. Der ADC-Takt wird vom Systemtakt abgeleitet. Bei einer Systemfrequenz von 1MHz ergibt ein Prescaler von 8 eine ADC-Frequenz von 125 Khz. Die Vorskalierung wird durch die ADPS-Bits im ADCSRA-Register eingestellt. Laut Datenblatt müssen alle drei ADPS2:0 Bits auf 011 gesetzt werden um den 8 Prescaler zu erhalten.

Code: ADCSRA |= (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

Als nächstes stellen wir die ADC-Referenzspannung ein. Dies wird durch die REFS-Bits im ADMUX-Register gesteuert. Im Folgenden wird die Referenzspannung auf AVCC eingestellt.

Code: ADMUX |= (1 << REFS0);

Um den durch den Multiplexer zum ADC geleiteten Kanal einzustellen, müssen die MUX-Bits im ADMUX-Register entsprechend gesetzt werden. Da wir hier ADC5 verwenden

Code: ADMUX&=0xF0; ADMUX|=5;

Um den ADC in den Freilaufmodus zu versetzen, setzen Sie das passend benannte ADFR-Bit im ADCSRA-Register:

Code: ADCSRA |= (1 << ADFR);

Eine letzte Änderung der Einstellungen wird vorgenommen, um das Lesen des ADC-Werts zu vereinfachen. Obwohl der ADC eine Auflösung von 10 Bit hat, sind so viele Informationen oft nicht notwendig. Dieser 10-Bit-Wert wird auf zwei 8-Bit-Register, ADCH und ADCL, aufgeteilt. Standardmäßig werden die niedrigsten 8 Bits des ADC-Werts in ADCL gefunden, wobei die oberen beiden die niedrigsten beiden Bits von ADCH sind. Durch Setzen des ADLAR-Bits im ADMUX-Register können wir den ADC-Wert nach links ausrichten. Dadurch werden die höchsten 8 Bits der Messung im ADCH-Register abgelegt, der Rest im ADCL-Register. Wenn wir dann das ADCH-Register lesen, erhalten wir einen 8-Bit-Wert, der unsere 0 bis 5 Volt-Messung als Zahl von 0 bis 255 darstellt. Wir verwandeln unsere 10-Bit-ADC-Messung im Grunde in eine 8-Bit-Messung. Hier ist der Code zum Setzen des ADLAR-Bits:

Code:

ADMUX |= (1 << ADLAR); Damit ist die Einrichtung der ADC-Hardware für dieses Beispiel abgeschlossen. Zwei weitere Bits müssen gesetzt werden, bevor der ADC mit der Messung beginnt.

Schritt 11: ADC aktivieren

Um den ADC zu aktivieren, setzen Sie das ADEN-Bit in ADCSRA:

Code: ADCSRA |= (1 << ADEN);

Schritt 12: Analog-zu-Digital-Wandlungen starten

Um die ADC-Messungen zu starten, muss das ADSC-Bit in ADCSRA gesetzt werden:

Code: ADCSRA |= (1 << ADSC);

An diesem Punkt würde der ADC beginnen, die an ADC5 präsentierte Spannung kontinuierlich abzutasten. Der Code bis zu diesem Punkt würde so aussehen:

Schritt 13: WÄHREND für immer

Sie müssen nur noch den ADC-Wert testen und die LEDs so einstellen, dass sie eine High / Low-Anzeige anzeigen. Da der ADC-Messwert in ADCH einen Maximalwert von 255 hat, wurde ein Testwert von th gewählt, um zu bestimmen, ob die Spannung hoch oder niedrig war. Eine einfache IF/ELSE-Anweisung in den FOR-Schleifen ermöglicht es uns, die richtige LED einzuschalten:

Code

if(ADCH >ADCWert)

{

PORTB |= (1 << PB0); // LED einschalten

}

anders

{

PORTB&= ~(1 << PB0); // LED ausschalten

}

Schritt 14: Am Ende ist der vollständige Code

Code:

#enthalten

int main (void)

{

uint8_t ADCValue = 128;

DDRB |= (1 << PB0); // Setze LED1 als Ausgang

ADCSRA |= (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // ADC Prescalar auf 8 setzen - // 125KHz Abtastrate 1MHz

ADMUX |= (1 << REFS0); // ADC-Referenz auf AVCC setzen

ADMUX |= (1 << ADLAR); // ADC-Ergebnis links anpassen, um einfaches 8-Bit-Lesen zu ermöglichen

ADMUX&=0xF0;

ADMUX|=5; // MUX-Werte mussten geändert werden, um ADC0 zu verwenden

ADCSRA |= (1 << ADFR); // ADC in den Freilaufmodus setzen

ADCSRA |= (1 << ADEN); // ADC aktivieren

ADCSRA |= (1 << ADSC); // A2D-Konvertierungen starten while(1) // Endlosschleife

{

if(ADCH > ADCWert)

{

PORTB |= (1 << PB0); // LED1 einschalten

}

anders

{

PORTE &= ~(1 << PB1); // LED1 ausschalten

}

}

0 zurückgeben;

}

Zuerst dieses Tutorial veröffentlichen Klicken Sie hier

Empfohlen: