ADC 两点校准方案
重要
当前 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 两点校准计算公式为:
\(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 两点校准(方法二)计算公式为:
\(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
Type Definitions
-
typedef void *adc_tp_cali_handle_t
ADC calibration handle