All Data Structures Functions Variables Typedefs Enumerations Enumerator Groups Pages
ADC16: 16-bit SAR Analog-to-Digital Converter Driver

## Overview

The KSDK provides a Peripheral driver for the 16-bit SAR Analog-to-Digital Converter (ADC16) module of Kinetis devices.

# Typical use case

## Polling Configuration

adc16_config_t adc16ConfigStruct;
adc16_channel_config_t adc16ChannelConfigStruct;
ADC16_Init(DEMO_ADC16_INSTANCE);
ADC16_GetDefaultConfig(&adc16ConfigStruct);
ADC16_Configure(DEMO_ADC16_INSTANCE, &adc16ConfigStruct);
ADC16_EnableHardwareTrigger(DEMO_ADC16_INSTANCE, false);
#if defined(FSL_FEATURE_ADC16_HAS_CALIBRATION) && FSL_FEATURE_ADC16_HAS_CALIBRATION
if (kStatus_Success == ADC16_DoAutoCalibration(DEMO_ADC16_INSTANCE))
{
PRINTF("ADC16_DoAutoCalibration() Done.\r\n");
}
else
{
PRINTF("ADC16_DoAutoCalibration() Failed.\r\n");
}
#endif // FSL_FEATURE_ADC16_HAS_CALIBRATION
adc16ChannelConfigStruct.channelNumber = DEMO_ADC16_USER_CHANNEL;
adc16ChannelConfigStruct.enableInterruptOnConversionCompleted = false;
#if defined(FSL_FEATURE_ADC16_HAS_DIFF_MODE) && FSL_FEATURE_ADC16_HAS_DIFF_MODE
adc16ChannelConfigStruct.enableDifferentialConversion = false;
#endif // FSL_FEATURE_ADC16_HAS_DIFF_MODE
while(1)
{
GETCHAR(); // Input any key in terminal console.
ADC16_ChannelConfigure(DEMO_ADC16_INSTANCE, DEMO_ADC16_CHANNEL_GROUP, &adc16ChannelConfigStruct);
while (kADC16_ChannelConversionDoneFlag != ADC16_ChannelGetStatusFlags(DEMO_ADC16_INSTANCE, DEMO_ADC16_CHANNEL_GROUP))
{
}
PRINTF("ADC Value: %d\r\n", ADC16_ChannelGetConversionValue(DEMO_ADC16_INSTANCE, DEMO_ADC16_CHANNEL_GROUP));
}

## Interrupt Configuration

volatile bool g_Adc16ConversionDoneFlag = false;
volatile uint32_t g_Adc16ConversionValue;
volatile uint32_t g_Adc16InterruptCount = 0U;
// ...
adc16_config_t adc16ConfigStruct;
adc16_channel_config_t adc16ChannelConfigStruct;
ADC16_Init(DEMO_ADC16_INSTANCE);
ADC16_GetDefaultConfig(&adc16ConfigStruct);
ADC16_Configure(DEMO_ADC16_INSTANCE, &adc16ConfigStruct);
ADC16_EnableHardwareTrigger(DEMO_ADC16_INSTANCE, false);
#if defined(FSL_FEATURE_ADC16_HAS_CALIBRATION) && FSL_FEATURE_ADC16_HAS_CALIBRATION
if (ADC16_DoAutoCalibration(DEMO_ADC16_INSTANCE))
{
PRINTF("ADC16_DoAutoCalibration() Done.\r\n");
}
else
{
PRINTF("ADC16_DoAutoCalibration() Failed.\r\n");
}
#endif // FSL_FEATURE_ADC16_HAS_CALIBRATION
adc16ChannelConfigStruct.channelNumber = DEMO_ADC16_USER_CHANNEL;
adc16ChannelConfigStruct.enableInterruptOnConversionCompleted = true; // Enable the interrupt.
#if defined(FSL_FEATURE_ADC16_HAS_DIFF_MODE) && FSL_FEATURE_ADC16_HAS_DIFF_MODE
adc16ChannelConfigStruct.enableDifferentialConversion = false;
#endif // FSL_FEATURE_ADC16_HAS_DIFF_MODE
while(1)
{
GETCHAR(); // Input any key in terminal console.
g_Adc16ConversionDoneFlag = false;
ADC16_ChannelConfigure(DEMO_ADC16_INSTANCE, DEMO_ADC16_CHANNEL_GROUP, &adc16ChannelConfigStruct);
while (!g_Adc16ConversionDoneFlag)
{
}
PRINTF("ADC Value: %d\r\n", g_Adc16ConversionValue);
PRINTF("ADC Interrupt Count: %d\r\n", g_Adc16InterruptCount);
}
// ...
void DEMO_ADC16_IRQHandler(void)
{
g_Adc16ConversionDoneFlag = true;
// Read conversion result to clear the conversion completed flag.
g_Adc16ConversionValue = ADC16_ChannelConversionValue(DEMO_ADC16_INSTANCE, DEMO_ADC16_CHANNEL_GROUP);
g_Adc16InterruptCount++;
}

