网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


前言

如果你在用 ESP32/ESP32-S3 做传感器、AI 边缘推理(如手势识别)、电压测量、AD 控制等项目,一定遇到过一个让人抓狂的问题:

“为啥 ADC 明明能用,但每个板子的读数都不一样?”

这背后,就是 ESP32 ADC 校准机制的全部故事。

本文带你深入但不烧脑地看懂:

  • 什么是 eFuse 校准信息
  • 为什么 ESP32/S3 要做 Vref 校准
  • 线性拟合校准(Line Fitting) 是如何工作的
  • 查找表校准(LUT) 的作用是什么
  • 各 SoC(ESP32/S2/S3/C3/C6)之间 ADC 差异大在哪里
  • 实际项目如何选用校准方式?
  • 源码解读:adc_cali_line_fitting.c 到底做了什么?

让你彻底搞清楚“为什么 ADC 不准,以及如何让它变准”。

为什么 ESP32 的 ADC 都要“校准”?

ESP32 的 ADC 在硬件设计上就是 高性价比 + 可用,所以它有两个特点:

特点 1:每颗芯片的 ADC 会有差异

这是模拟电路的物理限制。尤其像 ESP32 这种 WiFi + Bluetooth SoC,为了成本和功耗做了很多折中,导致:

  • 每颗芯片会有不同的 ADC 特性
  • 即便同一型号的 DevKitC,每块板子的采样值差异也可能高达 5%–10%

特点 2:不同型号 ESP32 的 ADC 精度不同

SoC ADC 设计 支持的校准方式 精度差异
ESP32(经典款) ADC 噪声大、线性差 Vref 差异较大
ESP32-S2/S3 新 ADC 方案,稳定性提升 Vref、Two-Point、LUT 精度更好
ESP32-C3、C6 最新 ADC 方案 LUT 最稳定

所以为了“拉齐”每颗芯片的差异,让用户在应用层得到准确的电压值,ESP-IDF 引入了 ADC 校准(Calibration)机制

eFuse 是什么?为什么校准数据保存在 eFuse?

eFuse 本质是一种一次性可编程(OTP)的寄存器区域。

  • 芯片在出厂时,厂家(Espressif)会 按每颗芯片的特性写入不同参数
  • 用户无法修改
  • 系统在运行时会自动读取 eFuse 的值

ESP32/S3 的 ADC 校准信息主要包括:

名称 含义
eFuse Vref 出厂校准的参考电压(典型:1100mV)
Two-Point 两点校准值,例如 150mV、950mV 对应的原始 ADC 值
LUT 全段 ADC 校准查找表

三种校准方式的直觉理解

这是本文最关键的部分。下面用最通俗的话解释你看到的源码里的“line fitting”、“curve fitting”、“LUT”等内容。

3.1 方法一:Vref 校准(最基础)

适用于:ESP32 老型号

原始 ADC 值 实际上是按照内部 Vref 换算的
但每颗芯片的内部 Vref 不一样,比如:

芯片 实际 Vref
芯片 A 1080mV
芯片 B 1120mV
芯片 C 1180mV

如果软件统一按“1100mV”去换算,结果当然不准。

所以 IDF 会从 eFuse 里读取 每个芯片独有的 Vref,例如:

eFuse Vref = 1120mV

然后据此修正电压计算。

优点:简单、快速
缺点:只能纠正偏移,对线性差无法优化
精度:±5~10%

3.2 方法二:Two-Point 校准(中档精度)

适用于:S2 / S3 某些型号

Espressif 在工厂给你测量了两个测试点,例如:

  • 150mV → 对应原始 ADC = 500
  • 950mV → 对应原始 ADC = 3100

这样可以根据这两个点做一条直线拟合(Line Fitting)

voltage = slope * raw + offset

看到这里你应该就明白你贴出来的这个文件 adc_cali_line_fitting.c 的意义了:

解读:
这段代码就是根据 eFuse 两点数据,计算拟合直线的 slope 和 offset。

优点:比 Vref 精准
缺点:线性区之外误差仍然存在
精度:±3%

3.3 方法三:LUT(查找表)校准(最精准)

适用于:S3/C3/C6 等最新芯片

Espressif 工厂不仅测试了两个点,而是:

按不同区段测了很多校准点,写入一张查找表 LUT

例如(模拟示例):

原始 ADC 实际电压
0 0mV
300 120mV
800 450mV
1500 900mV
2600 1400mV
3500 1800mV

这样你在采样时只需要:

根据 raw index 查表 → 修正电压

优点:几乎全程准确
精度:±1% 或更低
缺点:略耗 flash & RAM

Line Fitting 校准源码(你贴的那段)到底做了什么?

下面用一句话总结复杂源码:

📌 它实际上做了三件事:

(1) 检查 eFuse 里是否有 Two-Point 或 Vref

源码中你能看到类似:

adc_cali_check_efuse()

如果 eFuse 没写 → 不允许使用该校准方式。

(2) 读取 eFuse 中的校准点

你会看到:

esp_efuse_line_fitting_get_two_point_value(...)

它返回两个点的:

  • 电压(工厂测量值)
  • raw(工厂测量得到的 ADC 原始值)

(3) 计算直线公式 slope & offset

核心公式在源码中:

slope = (V2 - V1) / (raw2 - raw1)
offset = V1 - slope * raw1

最终得到一个函数:

voltage = slope * adc_raw + offset

性能对比:三种校准方式到底差多少?

非常关键的表格:

校准方式 实际原理 优点 缺点 精度
Vref 校准 修正参考电压 最快 无法修线性 ★★☆☆☆
Two-Point(线性拟合) 用两个点拟合直线 简单有效 非线性区误差大 ★★★☆☆
LUT 查表 全区段查表修正 最准 稍占内存 ★★★★★

实战:项目中应该用哪种校准方式?

ESP32(经典)

只能用 Vref
→ 不适合高精度应用
→ 适合人脸识别、电机控制、IoT 等一般应用

ESP32-S2/S3

支持 Two-Point 和 LUT
推荐:

  • 若你做 传感器采集(温度、电压、电流) → 用 LUT
  • 若你做 手势识别摄像头、AI 传感器 → Two-Point 已够用
  • 若你做 电源、电池监测 → 必须 LUT

ESP32-C3/C6

默认有 LUT
→ 全程准确
→ 适合 AIoT 产品量产

图示:三种校准方式的直觉差异

(以下为示意图,可直接放到 CSDN)

未校准 vs Vref vs 两点 vs LUT 对比曲线

电压(mV)
│          LUT校准(几乎贴合真实)
│        ··························· Real
│       /
│      /  Two-Point(直线拟合)
│     /
│____/__________________ 原始ADC曲线偏离严重
    raw →

##总结

如果你之前遇到过:

  • ADC 每块板子读数不同
  • ADC 线性不好
  • 低压段偏高,高压段偏低
  • 同样代码换板子后偏差 100mV

那么你现在知道——
这些不是你的锅,是 ADC 校准方式的差异。

掌握 Vref / Two-Point / LUT 三种校准方式,就能让你的项目从“能用”升到“专业可控”。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