Microchip® Advanced Software Framework

Quickstart guide for SAM ADC driver

This is the quickstart guide for the SAM ADC driver, with step-by-step instructions on how to configure and use the driver in a selection of use cases.

The use cases contain several code fragments. The code fragments in the steps for setup can be copied into a custom initialization function, while the steps for usage can be copied into, e.g., the main application function.

Basic use case

In this basic use case, the ADC module and single channel are configured for:

  • 12-bit, unsigned conversions
  • Internal bandgap as 3.3 V reference
  • ADC clock rate of at most 6.4 MHz and maximum sample rate is 1 MHz
  • Software triggering of conversions
  • Interrupt-based conversion handling
  • Single channel measurement
  • ADC_CHANNEL_5 as positive input

Prerequisites

  1. System Clock Management (Sysclock)
  2. Power Management Controller (PMC)

Setup steps

Example code

Add to application C-file:

void ADC_IrqHandler(void)
{
// Check the ADC conversion status
if ((adc_get_status(ADC) & ADC_ISR_DRDY) == ADC_ISR_DRDY)
{
// Get latest digital data value from ADC and can be used by application
uint32_t result = adc_get_latest_value(ADC);
}
}
void adc_setup(void)
{
adc_init(ADC, sysclk_get_main_hz(), ADC_CLOCK, 8);
adc_configure_timing(ADC, 0, ADC_SETTLING_TIME_3, 1);
adc_set_resolution(ADC, ADC_MR_LOWRES_BITS_12);
adc_enable_channel(ADC, ADC_CHANNEL_5);
adc_enable_interrupt(ADC, ADC_IER_DRDY);
adc_configure_trigger(ADC, ADC_TRIG_SW, 0);
}

Workflow

  1. Define the interrupt service handler in the application:
    • void ADC_IrqHandler(void)
      {
      //Check the ADC conversion status
      if ((adc_get_status(ADC) & ADC_ISR_DRDY) == ADC_ISR_DRDY)
      {
      //Get latest digital data value from ADC and can be used by application
      uint32_t result = adc_get_latest_value(ADC);
      }
      }
    • Note
      Get ADC status and check if the conversion is finished. If done, read the last ADC result data.
  2. Initialize the given ADC with the specified ADC clock and startup time:
    • adc_init(ADC, sysclk_get_main_hz(), ADC_CLOCK, 8);
    • Note
      The ADC clock range is between master clock / 2 and master clock / 512. The function sysclk_get_main_hz() is used to get the master clock frequency while ADC_CLOCK gives the ADC clock frequency.
  3. Configure ADC timing:
    • adc_configure_timing(ADC, 0, ADC_SETTLING_TIME_3, 1);
    • Note
      Tracking Time = (0 + 1) * ADC Clock period Settling Time = ADC_SETTLING_TIME_3 * ADC Clock period Transfer Time = (1 * 2 + 3) * ADC Clock period
  4. Set the ADC resolution.
    • adc_set_resolution(ADC, ADC_MR_LOWRES_BITS_12);
    • Note
      The resolution value can be set to 10 bits or 12 bits.
  5. Enable the specified ADC channel:
  6. Enable ADC interrupts:
  7. Configure software conversion trigger:

Usage steps

Example code

Add to, e.g., main loop in application C-file:

adc_start(ADC);

Workflow

  1. Start ADC conversion on channel:

Advanced use cases

For more advanced use of the ADC driver, see the following use cases: