high-speed-adc-sampling-7.ino

HPMicro HPM5100 : Microcontrôleur RISC-V 400 MHz avec analogique intégré · Fichier : high-speed-adc-sampling-7.ino · Langage : C · Usage : Acquérir des données analogiques à haute vitesse en utilisant deux canaux ADC en mode balayage automatique (Scan Mode).

Configure l'ADC 16 bits en mode scan automatique pour lire deux canaux analogiques consécutifs sans intervention CPU.

Utilise ADC0. Le mode auto-scan permet de dépasser 2 MSPS. Vérifiez le schéma de la carte pour identifier les broches analogiques correctes reliées aux canaux 0 et 1 de l'ADC0.

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

← Retour à la fiche