ST意法半导体
直播中

张亮

8年用户 1388经验值
私信 关注
[问答]

STM32G070RBT6TR STM32CubeMX ADC配置后使用的是内部参考电压且零点的读数太大了,怎么优化?


我是按上面配置的ADC,使用了DMA。现测试1.2V电压ADC的读数就是0x3ff了,我怀疑是不是使能了内部参考电压,有切换置VREF引脚参考电压的代码吗?而且PA0直连GND的读数也比较大为0x0f了,有优化方向吗

回帖(1)

王飞云

2025-6-20 17:42:11

根据你的描述,问题很可能是ADC配置错误或硬件设计导致的参考电压问题。以下是针对STM32G070RBT6TR的优化方案和解决步骤:




问题诊断与原因分析



  1. 满量程错误 (1.2V = 0x3FF)

    • 可能错误启用了内部参考电压(VREFINT),导致ADC量程变为0~1.2V(而非VDD的3.3V)。

    • 检查CubeMX配置中是否误选了VREFINT作为参考源。


  2. 零点偏移大 (GND = 0x0F)

    • ADC未校准或采样时间不足,噪声导致零点漂移。

    • PA0引脚未充分接地(阻抗干扰)。





优化解决方案


1. 确认参考电压配置




  • 检查CubeMX设置



    • Analog → ADC Settings → Parameter Settings中:

    • ADC_VREF_SOURCE 必须设为 VREF_BUF2_VDDA(默认VDDA供电)。

    • 禁用内部参考源:在ADC Common Settings中取消勾选Internal reference voltage

    • 外部VREF引脚

    • STM32G070的参考电压由VREF+引脚提供(需外部电路支持)。

    • 若使用外部基准,硬件需连接VREF+到稳定电压(如2.5V),并在CubeMX选择EXTERNAL_BYPASS模式。




  • 关键代码检查


    // 初始化代码中确保未启用VREFINT
    hadc.Instance = ADC1;
    hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    hadc.Init.VREFSelection = ADC_VREF_VDDA; // 确认此项!




若必须使用内部参考电压(不推荐),需修改量程计算逻辑:

Voltage = (RawValue * 1.2) / 4095  



2. 优化零点漂移




  • 增加采样时间



    • 在CubeMX的ADC Channel Configuration中,为PA0通道设置Sampling Time ≥ 160.5 Cycles(应对高阻抗信号)。




  • 执行ADC校准(关键!):


    HAL_ADCEx_Calibration_Start(&hadc, ADC_SINGLE_ENDED); // 校准ADC



  • 接地优化



    • 用示波器检查PA0对GND的电压,确保无毛刺。

    • 在PCB上让PA0直接连接到MCU的GND引脚(避免路径阻抗)。




  • 软件滤波


    #define SAMPLES 32
    uint32_t sum = 0;
    for (int i = 0; i < SAMPLES; i++) {
      HAL_ADC_Start(&hadc);
      HAL_ADC_PollForConversion(&hadc, 10);
      sum += HAL_ADC_GetValue(&hadc);
    }
    uint32_t adc_value = sum / SAMPLES; // 取均值



3. VREF引脚的特殊处理




  • 硬件设计要点



    • VREF+必须连接0.1μF + 1μF电容到GND(见DS Table 17)。

    • 若需外部基准,需通过跳线或电阻切换电路(无寄存器切换功能)。




  • 参考电压切换函数(仅限支持型号,G070不支持在运行时切换)。






CubeMX配置截图要点



  1. ADC Mode: Independent mode

  2. Data Alignment: Right

  3. Scan Conversion Mode: Enabled(多通道DMA时)

  4. Continuous Conversion Mode: Enabled

  5. VREF Selection: VDDA(主选项)

  6. Sampling Time: ≥160.5 Cycles




最终验证步骤



  1. 测量VDDA电压(通常为3.3V),确认ADC满量程应为VDDA。

  2. 输入已知电压(如1.65V),检查ADC值是否接近 1.65 / VDDA * 4095

  3. 短接PA0到GND引脚,执行校准后读数应≈0±3(噪声范围内)。



经过以上优化后,ADC值应在零点趋近于0,满量程(VDDA)接近4095(12位)。若仍有异常,需检查VDDA供电稳定性或更换MCU确认硬件无故障。



通过合理配置参考电压、严格执行校准、增加采样时间以及优化硬件接地,可显著提升ADC精度。STM32G070的ADC性能对电源噪声敏感,务必确保VDD/VSS间有足够的去耦电容(100nF+10μF)。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分