In this use case the ADC module and one 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
- Comparison event happen and interrupt handling
- Single channel measurement
- ADC_CHANNEL_5 as positive input
Setup steps
Example code
Add to application C-file:
void ADC_IrqHandler(void)
{
{
}
}
#define ADC_ISR_COMPE
(ADC_ISR) Comparison Error
uint32_t adc_get_status(const Adc *p_adc)
Get ADC interrupt and overrun error status.
uint32_t adc_get_channel_value(const Adc *p_adc, const enum adc_channel_num_t adc_ch)
Read the ADC result data of the specified channel.
uint32_t adc_get_comparison_mode(const Adc *p_adc)
Get comparison mode.
#define ADC
(ADC ) Base Address
void adc_setup(void)
{
}
#define ADC_MR_LOWRES_BITS_12
(ADC_MR) 12-bit resolution
#define ADC_IER_COMPE
(ADC_IER) Comparison Event Interrupt Enable
#define ADC_EMR_CMPMODE_IN
(ADC_EMR) Generates an event when the converted data is in the comparison window.
void adc_configure_trigger(Adc *p_adc, const enum adc_trigger_t trigger, const uint8_t uc_freerun)
Configure conversion trigger and free run mode.
void adc_set_comparison_channel(Adc *p_adc, const enum adc_channel_num_t channel)
Configure comparison selected channel.
void adc_configure_timing(Adc *p_adc, const uint8_t uc_tracking, const enum adc_settling_time_t settling, const uint8_t uc_transfer)
Configure ADC timing.
void adc_set_resolution(Adc *p_adc, const enum adc_resolution_t resolution)
Configure the conversion resolution.
uint32_t adc_init(Adc *p_adc, const uint32_t ul_mck, const uint32_t ul_adc_clock, const enum adc_startup_time startup)
Initialize the given ADC with the specified ADC clock and startup time.
void adc_set_comparison_mode(Adc *p_adc, const uint8_t uc_mode)
Configure comparison mode.
void adc_enable_interrupt(Adc *p_adc, const uint32_t ul_source)
Enable ADC interrupts.
void adc_enable_channel(Adc *p_adc, const enum adc_channel_num_t adc_ch)
Enable the specified ADC channel.
void adc_set_comparison_window(Adc *p_adc, const uint16_t us_low_threshold, const uint16_t us_high_threshold)
Configure ADC compare window.
Workflow
- Define the interrupt service handler in the application:
void ADC_IrqHandler(void)
{
{
}
}
- Note
- Get ADC status and check if comparison event occurred. If occurred, read the ADC channel value and comparison mode.
- Initialize the given ADC with the specified ADC clock and startup time:
- 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.
- Configure ADC timing:
- 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
- Set the ADC resolution.
- Note
- The resolution value can be set to 10 bits or 12 bits.
- Enable the specified ADC channel:
- Set the comparison ADC channel, mode and window:
- Note
- The high and low threshold of comparison window can be set by the user. An event will be generated whenever the converted data is in the comparison window.
- Enable ADC interrupts:
- Configure software conversion trigger:
Usage steps
Example code
Add to, e.g., main loop in application C-file:
void adc_start(Adc *p_adc)
Start analog-to-digital conversion.
Workflow
- Start ADC conversion on the configured channels: