ESP32S3学习--ADC

文章介绍了ESP32-S3芯片中的两个SARADC,包括它们的通道分布、衰减选项、转换原理以及校准方法。在配置ADC时,需要设定位宽和衰减,读取ADC值并进行可能的校正。提供了ADC的读取函数和示例工程,同时提到了Wi-Fi对ADC2的影响。硬件和软件校准能补偿不同芯片间参考电压的误差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ESP32S3学习——ADC

芯片:esp32s3

开发环境:espidfv4.4

一、官网相关资料

1)、ESP32-S3集成了2个SAR(逐次逼近寄存器)ADC,共支持20个测量通道(模拟启用引脚)。

ADC1:

  • 10 channels: GPIO1 - GPIO10

ADC2:

  • 10 channels: GPIO11 - GPIO20

2)、ADC衰减

Vref是ESP32-S3 ADC内部用于测量输入电压的参考电压。ESP32-S3 ADC可以测量从0V到Vref的模拟电压。在不同的芯片中,Vref变化,中值为1.1V。为了转换大于Vref的电压,输入电压可以在输入到ADC之前被衰减。有4种可用的衰减选项,衰减越高,可测量的输入电压可能越高。

AttenuationMeasurable input voltage range
ADC_ATTEN_DB_00 mV ~ 950 mV
ADC_ATTEN_DB_2_50 mV ~ 1250 mV
ADC_ATTEN_DB_60 mV ~ 1750 mV
ADC_ATTEN_DB_110 mV ~ 3100 mV

3)、ADC转换 ADC转换是将输入的模拟电压转换为数字值。由ADC驱动器API提供的ADC转换结果是原始数据。单读模式下ESP32-S3 ADC原始结果的分辨率为12位。

计算公式:

Vout = Dout * Vmax / Dmax       (1)

4)、对于带有eFuse ADC校准位的板,可以使用esp_ADC_cal_raw_to_voltage()来获得校准的转换结果。这些结果代表实际电压(mV)。不需要通过公式(1)来变换这些数据。如果在没有eFuse ADC校准位的板上使用ADC校准API,将生成警告。看见

5)、由于Wi-Fi也使用ADC2模块,ADC2_get_raw()的读取操作可能会在esp_wifi_start()和esp_wify_stop()之间失败。

二、配置流程

1)读取之前应配置ADC,配置位宽和衰减,上文有说 对于ADC1,通过调用函数ADC1_config_width()ADC1_conconfig_channel_atten()来配置所需的精度和衰减。 对于ADC2,通过ADC2_config_channel_atten()配置衰减。每次读取时都会配置ADC2的读取宽度。嘛意思

2)、读取adc值

3)示例工程

单读取模式ADC示例可以在ESP-IDF示例的peripherals/ADC/Single_Read目录中找到

4)软硬件校准

不同芯片参考电压存在误差(1000mv-1200mv)

1、硬件校准

巴拉巴巴拉看不懂

2、软件校准

巴拉巴拉,先跳过

5)一些用于指定ADC通道的GPIO编号的宏

  1. ADC1_CHANNEL_0_GPIO_NUM is the GPIO number of ADC1 channel 0.

  2. ADC1_GPIOn_CHANNEL is the ADC1 channel number of GPIO n.

三、上手敲代码

1)头文件Header File

2)先看看官方历程,这里是adc1

1、readme:如果打印出以下警告,则表示需要校准的eFuse位没有在您的板上正确烧写。将跳过校准。只打印原始数据。

```

W (300) ADC SINGLE: eFuse not burnt, skip calibration

I (1310) ADC2_CH0: raw data: 2715

```

2、app_main配置过程

1.adc_calibration_init():adc校准,前文提到的软件校准,固定的东西,回头再仔细看下

esp_adc_cal_check_efuse(ADC_EXAMPLE_CALI_SCHEME)

esp_adc_cal_characterize(ADC_UNIT_1, ADC_EXAMPLE_ATTEN, ADC_WIDTH_BIT_DEFAULT, 0, &adc1_chars);

esp_adc_cal_characterize(ADC_UNIT_2, ADC_EXAMPLE_ATTEN, ADC_WIDTH_BIT_DEFAULT, 0, &adc2_chars);

