hpm5100_adc_sar_read.ino
Configures the ADC16 in continuous mode and reads the raw value on channel 0.
Leverages the integrated 16-bit SAR ADC peripheral. The code waits for conversion completion in a blocking manner (polling). Ensure the analog pin corresponding to channel 0 is correctly wired. The returned value is 16-bit (0-65535).
hpm5100_adc_sar_read.ino
#include "board.h"
#include "hpm_adc16_drv.h"
#include "hpm_clock_drv.h"
#define ADC_CHANNEL 0
#define ADC_RESOLUTION 16
void init_sar_adc(void)
{
adc16_config_t adc_config;
adc16_channel_config_t channel_config;
clock_add_to_group(clock_adc0, 0);
adc16_get_default_config(&adc_config);
adc_config.resolution = adc16_res_16_bits;
adc_config.conv_mode = adc16_conv_mode_continuous;
adc16_init(HPM_ADC0, &adc_config);
adc16_get_channel_default_config(&channel_config);
channel_config.channel = ADC_CHANNEL;
adc16_init_channel(HPM_ADC0, &channel_config);
adc16_enable_channel(HPM_ADC0, ADC_CHANNEL);
adc16_enable_interrupt(HPM_ADC0, adc16_event_conv_done, true);
}
uint16_t read_adc_value(void)
{
uint16_t value = 0;
adc16_enable_conversion(HPM_ADC0, true);
while (!adc16_get_status(HPM_ADC0, adc16_event_conv_done)) {
/* Wait for conversion */
}
adc16_clear_status(HPM_ADC0, adc16_event_conv_done);
value = adc16_get_channel_result(HPM_ADC0, ADC_CHANNEL);
return value;
}
void main(void)
{
board_init();
init_sar_adc();
while (1) {
uint16_t val = read_adc_value();
/* Process val (0-65535) */
board_delay_ms(100);
}
}