1.36.1 Analog-to-Digital Converter (ADC)

  • 12-bit Resolution with Enhanced Mode up to 16 bits

  • 500 ksps Conversion Rate

  • Digital Averaging Function providing Enhanced Resolution Mode up to 16 bits

  • Selectable Single-Ended or Differential Input Voltage

  • Integrated Multiplexer Offering Up to 8 Independent Analog Inputs

  • Individual Enable and Disable of Each Channel

  • Hardware or Software Trigger

  • Two Sleep Modes

  • Channel Sequence Customization

  • Automatic Window Comparison of Converted Values

Using The Library

Interrupt mode:

#include <stddef.h>                     // Defines NULL
#include <stdbool.h>                    // Defines true
#include <stdlib.h>                     // Defines EXIT_FAILURE
#include "definitions.h"                // SYS function prototypes

/*****************************************************
 ADC CH0 - PA17 - Connect to Vcc
 ADC CH1 - PA18 - connect to Vcc
 ADC_CH2 - PA19 - Connect to GND
 *****************************************************/

#define ADC_VREF               (3.3f)

uint16_t adc_ch0_count, adc_ch1_count, adc_ch2_count;

float adc_ch0_voltage, adc_ch1_voltage, adc_ch2_voltage;

volatile bool result_ready = false;

/* This function is called after conversion of last channel in the user sequence */
void ADC_EventHandler(uint32_t status, uintptr_t context)
{
    /* Read the result of 3 channels*/
    adc_ch2_count = ADC_ChannelResultGet(ADC_CH2);
    adc_ch0_count = ADC_ChannelResultGet(ADC_CH0);
    adc_ch1_count = ADC_ChannelResultGet(ADC_CH1);
       
    result_ready = true;

}

// *****************************************************************************
// *****************************************************************************
// Section: Main Entry Point
// *****************************************************************************
// *****************************************************************************

int main ( void )
{
    /* Initialize all modules */
    SYS_Initialize ( NULL );
    
    /* Register callback function for ADC end of conversion interrupt*/
    ADC_CallbackRegister(ADC_EventHandler, (uintptr_t)NULL);
    
    printf("\n\r---------------------------------------------------------");
    printf("\n\r                    ADC User Sequence Demo                 ");
    printf("\n\r---------------------------------------------------------\n\r");
    printf("CH0 Count  CH0 Voltage  CH1 Count  CH1 Voltage  CH2 Count  CH2 Voltage \n\r");           

    /* Start ADC conversion */
    ADC_ConversionStart();

    while ( true )
    {
        /* Check if result is ready to be transmitted to console */
        if (result_ready == true)
        {
            adc_ch2_voltage = (float)adc_ch2_count * ADC_VREF/4095U;
            adc_ch0_voltage = (float)adc_ch0_count * ADC_VREF/4095U;
            adc_ch1_voltage = (float)adc_ch1_count * ADC_VREF/4095U;
            printf("0x%03x      %0.2f V       0x%03x      %0.2f V       0x%03x      %0.2f V \t\r",
                    adc_ch0_count, adc_ch0_voltage, adc_ch1_count, adc_ch1_voltage, adc_ch2_count, adc_ch2_voltage);
                           
                
            result_ready = false;
 
            SYSTICK_DelayMs(2000);

            /* Start ADC conversion */
            ADC_ConversionStart();
        }
    }

    /* Execution should not come here during normal operation */

    return ( EXIT_FAILURE );
}

Polling mode:

#include <stddef.h>                     // Defines NULL
#include <stdbool.h>                    // Defines true
#include <stdlib.h>                     // Defines EXIT_FAILURE
#include <stdio.h>
#include "definitions.h"                // SYS function prototypes

/*****************************************************
 ADC CH0 - PA17 - Connect to Vcc or GND
 *****************************************************/

#define ADC_VREF               (3.3f)

uint16_t adc_count;
float input_voltage;

// *****************************************************************************
// *****************************************************************************
// Section: Main Entry Point
// *****************************************************************************
// *****************************************************************************

int main ( void )
{
    /* Initialize all modules */
    SYS_Initialize ( NULL );
    
    printf("\n\r---------------------------------------------------------");
    printf("\n\r                    ADC Demo                 ");
    printf("\n\r---------------------------------------------------------\n\r");
    
    while (1)
    {
        /* Start ADC conversion */
        ADC_ConversionStart();

        /* Wait till ADC conversion result is available */
        while(!ADC_ChannelResultIsReady(ADC_CH0))
        {

        };

        /* Read the ADC result */
        adc_count = ADC_ChannelResultGet(ADC_CH0);
        input_voltage = (float)adc_count * ADC_VREF / 4095U;

        printf("ADC Count = 0x%03x, ADC Input Voltage = %0.2f V \r",adc_count, input_voltage);    
        
        SYSTICK_DelayMs(1000);
    }
    
    /* Execution should not come here during normal operation */

    return ( EXIT_FAILURE );
}

Library Interface

Analog-to-Digital Converter peripheral library provides the following interfaces:

Functions

Name Description
ADCx_Initialize Initializes given instance of ADC peripheral
ADC_ChannelsEnable Enables the ADC channels
ADC_ChannelsDisable Disables the ADC channels
ADC_ChannelsInterruptEnable Enables the ADC interrupt sources
ADC_ChannelsInterruptDisable Disables the ADC interrupt sources
ADCx_ConversionStart Starts the ADC conversion of all the enabled channels with the software trigger
ADC_ChannelResultIsReady Returns the status of the channel conversion
ADC_ChannelResultGet Reads the conversion result of the channel
ADC_ConversionSequenceSet Sets the user sequence of the channel conversion
ADCx_CallbackRegister Registers the function to be called from interrupt

Data types and constants

Name Type Description
ADC_CHANNEL_MASK Enum Identifies ADC channel mask
ADC_CHANNEL_NUM Enum Identifies ADC channel number
ADC_INTERRUPT_MASK Enum Identifies interrupt sources number
ADC_CALLBACK Typedef Defines the data type and function signature for the ADC peripheral callback function
ADC_CALLBACK_OBJECT Struct ADC Callback structure