high-speed-adc-sampling-7.ino

HPMicro HPM5100: 400 MHz RISC-V MCU with Integrated Analog Peripherals · File : high-speed-adc-sampling-7.ino · Language : C · Use case : Acquérir des données analogiques à haute vitesse en utilisant deux canaux ADC en mode balayage automatique (Scan Mode).

Configures the 16-bit ADC in auto-scan mode to read two consecutive analog channels without CPU intervention.

Uses ADC0. Auto-scan mode allows exceeding 2 MSPS. Check the board schematic to identify correct analog pins connected to ADC0 channels 0 and 1.

high-speed-adc-sampling-7.ino

#include "board.h"
#include "hpm_adc16_drv.h"
#include "hpm_clock_drv.h"

#define ADC_SCAN_COUNT  2

uint16_t adc_result[ADC_SCAN_COUNT];

void adc_high_speed_init(void)
{
    adc16_config_t adc_config;
    adc16_channel_config_t ch_config[ADC_SCAN_COUNT];
    
    clock_add_to_group(clock_adc0, 0);
    
    /* Configuration ADC : Mode Scan, 16 bits */
    adc_config.res = adc16_res_16_bits;
    adc_config.conv_mode = adc16_conv_mode_auto_scan;
    adc_config.auto_conv_en = true;
    adc_config.sar_ctrl = adc16_sar_ctrl_normal;
    hpm_clock_drv_init(); /* Init simple pour l'exemple */
    adc16_init(ADC0, &adc_config);
    
    /* Configurer 2 canaux pour le scan */
    for (int i = 0; i < ADC_SCAN_COUNT; i++) {
        ch_config[i].input_ctrl = i; /* Sélectionne le canal d'entrée analogique i */
        ch_config[i].enable = true;
        adc16_channel_set_config(ADC0, i, &ch_config[i]);
    }
    
    /* Activer le compteur de fin de scan pour lecture */
    adc16_enable_interrupt(ADC0, adc16_int_all_conv_done, true);
    adc16_start_conversion(ADC0);
}

void adc_read_results(void)
{
    if (adc16_get_status_flags(ADC0) & adc16_flag_all_conv_done) {
        adc16_clear_status_flags(ADC0, adc16_flag_all_conv_done);
        for (int i = 0; i < ADC_SCAN_COUNT; i++) {
            adc_result[i] = adc16_read_result(ADC0, i);
        }
    }
}

int main(void)
{
    board_init();
    adc_high_speed_init();
    
    while (1) {
        adc_read_results();
        /* adc_result[0] = Canaux 0, adc_result[1] = Canaux 1 */
        delay_ms(5);
    }
}

← Back to the board