You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32H743ZI ADC固定偏移电压问题求助

STM32H743ZI ADC偏移电压问题解决方案

问题背景

使用STM32H743ZI开发板,需读取ADC1的8个通道(CHANNEL_2至CHANNEL_9)模拟电压,代码可正常运行,但存在固定偏移:输入0V时读取到0.04V,输入0.5V时读取到0.54V,输入1.5V时读取到1.55V,输入3V时读取到3.05V,整体呈现固定偏移特性。

实测数据

直流电源电压ADC读取值
0V0.04V
0.5V0.54V
1.5V1.55V
3V3.05V

当前采样代码

HAL_ADC_Start(&hadc1);

ADC_ChannelConfTypeDef sConfig = {0};

sConfig.Channel = ADC_CHANNEL_2;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
raw_2 = HAL_ADC_GetValue(&hadc1);

sConfig.Channel = ADC_CHANNEL_3;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
raw_3 = HAL_ADC_GetValue(&hadc1);

sConfig.Channel = ADC_CHANNEL_4;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
raw_4 = HAL_ADC_GetValue(&hadc1);

sConfig.Channel = ADC_CHANNEL_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
raw_5 = HAL_ADC_GetValue(&hadc1);

sConfig.Channel = ADC_CHANNEL_6;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
raw_6 = HAL_ADC_GetValue(&hadc1);

sConfig.Channel = ADC_CHANNEL_7;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
raw_7 = HAL_ADC_GetValue(&hadc1);

sConfig.Channel = ADC_CHANNEL_8;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
raw_8 = HAL_ADC_GetValue(&hadc1);

sConfig.Channel = ADC_CHANNEL_9;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
raw_9 = HAL_ADC_GetValue(&hadc1);

HAL_ADC_Stop(&hadc1);

ADC_2[0] = (int)(raw_2 / 256);
ADC_2[1] = (int)(raw_2 % 256);

ADC_3[0] = (int)(raw_3 / 256);
ADC_3[1] = (int)(raw_3 % 256);

ADC_4[0] = (int)(raw_4 / 256);
ADC_4[1] = (int)(raw_4 % 256);

ADC_5[0] = (int)(raw_5 / 256);
ADC_5[1] = (int)(raw_5 % 256);

ADC_6[0] = (int)(raw_6 / 256);
ADC_6[1] = (int)(raw_6 % 256);

ADC_7[0] = (int)(raw_7 / 256);
ADC_7[1] = (int)(raw_7 % 256);

ADC_8[0] = (int)(raw_8 / 256);
ADC_8[1] = (int)(raw_8 % 256);

ADC_9[0] = (int)(raw_9 / 256);
ADC_9[1] = (int)(raw_9 % 256);

当前临时修正方案

通过手动估算偏移值分段修正,但该方法不够严谨:

if(raw_2 < 4045 && raw_2 >= 993) raw_2 -= 50;
else if(raw_2 <= 993 && raw_2 >= 0) raw_2 -= 62;

if(raw_3 < 4045 && raw_3 >= 993) raw_3 -= 50;
else if(raw_3 <= 993 && raw_3 >= 0) raw_3 -= 62;

if(raw_4 < 4045 && raw_4 >= 993) raw_4 -= 50;
else if(raw_4 <= 993 && raw_4 >= 0) raw_4 -= 62;

if(raw_5 < 4045 && raw_5 >= 993) raw_5 -= 50;
else if(raw_5 <= 993 && raw_5 >= 0) raw_5 -= 62;

if(raw_6 < 4045 && raw_6 >= 993) raw_6 -= 50;
else if(raw_6 <= 993 && raw_6 >= 0) raw_6 -= 62;

if(raw_7 < 4045 && raw_7 >= 993) raw_7 -= 50;
else if(raw_7 <= 993 && raw_7 >= 0) raw_7 -= 62;

if(raw_8 < 4045 && raw_8 >= 993) raw_8 -= 50;
else if(raw_8 <= 993 && raw_8 >= 0) raw_8 -= 62;

if(raw_9 < 4045 && raw_9 >= 993) raw_9 -= 50;
else if(raw_9 <= 993 && raw_9 >= 0) raw_9 -= 62;

专业校准解决方案

1. 启用STM32内置ADC校准功能

STM32H7的ADC内置硬件校准机制,可消除大部分偏移误差,在ADC初始化或每次启动前执行校准:

// 执行ADC偏移校准(单端模式)
HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);

注意:校准需在ADC未启动时执行,且每次电源上电或温度变化较大时,建议重新校准。

2. 软件线性校准(零点+满量程)

针对固定偏移特性,通过两点校准计算精准的修正公式:

  • 零点校准:将ADC引脚接地(0V输入),读取N次采样值取平均值,得到offset_raw
  • 满量程校准:输入已知的满量程电压(如3.3V,对应ADC参考电压),读取N次采样值取平均值,得到fullscale_raw
  • 修正公式(转换为电压值):
    #define VREF 3.3f  // ADC参考电压
    float corrected_voltage = ((float)(raw_value - offset_raw) * VREF) / (float)(fullscale_raw - offset_raw);
    
  • 若只需修正原始采样值:
    uint32_t corrected_raw = raw_value - offset_raw;
    // 处理负数值,避免溢出
    if(corrected_raw > raw_value) corrected_raw = 0;
    

3. 优化通道切换流程

当前代码每次切换通道都重新配置并等待转换,可能引入额外误差:

  • 使用ADC多通道扫描模式,一次性配置所有通道,通过DMA自动采集,减少通道切换带来的干扰
  • 若必须单通道切换,在配置新通道后添加适当延迟,确保通道采样电容充分充电:
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    // 根据采样时间配置延迟,比如1ms
    HAL_Delay(1);
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
    

4. 硬件层面优化

  • 确保ADC参考电压(VREF+)稳定,可添加滤波电容(100nF陶瓷电容并联1uF电解电容)
  • 模拟输入引脚的接地回路要短,避免干扰
  • 若使用外部参考电压,确保其精度高于ADC要求

内容的提问来源于stack exchange,提问作者Kaan Kurtça

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 03:07:03