2、adc1_config_width(ADC_WIDTH_BIT_DEFAULT):位宽设置,默认为soc最大位宽,这里是12bit

3、adc1_config_channel_atten(ADC1_EXAMPLE_CHAN0, ADC_EXAMPLE_ATTEN):在ADC1上设置特定通道的衰减,并配置其相关的GPIO引脚复用器。

adc2_config_channel_atten(ADC2_EXAMPLE_CHAN0, ADC_EXAMPLE_ATTEN)

4、adc1_get_raw(ADC1_EXAMPLE_CHAN0):获取ADC1_CHANNEL_2adc值

5、if (cali_enable) {

voltage = esp_adc_cal_raw_to_voltage(adc_raw[0][0], &adc1_chars);

ESP_LOGI(TAG_CH[0][0], "cali data: %d mV", voltage);

}

如果有校准,使用该函数可以直接获取电压值

6、adc2的使用有一点区别,需要添加位宽参数

adc2_get_raw(ADC2_EXAMPLE_CHAN0, ADC_WIDTH_BIT_DEFAULT, &adc_raw[1][0]);

voltage = esp_adc_cal_raw_to_voltage(adc_raw[1][0], &adc2_chars);

同样的直接获取电压值

7、io对应关系在adc.h中定义

 

 

 

 

