This example shows how to measure the analog input of a sensor using the ADC on TM4C123 Tiva C LaunchPad.
Configuring the GPIO for ADC input
1 Enable the clock to GPIO pin by using RCGCGPIO.
SYSCTL -> RCGCGPIO ; //Enable clock to PORTE
2. Set the GPIOAFSEL (GPIO alternate function) bit for ADC input pin to 1.
GPIOE -> AFSEL |=8;
3. Configure AINx signal to be used as analog input by clearing the bit in the GPIODEN (GPIO Digital enable) register.
GPIOE -> DEN &= ~8; //Disable digital function
4. Disable the Analog isolation circuit for ADC input pins by writing a 1 to the GPIOAMSEL register.
GPIOE -> AMSEL |=8; //Enable analog function
Configuring and reading the ADC
1.Enable the clock to the ADC. e.g. ADC0
SYSCTL ->RCGCADC |=3; // Enable ADC0 clock
2.Disable Sample Sequencer before making changes
ADC0 -> ACTSS &= ~8 ;// Disable SS3
3.Select start conversion trigger method .e.g. using software trigger
ADC0 -> EMUX &= ~0xF000; //Use software trigger
4.Select ADC input channel
ADC0 -> SSMUX3 =0; // Select AIN0 connected to PE3
5. Set Sample Sequencer Control characteristics
ADC0 ->SSCTL3 |= 6; // single-ended, one-conversion and raw interrupt
6.Enable Sample Sequencer
ADC0 -> ACTSS |= 8; //Enable Sample Sequencer 3
7.Start conversion
ADC0 -> PSSI |= 8 ; //Start conversion by SS3
8. Poll for the end-of-conversion flag
while((ADC0 -> RIS & 8) == 0) ;//Wait for conversion to complete
9.Read ADC results when conversion is complete
ADC0 -> SSFIFO3; // Read conversion results
10. Clear conversion complete flag
ADC0 -> ISC =8 ;
Full Program Source
#include "TM4C123.h"; // Device header int main(void) { volatile int result; /* enable clocks */ SYSCTL->RCGCGPIO |= 0x10; /* enable clock to GPIOE (AIN0 is on PE3) */ SYSCTL-> |= 1; /* enable clock to ADC0 */ /* initialize PE3 for AIN0 input */ GPIOE->AFSEL |= 8; /* enable alternate function */ GPIOE->DEN &= ~8; /* disable digital function */ GPIOE->AMSEL |= 8; /* enable analog function */ /* initialize ADC0 */ ADC0->ACTSS &= ~8; /* disable SS3 during configuration */ ADC0->EMUX &= ~0xF000; /* software trigger conversion */ ADC0->SSMUX3 = 0; /* get input from channel 0 */ ADC0->SSCTL3 |= 6; /* take one sample at a time, set flag at 1st sample */ ADC0->ACTSS |= 8; /* enable ADC0 sequencer 3 */ while(1) { ADC0->PSSI |= 8; /* start a conversion sequence 3 */ while((ADC0->RIS & 8) == 0) ; /* wait for conversion complete */ result = ADC0->SSFIFO3; /* read conversion result */ ADC0->ISC = 8; /* clear completion flag */ } }