Auslesen mehrerer ADC-Kanäle auf dem AVR Atmega32
Teilen
Lesen mehrerer ADC-Kanäle auf dem AVR Atmega32
Was bedeutet mehrere Kanäle? Wenn Sie mehr als eine analoge Spannungsquelle haben, mehr als einen Sensor zum Beispiel, können Sie alle davon lesen, solange die Anzahl der Quellen kleiner ist als die Anzahl der ADC-Pins, die Sie auf Ihrem Mikrocontroller haben. Der Atmega32 hat 8 ADC-Pins. Das Einzige, was Sie beim Programmieren des ADC zum Lesen mehrerer Kanäle beachten müssen, ist, dass jeweils nur ein Kanal für die Umwandlung verwendet werden kann.
Hätten wir zwei Sensoren und würden wir Kanal (Pin) 3 und 4 verwenden, um jeden Sensor auszulesen, müssten wir zuerst den Kanal auf 3 einstellen und dann eine Umwandlung starten. Nachdem die Umwandlung abgeschlossen und die Zahl erfasst wurde, kann der Kanal auf 4 umgeschaltet werden und diese Zahl kann erfasst werden. Diese Prozesse zum Abrufen der ADC-Ergebnisse für jeden Kanal können in einer Schleife durchgeführt und auf dem LCD angezeigt werden.
Der ADC wird initialisiert, wie wir es bei den Beschleunigungsmesser-Messungen getan haben, und in diesem Fall verbinden wir die X-Achse des Beschleunigungsmessers mit Kanal 0 und die Y-Achse mit Kanal 1. Es gibt keine Vorinitialisierung des ADC-Kanals, bevor wir den ADC aktivieren, da wir mit Kanal 0 beginnen, dem Standardkanal.
In der Interrupt-Service-Routine (der Routine, die mit ISR beginnt) werden Sie einige neue Anweisungen sehen, wie z.B. switch und case. Dies ist eine sehr schöne Art, eine Auswahl entsprechend einem Wert zu treffen, der in einer Variablen enthalten ist. Es ist wie die Auswahl eines Restaurantmenüs. Die Variable, die in Klammern nach dem Wort switch enthalten ist, ist die Auswahl des Restaurantkunden und die verschiedenen unten aufgeführten Fälle sind alle Menüauswahlen.
#include
#include "MrLCD.h"
int main(void)
{
Send_A_StringToMrLCDWithLocation(1,1,"X:");
Send_A_StringToMrLCDWithLocation(1,2,"Y:");
ADCSRA |= 1<
sei();
ADCSRA |= 1<
while (1)
{
}
ISR(ADC_vect)
{
uint16_t theTenBitResult = ADCH<<8 | theLow;
switch (ADMUX)
{
ADMUX = 0xC1;
break;
ADMUX = 0xC0;
break;
break;