同步操作将从 马志良/easyio-lib-for-esp32 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
介绍ESP32的ADC1的使用。(由于ADC2不能与WIFI共用,所以尽量优先使用ADC1,且ADC2的读取方式与ADC1不同,也就没有在esayIO中提供ADC2的初始化和读取函数。况且ADC1已经满足绝大多数场景使用。)
使用 FreeRTOS
的 Task
,创建两个任务:
led_task ,控制LED闪烁
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,关断电压输出,以降低分压电阻上功耗。
串口打印输出 光敏电阻信号 - ADC_CHANNEL_3
的电压值。
用手遮挡光敏电阻,观察到ADC1通道x输出的值变小,LED继续闪烁。处于明亮环境,LED暂停闪烁。
ADC1的通道、衰减、读取函数调用。
ESP32的ADC硬件没有模拟地,故噪声较大,且在量程的两头为非线性。如何在这种情况下提高ADC的实用性?:使用多重采样去减低噪声、尽量去测量读数在量程中间范围的模拟量
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待补全。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。