21ic问答首页 - gd32f470zit6ADC采集电压后与实际电压相差25%,求帮助
gd32f470zit6ADC采集电压后与实际电压相差25%,求帮助
代码如下
adc=((double)(ADC_value*3.3)/4096);
printf("adc:%.2lfV VINSampledvalues:%d\r\n",adc,ADC_value);
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
adc = (double)ADC_value *3.3)/4096.0;
评论
2025-04-17
赞0
评论
2025-04-16
赞0
2、你的代码是参考MCU的demo例程写的还是网上找的?第一次开发的话,尽量参照官方demo进行。
评论
2025-04-16
赞0
评论
2025-04-16
赞0
评论
2025-04-15
您需要登录后才可以回复 登录 | 注册