## Data Structures

struct | adc16_config_t
| ADC16 converter configuration . More...
struct | adc16_hardware_compare_config_t
| ADC16 Hardware compare configuration. More...
struct | adc16_channel_config_t
| ADC16 channel conversion configuration. More...

## Enumerations

enum | _adc16_channel_status_flags { kADC16_ChannelConversionDoneFlag = ADC_SC1_COCO_MASK }
| Channel status flags. More...
enum | _adc16_status_flags { kADC16_ActiveFlag = ADC_SC2_ADACT_MASK }
| Converter status flags. More...
enum | adc16_clock_divider_t { kADC16_ClockDivider1 = 0U, kADC16_ClockDivider2 = 1U, kADC16_ClockDivider4 = 2U, kADC16_ClockDivider8 = 3U }
| Clock divider for the converter. More...
enum | adc16_resolution_t { kADC16_Resolution8or9Bit = 0U, kADC16_Resolution12or13Bit = 1U, kADC16_Resolution10or11Bit = 2U, kADC16_ResolutionSE8Bit = kADC16_Resolution8or9Bit, kADC16_ResolutionSE12Bit = kADC16_Resolution12or13Bit, kADC16_ResolutionSE10Bit = kADC16_Resolution10or11Bit }
| Converter's resolution. More...
enum | adc16_clock_source_t { kADC16_ClockSourceAlt0 = 0U, kADC16_ClockSourceAlt1 = 1U, kADC16_ClockSourceAlt2 = 2U, kADC16_ClockSourceAlt3 = 3U, kADC16_ClockSourceAsynchronousClock = kADC16_ClockSourceAlt3 }
| Clock source. More...
enum | adc16_long_sample_mode_t { kADC16_LongSampleCycle24 = 0U, kADC16_LongSampleCycle16 = 1U, kADC16_LongSampleCycle10 = 2U, kADC16_LongSampleCycle6 = 3U, kADC16_LongSampleDisabled = 4U }
| Long sample mode. More...
enum | adc16_reference_voltage_source_t { kADC16_ReferenceVoltageSourceVref = 0U, kADC16_ReferenceVoltageSourceValt = 1U }
| Reference voltage source. More...
enum | adc16_hardware_compare_mode_t { kADC16_HardwareCompareMode0 = 0U, kADC16_HardwareCompareMode1 = 1U, kADC16_HardwareCompareMode2 = 2U, kADC16_HardwareCompareMode3 = 3U }
| Hardware compare mode. More...

## Driver version

#define | FSL_ADC16_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
| ADC16 driver version 2.0.0. More...

## Initialization

void | ADC16_Init (ADC_Type *base, const adc16_config_t *config)
| Initializes the ADC16 module. More...
void | ADC16_Deinit (ADC_Type *base)
| De-initializes the ADC16 module. More...
void | ADC16_GetDefaultConfig (adc16_config_t *config)
| Gets an available pre-defined settings for converter's configuration. More...

## Advanced Feature

static void | ADC16_EnableHardwareTrigger (ADC_Type *base, bool enable)
| Enables the hardware trigger mode. More...
void | ADC16_SetHardwareCompareConfig (ADC_Type *base, const adc16_hardware_compare_config_t *config)
| Configures the hardware compare mode. More...
uint32_t | ADC16_GetStatusFlags (ADC_Type *base)
| Gets the status flags of the converter. More...
void | ADC16_ClearStatusFlags (ADC_Type *base, uint32_t mask)
| Clears the status flags of the converter. More...

## Conversion Channel

void | ADC16_SetChannelConfig (ADC_Type *base, uint32_t channelGroup, const adc16_channel_config_t *config)
| Configures the conversion channel. More...
static uint32_t | ADC16_GetChannelConversionValue (ADC_Type *base, uint32_t channelGroup)
| Gets the conversion value. More...
uint32_t | ADC16_GetChannelStatusFlags (ADC_Type *base, uint32_t channelGroup)
| Gets the status flags of channel. More...

## Data Structure Documentation

struct adc16_config_t

### Data Fields

