打印

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

[复制链接]
974|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ahdah|  楼主 | 2025-4-15 14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下
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);


使用特权

评论回复

相关帖子

沙发
飞思啦| | 2025-4-15 19:21 | 只看该作者
检查基准电压,看看基准电压是3.3V吗,还有就是ADC校准,一定要判断结果,用while(1)的方式来实现校准

使用特权

评论回复
板凳
大大财迷| | 2025-4-16 08:13 | 只看该作者
先测硬件波形,再查软件。AD通道对输入阻抗Rain有限制的!输入阻抗过大,内部充电电容Cadc的充电速度就会降低,数据就会采集不到。

使用特权

评论回复
地板
dffzh| | 2025-4-16 09:35 | 只看该作者
1、可以将ADC采集引脚直连到3.3V,看MCU采集到的电压是多少;
2、你的代码是参考MCU的demo例程写的还是网上找的?第一次开发的话,尽量参照官方demo进行。

使用特权

评论回复
5
蚊子的噩梦| | 2025-4-16 19:05 | 只看该作者
看起来你的ADC初始化和采样代码基本正确,但误差可能来自几个方面:参考电压设置、ADC分辨率或采样时间

使用特权

评论回复
6
xch| | 2025-4-17 12:34 | 只看该作者
多高的电压差25% ?

adc = (double)ADC_value *3.3)/4096.0;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