news 2026/4/22 12:18:21

别再死记公式了!用STM32F103的ADC测个电池电压,5分钟搞懂采样位数和精度的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再死记公式了!用STM32F103的ADC测个电池电压,5分钟搞懂采样位数和精度的区别

从电池电压测量实战解析STM32的ADC:采样位数与精度的本质差异

手里攥着一块3.7V锂电池和STM32F103开发板,你是否也遇到过这样的困惑:明明ADC配置显示12位分辨率,为什么串口打印的电压值总在3.65V到3.72V之间跳动?这个问题背后,藏着嵌入式工程师必须厘清的两个关键概念——采样位数与有效精度。让我们通过一个完整的电池电压监测项目,揭开这两个参数的真实面目。

1. 硬件连接与基础代码实现

先准备最简硬件环境:将锂电池正极通过分压电路接入PA1引脚(ADC1通道1),负极接开发板GND。分压电阻建议选择10kΩ+10kΩ组合,这样即使电池电压达到4.2V满电状态,输入ADC引脚的电压也不会超过3.3V上限。

// 基础ADC初始化代码 void ADC1_Init(void) { RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // 开启ADC1时钟 ADC1->CR2 = ADC_CR2_ADON; // 使能ADC // 设置通道1采样时间239.5周期(提高稳定性) ADC1->SMPR2 |= ADC_SMPR2_SMP1_0 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_2; // 校准流程(不可省略) ADC1->CR2 |= ADC_CR2_RSTCAL; while(ADC1->CR2 & ADC_CR2_RSTCAL); ADC1->CR2 |= ADC_CR2_CAL; while(ADC1->CR2 & ADC_CR2_CAL); }

读取电压的核心函数如下,注意这里使用了中值滤波来抑制突发干扰:

