ADC 两点校准方案

[English]

重要

当前 ADC 两点校准方案仅适用于 ESP32 与 ESP32-S2 芯片

ESP32 出厂时默认采用参考电压进行 ADC 校准。如果用户希望进一步提高 ADC 测量结果的一致性,可以将 eFuse 中的校准方案更改为两点校准方法。

同样,对于 ESP32-S2 芯片,出厂默认使用的是两点校准法(方法一)。然而,这种方法并未考虑不同 ADC 衰减下的数据进行校准。如果用户希望使用不同衰减下的数据进行校准,可以将 eFuse 中的校准方案更改为两点校准方法(方法二)。

需要注意的是,上述两种方法都需要用户使用 espefuse 工具来修改 eFuse 中的校准方案,并输入相应的校准数据。这个过程需要格外谨慎,一旦烧录了错误的校准数据,将无法再次修改。这是由于 eFuse 中的数据是不可逆的,一旦写入就无法更改。因此,在进行这些操作时,请确保数据的准确性,以避免不必要的损失。

为避免上述修改 eFuse 带来的风险,adc_tp_calibration 组件提供了一种允许用户在应用层进行校准的方法,具备以下特点:

  • 支持在应用层填入校准参数,用户可自行将校准存储到 NVS、SD 卡等存储介质中

  • 支持 ESP32 使用两点校准方案,ESP32-S2 使用两点校准方案(方法二),且不影响现有 ESP-IDF 的校准方案

ESP32 两点校准原理

ESP32 两点校准需要分别向 ADC1 通道与 ADC2 通道施加稳定的 150 mV 与 850 mV 电压,使用 ADC 获取原始数据接口获取当前电压下的稳定 ADC 原始数据:

Input Voltage

ADC1 (ATTEN0)

ADC2 (ATTEN0)

150 mV

A1

A2

850 mV

B1

B2

备注

获取 150 mV 与 850 mV 下的 ADC 原始数据时,需要配置 ADC 驱动的衰减为 ADC_ATTEN_DB_0

ESP32 ADC 两点校准计算公式为:

\[y=\frac{coeff_{a} \ast x + coeff_{around}}{coeff_{scale}} + coeff_{b}\]
  • \(coeff_{a}\)\(\frac{(850-150)*atten_{scale}[atten]+(B-A)/2}{B-A}\)

  • \(coeff_{b}\)\(850-\frac{(850-150)*B+(B-A)/2}{B-A} +atten_{offset}[atten]\)

  • \(coeff_{scale}\):65536

  • \(coeff_{around}\)\(\frac{coeff_{scale}}{2}\)

ADC1

ATTEN0

ATTEN_2_5

ATTEN_6

ATTEN_12

\(atten_{scale}\)

65504

86975

120389

224310

\(atten_{offset}\)

0

1

27

54

ADC2

ATTEN0

ATTEN_2_5

ATTEN_6

ATTEN_12

\(atten_{scale}\)

65467

86861

120416

224708

\(atten_{offset}\)

0

9

26

66

ESP32-S2 两点校准(方法二)原理

ESP32-S2 两点校准(方法二)需要分别向 ADC1 通道与 ADC2 通道施加稳定的 600 mV、800 mV、1000 mV 与 2000 mV 电压,使用 ADC 获取原始数据接口获取当前电压下的稳定 ADC 原始数据,以 ADC1 为例:

Input Voltage

ATTEN

ADC1 Raw Value

600 mV

ATTEN_0

High[ATTEN_0]

800 mV

ATTEN_2_5

High[ATTEN_2_5]

1000 mV

ATTEN_6

High[ATTEN_6]

2000 mV

ATTEN_12

High[ATTEN_12]

备注

ESP32-S2 两点校准(方法二)的校准点选取需要分别在对应的衰减与标定电压下获取稳定的 ADC 原始数据,以确保校准的准确性。其中 High 用于存储不同衰减与标定电压下的 ADC 原始数据

ESP32-S2 ADC 两点校准(方法二)计算公式为:

\[y=\frac{x \ast coeff_{a} / (coeff_{ascaling}/coeff_{bscaling}) + coeff_{b} }{coeff_{bscaling}}\]
  • \(coeff_{a}\)\(coeff_{ascaling} \ast v_{high}[atten] / High[atten]\)

  • \(coeff_{b}\):0

  • \(coeff_{ascaling}\):65536

  • \(coeff_{bscaling}\):1024

ATTEN0

ATTEN_2_5

ATTEN_6

ATTEN_12

\(v_{high}\)

600

800

1000

2000

API 参考

Header File

Functions

adc_tp_cali_handle_t adc_tp_cali_create(adc_tp_cali_config_t *config, adc_atten_t atten)

Create ADC calibration handle.

参数
  • config – Pointer to ADC calibration configuration

  • atten – ADC attenuation level

返回

adc_tp_cali_handle_t Handle of ADC calibration, NULL if failed

esp_err_t adc_tp_cali_delete(adc_tp_cali_handle_t *adc_tp_cali_handle)

Delete ADC calibration handle.

参数

adc_tp_cali_handle – Pointer to ADC calibration handle

返回

esp_err_t

  • ESP_OK: Always returns ESP_OK

esp_err_t adc_tp_cali_raw_to_voltage(adc_tp_cali_handle_t adc_tp_cali_handle, int raw_value, int *voltage)

Convert ADC raw value to voltage in millivolts.

参数
  • adc_tp_cali_handle – ADC calibration handle

  • raw_value – ADC raw value to convert

  • voltage – Pointer to store the converted voltage in millivolts

返回

esp_err_t

  • ESP_OK: Success

  • ESP_ERR_INVALID_ARG: Invalid argument

Structures

struct adc_tp_cali_config_t

ADC calibration configuration structure.

This structure contains the raw ADC values measured at specific voltage points for calibration. The values are different for ESP32 and ESP32-S2.

Public Members

adc_unit_t adc_unit

ADC unit (ADC1 or ADC2)

Type Definitions

typedef void *adc_tp_cali_handle_t

ADC calibration handle