1 Star 0 Fork 18

bcsvr.com/easyio-lib-for-esp32

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

11_ADC

例程简介

介绍ESP32的ADC1的使用。(由于ADC2不能与WIFI共用,所以尽量优先使用ADC1,且ADC2的读取方式与ADC1不同,也就没有在esayIO中提供ADC2的初始化和读取函数。况且ADC1已经满足绝大多数场景使用。)

使用 FreeRTOSTask,创建两个任务:

  1. led_task ,控制LED闪烁

  2. adc1_scan_task ,扫描ADC1的ADC_CHANNEL_3通道:电路为光敏电阻。并控制led任务运行状态

使用 adc_sampling.c.h 驱动模块,来对ESP32的 ADC1 进行配置。

鉴于ESP32的ADC校准补偿比较麻烦,且注意事项过多,不建议了解硬件细节,直接使用easyIO封装好的函数去调用。

更多ESP32的ADC介绍,详见在线文档:(ESP32 ADC模/数转换器)[https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/adc.html]

硬件连接

LED ADC_BAT(电池电压) ADC_PD(光敏) ADC_CON(采样电源控制)
ESP32 GPIO33 SENSOR_VP - GPIO36 SENSOR_VN - GPIO39 GPIO12

ADC1 channel 与 Pin 对照表,可见 adc_sampling.c 文件。

【注意】:ESP32-IOT-KIT开发板在使用ADC,测量板载 电池电压光敏电压时,需将ADC_CON输出为高电平(gpiox_set_ppOutput(14, 1);), 开通光敏电路和电池分压采样电路的供电。当ADC闲时,ADC_CON可设置输出为0,关断电压输出,以降低分压电阻上功耗。

PMOS电子开关电路原理可见:

运行现象

  • 串口打印输出 光敏电阻信号 - ADC_CHANNEL_3 的电压值。

  • 用手遮挡光敏电阻,观察到ADC1通道x输出的值变小,LED继续闪烁。处于明亮环境,LED暂停闪烁。

学习内容

  1. ADC1的通道、衰减、读取函数调用。

  2. ESP32的ADC硬件没有模拟地,故噪声较大,且在量程的两头为非线性。如何在这种情况下提高ADC的实用性?:使用多重采样去减低噪声、尽量去测量读数在量程中间范围的模拟量

  3. easyIO最多支持8路ADC的输入,且不支持任意GPIO映射,引脚映射表在adc_sampling.c.h文件中。

关键函数

// ADC1及输入通道初始化(在特定衰减下表征ADC的特性,并生成ADC电压曲线)
void adc1_init_with_calibrate(adc_atten_t atten, int ch_num, ...);

// 获取ADC1通道x转换后的原始值
int adc1_get_raw(adc1_channel_t channel);

// 获取ADC1通道x经校准补偿后的转换电压,单位mV
uint32_t adc1_cal_get_voltage(adc_channel_t channel);

// 获取ADC1通道x,经多重采样平均后,并校准补偿后的转换电压,单位mV
uint32_t adc1_cal_get_voltage_mul(adc_channel_t channel, uint32_t mul_num);

注意事项

  • ESP32-IOT-KIT开发板在使用ADC,测量板载 电池电压光敏电压时,需将ADC_CON输出为高电平(gpiox_set_ppOutput(14, 1);), 开通光敏电路和电池分压采样电路的供电。当ADC闲时,ADC_CON可设置输出为0,关断电压输出,以降低分压电阻上功耗。

  • 由于ADC2不能与WIFI共用,所以尽量优先使用ADC1,且ADC2的读取方式与ADC1不同,也就没有在esayIO中提供ADC2的初始化和读取函数。况且ADC1已经满足绝大多数场景使用,没必要因为ADC2给驱动库编写带来麻烦。

  • TP两点校准值是用户自己测量,并刻录到eFuse中。而eFuse Vref由工厂生产时刻录。(就是说芯片刚出厂只会有Vref)

  • 不同的衰减系数,对应的ESP32引脚输入范围为:0:75~1008mV。2.5:78~1317mV。6:107~1821mV。11:142~3108mV。超过衰减系数的电压输入范围,可能导致ADC损毁。

  • 不同的衰减系数,会影响输入电压量程,但会影响经校准补偿后的值。且衰减越大,对读数准确性的影响也越大。尽量使用 较低的衰减系数,以获得更高的测量精度。

  • 使用 adc1_init_with_calibrate 去配置ADC,并不会对ADC转换后的值产生影响。

  • adc1_get_raw 用来读取原始转换值adc1_cal_get_voltage 用来读取经校准补偿后的电压值adc1_cal_get_voltage_mul 用来读取多重采样并校准补偿后的电压值

  • ESP32的ADC的每个通道的衰减好像都可以单独配置,但不同的衰减需要匹配的不同的校准补偿结构体 esp_adc_cal_characteristics_t,会给驱动编写带来麻烦,故easyIO留出的API中,将所有通道的衰减都设为了相同值。

  • 在初始化SARADC1 或SARADC2 或霍尔传感器的时候,会在SENSOR_VP/SENSOR_VN PAD 的内部产生一个持续约80 ns 的输入毛刺。如果设计中使用了SENSOR_VP/SENSOR_VN 作为GPIO,且同时使用了其他ADC,则需要额外的软件处理,避开该毛刺。

  • 优先推荐使用SENSOR_VP 及SENSOR_VN 作为ADC 使用。

  • 目前不支持高精度ADC。SENSOR_VP 和SENSOR_CAPP 及SENSOR_VN 和SENSOR_CAPN 之间的两个采样电容270 pF 可删除。之后这4 个管脚可当做普通的ADC 或是GPIO 使用。

  • ADC 的输入电压建议不超过2450 mV,推荐在100 ~ 950 mV 间,以获得更高的校准精度。

  • ESP32硬件没有AGND模拟地。

  • IDF V4.2和4.3不一样。

  • 非线性,要到0.1xV,才会有读数。对精准度有严格要求的建议用外接的独立ADC。

  • ESP-IDF V4.2与V4.3在 ADC上对源文件的引用有区别。V4.3的CMakeLists.txt 需要增加 "${IDF_PATH}/components/esp_adc_cal/esp_adc_cal_esp32.c"

  • ADC的DMA模式的API待补全。

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/bcsvr/easyio-lib-for-esp32.git
git@gitee.com:bcsvr/easyio-lib-for-esp32.git
bcsvr
easyio-lib-for-esp32
easyio-lib-for-esp32
master

搜索帮助