adc16_reference_voltage_source_t | referenceVoltageSource
| Select the reference voltage source. More...
adc16_clock_source_t | clockSource
| Select the input clock source to converter. More...
bool | enableAsynchronousClock
| Enable the asynchronous clock output. More...
adc16_clock_divider_t | clockDivider
| Select the divider of input clock source. More...
adc16_resolution_t | resolution
| Select the sample resolution mode. More...
adc16_long_sample_mode_t | longSampleMode
| Select the long sample mode. More...
bool | enableHighSpeed
| Enable the high-speed mode. More...
bool | enableLowPower
| Enable low power. More...
bool | enableContinuousConversion
| Enable continuous conversion mode. More...

#### Field Documentation

adc16_reference_voltage_source_t adc16_config_t::referenceVoltageSource

adc16_clock_source_t adc16_config_t::clockSource

bool adc16_config_t::enableAsynchronousClock

adc16_clock_divider_t adc16_config_t::clockDivider

adc16_resolution_t adc16_config_t::resolution

adc16_long_sample_mode_t adc16_config_t::longSampleMode

bool adc16_config_t::enableHighSpeed

bool adc16_config_t::enableLowPower

bool adc16_config_t::enableContinuousConversion

struct adc16_hardware_compare_config_t

### Data Fields

adc16_hardware_compare_mode_t | hardwareCompareMode
| Select the hardware compare mode. More...
int16_t | value1
| Setting value1 for hardware compare mode. More...
int16_t | value2
| Setting value2 for hardware compare mode. More...

#### Field Documentation

adc16_hardware_compare_mode_t adc16_hardware_compare_config_t::hardwareCompareMode

See "adc16_hardware_compare_mode_t".

int16_t adc16_hardware_compare_config_t::value1

int16_t adc16_hardware_compare_config_t::value2

struct adc16_channel_config_t

### Data Fields

uint32_t | channelNumber
| Setting the conversion channel number. More...
bool | enableInterruptOnConversionCompleted
| Generate an interrupt request once the conversion is completed. More...

#### Field Documentation

uint32_t adc16_channel_config_t::channelNumber

The available range is 0-31. See channel connection information for each chip in Reference Manual document.

bool adc16_channel_config_t::enableInterruptOnConversionCompleted

## Macro Definition Documentation

#define FSL_ADC16_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))

## Enumeration Type Documentation

enum _adc16_channel_status_flags

Enumerator
kADC16_ChannelConversionDoneFlag | Conversion done.

enum _adc16_status_flags

Enumerator
kADC16_ActiveFlag | Converter is active.

enum adc16_clock_divider_t

Enumerator
kADC16_ClockDivider1 | For divider 1 from the input clock to the module.
kADC16_ClockDivider2 | For divider 2 from the input clock to the module.
kADC16_ClockDivider4 | For divider 4 from the input clock to the module.
kADC16_ClockDivider8 | For divider 8 from the input clock to the module.

enum adc16_resolution_t

Enumerator
kADC16_Resolution8or9Bit | Single End 8-bit or Differential Sample 9-bit.
kADC16_Resolution12or13Bit | Single End 12-bit or Differential Sample 13-bit.
kADC16_Resolution10or11Bit | Single End 10-bit or Differential Sample 11-bit.
kADC16_ResolutionSE8Bit | Single End 8-bit.
kADC16_ResolutionSE12Bit | Single End 12-bit.
kADC16_ResolutionSE10Bit | Single End 10-bit.

enum adc16_clock_source_t

Enumerator
kADC16_ClockSourceAlt0 | Selection 0 of the clock source.
kADC16_ClockSourceAlt1 | Selection 1 of the clock source.
kADC16_ClockSourceAlt2 | Selection 2 of the clock source.
kADC16_ClockSourceAlt3 | Selection 3 of the clock source.
kADC16_ClockSourceAsynchronousClock | Using internal asynchronous clock.

enum adc16_long_sample_mode_t

Enumerator
kADC16_LongSampleCycle24 | 20 extra ADCK cycles, 24 ADCK cycles total.
kADC16_LongSampleCycle16 | 12 extra ADCK cycles, 16 ADCK cycles total.
kADC16_LongSampleCycle10 | 6 extra ADCK cycles, 10 ADCK cycles total.
kADC16_LongSampleCycle6 | 2 extra ADCK cycles, 6 ADCK cycles total.
kADC16_LongSampleDisabled | Disable the long sample feature.

enum adc16_reference_voltage_source_t

Enumerator
kADC16_ReferenceVoltageSourceVref | For external pins pair of VrefH and VrefL.
kADC16_ReferenceVoltageSourceValt | For alternate reference pair of ValtH and ValtL.

enum adc16_hardware_compare_mode_t

