STM32 ADC精度提升方法
- Fang XS.
- 1452512966@qq.com
- 如果有错误,希望被指出,学习技术的路难免会磕磕绊绊
- 量的积累引起质的变化
硬件方法
- 优化布局布线,尽量减小其他干扰
- 增加电源、Vref去耦电容
- 使用低通滤波器,或加磁珠
- 尽量减小电源的纹波,噪声; // STM32的ADC就是纯ADC,不带电源抑制设计
- 尽可能让输入信号的电平范围等于Vref+和Vref-的电平范围
软件方法
- 减小ADC输入时钟
- 使用较大采样周期
- 增加滤波算法,精度优先首选均值滤波
- 在初始化时使用ST自带的校准
- 在每次采集数据时使用Vrefint通道校准
- 手动校准
- 数字静默,采集时降CPU主频和其他可能影响ADC的时钟
使用Vrefint通道校准方法
以STM32F030C8T为例,规格书描述如下
这个值是在芯片出厂时,ST针对Vrefint通道进行校准的值,也就是用ADC采集VDDA=3.3V时得到的ADC值,存放在地址0x1FFF F7BA处,2字节大小;
结合这个校准值可以优化ADC转换计算方法:
通道x电压 = (通道xADC值 * 3.3 * VREFINT_CAL) / (通道VrefintADC值 * 4095);
每次ADC采集包含Vrefint通道,将每次采集都进行校准。
去除浮点数运算,DEMO代码如下:
#define VREFINT_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7BA))
// F0没有浮点运算单元,使用MV单位避免浮点运算
#define VREFINT_CAL_VOLTAGE_mV 3300 // Vrefint电压 (mV)
uint32_t CalibrateADC(uint32_t adc_value, uint32_t vrefint_adc)
{
uint32_t vrefint_cal = *VREFINT_CAL_ADDR; // 读取Vrefint校准值
uint32_t adc_chan_vol_mV = (adc_value * VREFINT_CAL_VOLTAGE_mV * vrefint_cal) / (vrefint_adc * 4095);
return adc_chan_vol_mV;
}
ADC的常用测试评估方法
- 平均值
- 代表ADC的测量中心值:反映ADC对这组固定电压的整体测量趋势。如果ADC理想且无偏差,平均值应接近电压的真实值。
- 系统误差(偏移误差):若平均值与真实电压值存在差异,说明ADC可能存在零点偏移(如校准不准或硬件偏差)。
- 标准差
- 测量噪声或随机误差:标准差衡量数据的离散程度,表示ADC的噪声水平或稳定性:
- 标准差小:数据集中,ADC噪声低、重复性好。
- 标准差大:数据分散,可能由电源噪声、信号干扰、ADC分辨率不足或电路设计问题导致。
- 用于计算信噪比(SNR)和有效位数(ENOB)。
- 变异系数(CV)
CV = 标准差 / 平均值 * 100%
- 通过将标准差归一化到平均值,提供相对波动性
- 评估ADC在不同输入电压下的稳定性(例如:1V和5V输入的噪声比例)。
- CV越小,说明ADC的测量值相对波动越小,稳定性越好。
- 若CV接近ADC的最小分辨率(如LSB的百分比),可能达到硬件极限。
- CV的倒数可近似反映SNR(如CV=1% => SNR≈100:1)。
注:
- SAR型ADC相较于其他ADC,容易受干扰影响;
- 看其他的文章,有的型号可能出现通道间串扰的问题,解决思路跟本文类似,还可以在2个通道采集之间插入一次接地通道的采集,原理是让电容有充分的时间进行充放电;
参考文档:
AN2834 如何在STM32微控制器中获得最佳ADC精度
AN3116 STM32的 ADC 模式及其应用
AN4073 使用 STM32F2xx 和 STM32F4xx 微控制器时如何提高 ADC测量精度
TI 计算ADC系统总误差
数字信号处理 科学家和工程师指南
TI ADC噪声分析与应用