<think>嗯,用户问的是如何将ESP32-S3的6.6V到8.4V电池电压适配到ADC引脚,需要设计一个电压分压电路。首先,我需要确认ESP32-S3ADC输入电压范围。根据资料,ESP32-S3ADC引脚最大输入电压通常是3.3V,所以必须将电池电压降到这个范围内。 接下来,用户提到的电池电压范围是6.6V到8.4V,这应该是两节锂电池串联的情况,充满时8.4V,放电到6.6V。设计分压电路时,需要考虑最高电压8.4V时的分压不超过3.3V,同时最低电压6.6V时分压后的值也要足够高,以保证ADC的测量精度。 假设使用两个电阻R1和R2,分压比应该是Vout = Vin * R2/(R1+R2)。为了让最高电压8.4V时分压到3.3V,可以设定R1和R2的比例。比如,假设R1是10kΩ,那么R2应该是多少呢?根据公式,3.3 = 8.4 * R2/(10k + R2),解得R2≈5.56kΩ,接近5.6kΩ的标准电阻。这样分压比大约是5.6/(10+5.6)=约0.35,这样最高8.4V时是8.4*0.35≈2.94V,可能有点低,可能需要调整电阻值,让8.4V时分压到接近3.3V。比如,选R1=15k,R2=10k,分压比是10/(15+10)=0.4,这样8.4V时是3.36V,稍微超过3.3V,可能会有风险。那可能需要更高的分压比,比如R1=18k,R2=10k,分压比是10/(18+10)=0.357,8.4*0.357≈3V,这样在3.3V范围内,但可能精度不够。或者可能需要更精确的电阻组合,比如R1=24k,R2=10k,分压比是10/34≈0.294,这样8.4V时分压到2.47V,这样虽然安全,但ADC的动态范围利用率低了。可能需要权衡安全性和精度。 另外,要考虑电阻的功率,假设最大电流是8.4V/(R1+R2),比如R1=10k,R2=5.6k,总电阻15.6kΩ,电流约0.54mA,电阻功耗在R1上是10k*(0.54mA)^2≈2.9mW,没问题。但可能需要更低的电阻值以减少噪声,比如R1=10k和R2=5.6k可能噪声较大,换成更小的电阻,比如R1=1k和R2=560Ω,这样分压比一样,但电流更大,功耗也更高,但可能更稳定。不过ESP32ADC输入阻抗可能较低,所以可能需要考虑阻抗匹配,或者加入电压跟随器。但用户可能希望简单的分压电路,不需要运放。 另外,可能需要加入滤波电容,比如在R2两端并联一个100nF的电容,减少噪声。同时,为了保护ADC引脚,可能需要在分压输出端加一个钳位二极管到3.3V,防止过压。 总结步骤应该是:计算分压电阻,确保最高电压不超过3.3V,选择标准电阻值,考虑功耗和噪声,加入滤波和保护措施。然后通过校准或软件计算实际电压值。另外,电池电压可能波动,分压后的电压需要稳定,可能需要软件滤波,如移动平均。 可能还需要注意ADC的参考电压,ESP32-S3ADC默认参考电压是3.3V,但实际可能有偏差,建议测量实际的Vref或使用外部参考电压以提高精度。或者通过软件校准,比如测量已知电压并调整计算系数。 最后,用户可能需要示例电路图,比如R1=18k和R2=10k,分压比为10/28≈0.357,8.4V时分压到3V,6.6V时分压到约2.36V。ADC的读数范围在2.36V到3V,对应数字值。然后通过公式反推实际电压:Vin = Vadc * (R1+R2)/R2 = Vadc * 28/10 = Vadc * 2.8。需要注意ADC的精度可能受非线性影响,特别是靠近0V和3.3V时,因此可能需要分段校准。 另外,如果电池电压需要实时监测,可能需要周期性采样,并考虑低功耗设计,比如在分压电路前加MOSFET,仅在采样时通电以节省电量。</think>### ESP32-S3电池电压(6.6-8.4V)转ADC电压方案 #### 核心目标 将电池电压(6.6-8.4V)分压至ESP32-S3ADC输入范围(0-3.3V),同时确保安全性和精度。 --- ### 方案步骤 #### 1. **分压电路设计** - **公式**:分压比需满足: $$ V_{\text{ADC}} = V_{\text{BAT}} \cdot \frac{R_2}{R_1 + R_2} \leq 3.3\text{V} $$ - **电阻选择**(以8.4V为上限): - 若选$$ R_1 = 15\text{k}\Omega $$、$$ R_2 = 10\text{k}\Omega $$: $$ V_{\text{ADC}} = 8.4 \cdot \frac{10}{15+10} = 3.36\text{V} \quad (\text{略超3.3V,需调整}) $$ - **推荐值**:$$ R_1 = 18\text{k}\Omega $$、$$ R_2 = 10\text{k}\Omega $$ $$ V_{\text{ADC}} = 8.4 \cdot \frac{10}{28} \approx 3.0\text{V} \quad (\text{安全值}) $$ #### 2. **电路优化** - **滤波电容**:在$$ R_2 $$两端并联$$ 100\text{nF} $$电容,减少噪声。 - **过压保护**:在ADC输入端串联$$ 100\Omega $$电阻并并联$$ 3.3\text{V} $$稳压二极管(如BZX84C3V3),防止意外过压。 - **低功耗设计**(可选):在分压电路前添加MOSFET,仅在采样时导通以省电。 #### 3. **软件校准** - **公式转换**:根据分压比反推实际电压: $$ V_{\text{BAT}} = V_{\text{ADC}} \cdot \frac{R_1 + R_2}{R_2} = V_{\text{ADC}} \cdot 2.8 $$ - **非线性校准**:通过测量已知电压(如6.6V、8.4V)建立查找表,补偿ADC非线性误差。 #### 4. **示例电路图** ``` VBAT (6.6-8.4V) │ ├── R1 (18kΩ) ────┐ │ │ └── R2 (10kΩ) ────┴── ADC_PIN (0-3.0V) │ └── 100nF电容 ``` --- ### 注意事项 1. **电阻精度**:选用1%精度金属膜电阻,减少分压误差。 2. **功耗控制**:分压电路持续电流约$$ \frac{8.4}{28k\Omega} \approx 0.3\text{mA} $$,若需省电可增加MOSFET开关。 3. **ADC配置**: - 设置ADC量程为3.3V(默认)。 - 启用多次采样平均(如11位分辨率 + 16次采样平均)。 --- ### 扩展建议 - **参考电压校准**:通过ESP32-S3的eFuse测量实际VREF,提升精度。 - **电池电量估算**:结合电压-电量曲线(需根据电池型号标定),实现电量百分比显示。 通过以上方案,可安全、可靠地将6.6-8.4V电池电压适配到ESP32-S3ADC引脚。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值