float Get_BatteryVoltage(void) { uint32_t sum = 0; uint16_t adc_val[5]; for(int i=0; i<5; i++) { ADC1->SQR3 = 1; // 设置通道1 ADC1->CR2 |= ADC_CR2_ADON; while(!(ADC1->SR & ADC_SR_EOC)); adc_val[i] = ADC1->DR; } // 中值滤波算法 Bubble_Sort(adc_val, 5); float voltage = (adc_val[2] / 4096.0) * 3.3 * 2; // 乘以2是分压补偿 return voltage; }

提示:实际项目中建议加入软件校准值,例如在已知3.3V基准源下测得参考电压为3.28V时,可将计算式中的3.3替换为实测值。

2. 采样位数的本质:理论分辨率

当看到STM32F103的ADC标注"12位"时,这个数字代表的是模数转换的理论分辨率。具体表现为:

  • 数字表示范围:12位对应2^12=4096个离散值(0-4095)

  • 电压分辨率:在3.3V参考电压下,每个LSB(最低有效位)代表的电压值为:

    LSB = Vref / 4096 = 3.3V / 4096 ≈ 0.0008V (0.8mV)

理论上,这意味着ADC可以区分0.8mV的电压变化。但实际测试时会发现,即使保持输入电压完全稳定,连续采样值仍可能出现±3LSB的波动。这就是理论分辨率与实际精度的差异。

不同位数ADC的对比:

位数分辨率值3.3V量程下的LSB
8位25612.89mV
10位10243.22mV
12位40960.81mV
16位655360.05mV

3. 有效精度的真相:误差来源分析

实际工程中,影响ADC测量精度的因素远比位数复杂。以下是主要误差源及其影响程度:

  1. 基准电压稳定性(占误差60%以上)

    • 开发板常用的LDO(如AMS1117)温漂可达5mV/℃
    • 解决方案:外置TL431或REF5025等高精度基准源
  2. PCB布局干扰(约15-20%误差)

    • 数字信号线对模拟走线的耦合干扰
    • 改进方法:
      • 采用星型接地布局
      • ADC电源引脚添加10μF+0.1μF去耦电容组合
  3. ADC自身特性(约10%误差)

    • INL(积分非线性度):STM32F103典型值±2LSB
    • DNL(微分非线性度):典型值±1LSB

通过以下实验可以直观理解精度损失:将ADC输入引脚直接连接到3.3V基准,连续采样100次,统计结果可能呈现如下分布:

采样值分布示例: 4095:58次 4094:28次 4093:12次 4092:2次

这个分布表明,即使在理想连接条件下,ADC结果也存在约±2LSB的随机误差。因此,12位ADC的实际有效精度约为:

有效精度位数 = 12 - log2(误差范围) ≈ 12 - log2(4) ≈ 10位

4. 提升测量精度的实战技巧

基于前述分析,我们可以在硬件和软件两个层面进行优化:

硬件优化方案

  1. 参考电压改造

    • 使用独立基准电压芯片(如REF3030)
    • 在VDDA引脚添加π型滤波电路
  2. PCB设计规范

    • 模拟走线远离时钟线和高速数据线
    • 采用guard ring环绕敏感模拟线路

软件处理方法

动态校准算法(需配合硬件改造):

// 两点校准法参数存储 typedef struct { float gain; // 斜率校准系数 float offset; // 零点偏移量 } ADC_Calib_t; void ADC_Calibration(ADC_Calib_t *param) { // 第一步:输入0V时读取ADC值(如通过MOS管接地) param->offset = Get_ADC_Reading(0); // 第二步:输入已知精确电压(如3.000V基准) float measured = Get_ADC_Reading(3.0); param->gain = 3.0 / (measured - param->offset); } float Get_CorrectedVoltage(float raw) { static ADC_Calib_t calib; if(calib.gain == 0) ADC_Calibration(&calib); return (raw - calib.offset) * calib.gain; }

数字滤波方案对比

滤波类型适用场景代码复杂度效果
移动平均缓慢变化信号★☆☆☆☆一般
中值滤波脉冲干扰★★☆☆☆抗突发干扰强
卡尔曼滤波动态变化信号★★★★★最优但耗资源
滑动加权平均兼顾实时性与平滑度★★★☆☆平衡性好

在电池监测场景中,推荐组合使用中值滤波和滑动加权平均。例如先取5个样本做中值滤波,再与历史值进行加权计算:

#define ALPHA 0.2 // 新数据权重系数 float filtered_voltage = 0; void Update_Voltage(float new_val) { filtered_voltage = ALPHA * new_val + (1-ALPHA) * filtered_voltage; }

5. 工程选型指南:何时需要更高精度ADC

当出现以下情况时,需要考虑升级硬件方案:

  1. 需求超出器件能力

    • 需要检测小于5mV的电压变化
    • 工作环境温度变化超过±20℃
  2. 成本允许的升级路径

    • 外置16位ADC(如ADS1115)
    • 改用内置16位ADC的MCU(如STM32L4系列)
  3. 特殊应用场景

    • 电池电量计需要±1%精度
    • 工业传感器信号采集

对比方案成本:

方案精度提升成本增加实现难度
优化现有12位ADC10-20%¥1-5★★☆☆☆
外置16位ADC模块5-10倍¥15-30★★★☆☆
更换高精度MCU2-4倍¥10-20★★☆☆☆
全差分输入方案10倍+¥50+★★★★☆

在最近的一个智能手环项目中,我们通过将ADC基准源更换为REF3030(温漂10ppm/℃),结合软件动态校准,成功将电池电压测量精度从±50mV提升到±5mV,而硬件成本仅增加2元。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 12:14:41

Voron 2.4 3D打印机:如何构建一台专业级CoreXY高速打印设备

Voron 2.4 3D打印机&#xff1a;如何构建一台专业级CoreXY高速打印设备 【免费下载链接】Voron-2 Voron 2 CoreXY 3D Printer design 项目地址: https://gitcode.com/gh_mirrors/vo/Voron-2 Voron 2.4是一款开源高性能CoreXY 3D打印机&#xff0c;专为追求极致打印质量和…

作者头像 李华
网站建设 2026/4/22 12:08:02

别再折腾WSL了!用Docker Desktop 5分钟在Windows上跑通CP2K 2025.1

5分钟在Windows上部署CP2K 2025.1&#xff1a;Docker方案全指南 对于计算化学和材料科学领域的研究者来说&#xff0c;CP2K作为一款强大的原子模拟软件包&#xff0c;其功能覆盖从量子化学计算到分子动力学模拟的广泛场景。然而&#xff0c;传统在Windows系统上部署CP2K往往需…

作者头像 李华
网站建设 2026/4/22 12:05:23

解放硬盘空间:SteamCleaner一键清理六大游戏平台冗余文件

解放硬盘空间&#xff1a;SteamCleaner一键清理六大游戏平台冗余文件 【免费下载链接】SteamCleaner :us: A PC utility for restoring disk space from various game clients like Origin, Steam, Uplay, Battle.net, GoG and Nexon :us: 项目地址: https://gitcode.com/gh_…

作者头像 李华