hpm5100_adc_sar_read.ino

HPMicro HPM5100: 400 MHz RISC-V MCU with Integrated Analog Peripherals · File : hpm5100_adc_sar_read.ino · Language : C · Use case : Lire la tension analogique sur un canal ADC SAR 16 bits pour la détection de capteur.

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);
    }
}

← Back to the board