Reading Multiple ADC Channels on the AVR Atmega32
Share
Reading Multiple ADC Channels on the AVR Atmega32
What does multiple channels mean? If you have more than one analog voltage source, more than one sensor, for instance, you can read all of them as long as the number of sources is fewer than the number of ADC pins you have on your microcontroller. With the Atmega32, there are 8 ADC pins. The only thing to keep in mind when programming the ADC to read multiple channels is that only one channel can be used in the conversion at a time.
If we had two sensors, and we are using channel (pin) 3 and 4 to read each sensor, we would first need to set the channel for 3 and then start a conversion. After the conversion is finished and the number is captured, then the channel can be switch to 4 and that number can be captures. These processes of getting the ADC results for each channel can be done in a loop and displayed on the LCD.
The ADC is initialized as we did with the accelerometer readings and in this case, we are connecting the X axis of the accelerometer to channel 0 and the Y axis to channel 1. There is not preinitialization of the ADC channel before we enable the ADC because we are starting with channel 0 which is the default channel.
In the interrupt service routine (the routine starting with ISR), you will see a few new statements, such as switch and case. This is a very nice way to make a selection according to a value contained by a variable. It's like making a restaurant menu selection. The variable that is contained within parentheses after the word switch is the restaurant customer's selection and the various cases listed below are all the menu selections.
#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;