问答

汇集网友智慧,解决技术难题

21ic问答首页 - gd32f470zit6ADC采集电压后与实际电压相差25%,求帮助

电压 adc采集 GD32F470 实际 ig TI

gd32f470zit6ADC采集电压后与实际电压相差25%,求帮助

ahdah2025-04-15
代码如下
void ADC_init(void)
{
    // 1. 使能时钟
    rcu_periph_clock_enable(RCU_GPIOF);
    rcu_periph_clock_enable(RCU_ADC2);
    adc_clock_config(ADC_ADCCK_PCLK2_DIV8);
    // 2. 配置  为模拟输入
    gpio_mode_set(GPIOF, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_6);
    // 3. 配置 ADC 基本参数
    adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT); // 独立模式
    /* ADC contineous function disable */
    adc_special_function_config(ADC2, ADC_CONTINUOUS_MODE, DISABLE); // 单次转换
    /* ADC scan mode disable */
    adc_special_function_config(ADC2, ADC_SCAN_MODE, DISABLE); // 不扫描
    adc_resolution_config(ADC2, ADC_RESOLUTION_12B);         // 12位分辨率
    adc_data_alignment_config(ADC2, ADC_DATAALIGN_RIGHT);    // 数据右对齐
    adc_channel_length_config(ADC2, ADC_ROUTINE_CHANNEL, 1); // 单次转换通道数
    adc_external_trigger_config(ADC2, ADC_ROUTINE_CHANNEL, EXTERNAL_TRIGGER_DISABLE); // 外部触发禁止
    // 4. 设置采样时间和通道
    adc_routine_channel_config(ADC2, 0, ADC_CHANNEL_4, ADC_SAMPLETIME_15); //// 配置ADC规则通道
    // 5. 启用 ADC 并校准
    adc_enable(ADC2);
    delay_2us(1000);
    adc_calibration_enable(ADC2);
}

uint16_t adc_channel_sample(void)
{
    /* ADC software trigger enable */
    adc_software_trigger_enable(ADC2, ADC_ROUTINE_CHANNEL);
    /* wait the end of conversion flag */
    while (!adc_flag_get(ADC2, ADC_FLAG_EOC));
    /* clear the end of conversion flag */
    adc_flag_clear(ADC2, ADC_FLAG_EOC);
    /* return regular channel sample value */
    return (adc_routine_data_read(ADC2));
}
uint16_t adc_channel_value(void)
{
    uint32_t adc_value = 0;
    uint32_t i = 0;
    for (i = 0; i < 5; i++)
    {
        adc_value += adc_channel_sample();
    }
    return (adc_value / 5);
}
转换
      ADC_value = adc_channel_value();
      adc=((double)(ADC_value*3.3)/4096);
      printf("adc:%.2lfV  VINSampledvalues:%d\r\n",adc,ADC_value);


回答 +关注 0
611人浏览 5人回答问题 分享 举报
5 个回答

您需要登录后才可以回复 登录 | 注册