Enumerator
kADC16_HardwareCompareMode0 | x < value1.
kADC16_HardwareCompareMode1 | x > value1.
kADC16_HardwareCompareMode2 | if value1 <= value2, then x < value1 || x > value2; else, value1 > x > value2.
kADC16_HardwareCompareMode3 | if value1 <= value2, then value1 <= x <= value2; else x >= value1 || x <= value2.

## Function Documentation

void ADC16_Init | ( | ADC_Type * | base,
|  | const adc16_config_t * | config
| ) |  |

Parameters

  base | ADC16 peripheral base address.
  config | Pointer to configuration structure. See "adc16_config_t".

void ADC16_Deinit | ( | ADC_Type * | base | ) |

Parameters

  base | ADC16 peripheral base address.

void ADC16_GetDefaultConfig | ( | adc16_config_t * | config | ) |

This function initializes the converter configuration structure with an available settings. The default values are:

* config->referenceVoltageSource = kADC16_ReferenceVoltageSourceVref;
* config->clockSource = kADC16_ClockSourceAsynchronousClock;
* config->enableAsynchronousClock = true;
* config->clockDivider = kADC16_ClockDivider8;
* config->resolution = kADC16_ResolutionSE12Bit;
* config->longSampleMode = kADC16_LongSampleDisabled;
* config->enableHighSpeed = false;
* config->enableLowPower = false;
* config->enableContinuousConversion = false;
*

Parameters

  config | Pointer to configuration structure.

static void ADC16_EnableHardwareTrigger | ( | ADC_Type * | base,
|  | bool | enable
| ) |  |

inlinestatic

Parameters

  base | ADC16 peripheral base address.
  enable | Switcher of hardware trigger feature. "true" means to enable, "false" means not.

void ADC16_SetHardwareCompareConfig | ( | ADC_Type * | base,
|  | const adc16_hardware_compare_config_t * | config
| ) |  |

The hardware compare mode provides a way to process the conversion result automatically by hardware. Only the result in compare range is available. To compare the range, see "adc16_hardware_compare_mode_t", or the reference manual document for more detailed information.

Parameters

  base | ADC16 peripheral base address.
  config | Pointer to "adc16_hardware_compare_config_t" structure. Passing "NULL" is to disable the feature.

uint32_t ADC16_GetStatusFlags | ( | ADC_Type * | base | ) |

Parameters

  base | ADC16 peripheral base address.

Returns
  Flags' mask if indicated flags are asserted. See "_adc16_status_flags".

void ADC16_ClearStatusFlags | ( | ADC_Type * | base,
|  | uint32_t | mask
| ) |  |

Parameters

  base | ADC16 peripheral base address.
  mask | Mask value for the cleared flags. See "_adc16_status_flags".

void ADC16_SetChannelConfig | ( | ADC_Type * | base,
|  | uint32_t | channelGroup,
|  | const adc16_channel_config_t * | config
| ) |  |

This operation triggers the conversion if in software trigger mode. When in hardware trigger mode, this API configures the channel while the external trigger source helps to trigger the conversion.

Note that the "Channel Group" has a detailed description. To allow sequential conversions of the ADC to be triggered by internal peripherals, the ADC can have more than one group of status and control register, one for each conversion. The channel group parameter indicates which group of registers are used channel group 0 is for Group A registers and channel group 1 is for Group B registers. The channel groups are used in a "ping-pong" approach to control the ADC operation. At any point, only one of the channel groups is actively controlling ADC conversions. Channel group 0 is used for both software and hardware trigger modes of operation. Channel groups 1 and greater indicate potentially multiple channel group registers for use only in hardware trigger mode. See the chip configuration information in the MCU reference manual about the number of SC1n registers (channel groups) specific to this device. None of the channel groups 1 or greater are used for software trigger operation and therefore writes to these channel groups do not initiate a new conversion. Updating channel group 0 while a different channel group is actively controlling a conversion is allowed and vice versa. Writing any of the channel group registers while that specific channel group is actively controlling a conversion aborts the current conversion.

Parameters

  base | ADC16 peripheral base address.
  channelGroup | Channel group index.
  config | Pointer to "adc16_channel_config_t" structure for conversion channel.

static uint32_t ADC16_GetChannelConversionValue | ( | ADC_Type * | base,
|  | uint32_t | channelGroup
| ) |  |

inlinestatic

Parameters

  base | ADC16 peripheral base address.
  channelGroup | Channel group index.

Returns
  Conversion value.

uint32_t ADC16_GetChannelStatusFlags | ( | ADC_Type * | base,
|  | uint32_t | channelGroup
| ) |  |

Parameters

  base | ADC16 peripheral base address.
  channelGroup | Channel group index.

Returns
  Flags' mask if indicated flags are asserted. See "_adc16_channel_status_flags".