前言
ADC即模拟数字转换器(Analog-to-digital converter)是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。一个模拟数字转换器可以提供信号用于测量。与之相对的设备成为数字模拟转换器。
例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。那就可以用到ADC了
提示:以下是本篇文章正文内容,下面案例可供参考
一、ESP32 ADC相关介绍
一些 ADC2 引脚用作捆绑引脚(GPIO 0、2、15),因此不能自由使用。
ESP32 DevKitC:由于外部自动编程电路,GPIO 0 无法使用。
ESP-WROVER-KIT:GPIO 0、2、4 和 15 不能使用,因为用于不同目的的外部连接。
由于 ADC2 模块也被 Wi-Fi 使用,因此它们一起使用时只有一个可以抢占,这意味着adc2_get_raw()可能会被阻塞直到 Wi-Fi 停止
ESP32 集成了 2 个 SAR(逐次逼近寄存器)ADC,总共支持 18 个测量通道(模拟使能引脚)。
ADC1,8通道:GPIO32 - GPIO39
ADC2,10个通道:GPIO0、GPIO2、GPIO4、GPIO12 - GPIO15、GOIO25 - GPIO27
以下介绍通过ADC1进行介绍
2、ADC衰减
Vref 是 ESP32 ADC 内部用于测量输入电压的参考电压。ESP32 ADC 可以测量从 0 V 到 Vref 的模拟电压。在不同的芯片中,Vref 不同,中位数为 1.1 V。为了转换大于 Vref 的电压,可以在输入 ADC 之前对输入电压进行衰减。有 4 种可用的衰减选项,衰减越高,可测量的输入电压就越高。
3、ADC 转换
ADC 转换是将输入模拟电压转换为数字值。ADC 驱动程序 API (adc1_get_raw()
)提供的 ADC 转换结果是原始数据。Single Read 模式下 ESP32 ADC 原始结果的分辨率为 12 位。
如果根据ADC采集的原始数据来计算电压那可以用Vout(输出电压)=Dout(输出的数据)*Vmax(最大测量电压)/Dmax(最大输出数据)
ps:如果是带有ADC校准位的板子可以直接调用esp_adc_cal_raw_to_voltage()
来直接读取输出电压,单位为mv
4、ADC 单次读取
在配置好位宽adc1_config_width()
和衰减adc1_config_channel_atten()
之后就可以直接调用adc1_get_raw(),
读取结果了;值得说明的是官方也提供给了从ULP直接读取ADC1通道的结果,但是这个要在配置的时候调用adc1_ulp_enable()
来使能ULP
二、使用步骤
1.接口函数介绍
(1)设置通道衰减
esp_err_t adc1_config_channel_atten(adc1_channel_t channel,adc_atten_t atten )
第一个参数是设置ADC通道,第二个参数是设置衰减等级;默认衰减是0dB;通过官方给的衰减设置可以看到,衰减设置的越大,那么可采集的电压范围就越大(通过对输入电压进行衰减)
返回值:
ESP_OK 成功
ESP_ERR_INVALID_ARG 参数错误
(2)配置ADC的捕获位宽
esp_err_t adc1_config_width( adc_bits_width_t width_bit )
参数:ADC1 的位捕获宽度
返回值:
ESP_OK 成功
ESP_ERR_INVALID_ARG 参数错误
(3)读取单个通道上的ADC数据
int adc1_get_raw( adc1_channel_t channel)
返回
-1:参数错误
其他:ADC1 通道读数。
参数
channel: ADC1 通道读取
(4)初始化数字ADC
esp_err_t adc_digi_initialize(const adc_digi_init_config_t *init_config )
参数:数字ADC的初始化配置adc_digi_init_config_t
在这个结构体里面;
返回:
-
- ESP_ERR_INVALID_ARG 参数错误
-
- ESP_ERR_NOT_FOUND 没有找到中断空闲
-
- ESP_ERR_NO_MEM 内存不足
-
- ESP_OK 成功
结构体中参数依次是
1)转换后的数据可以存储的最大长度。
2)在一个中断中可以转换的数据字节数
3)待初始化的ADC1通道列表。
4)需要初始化的ADC2通道列表。
- ESP_OK 成功
(5)通过 DMA 从数字 ADC 读取字节。
esp_err_t adc_digi_read_bytes(uint8_t *buf, uint32_t length_max, uint32_t *out_length, uint32_t timeout_ms);
[out] buf:从 ADC 读取的缓冲区。
[in] length_max:从 ADC 读取的预期数据长度。
[out] out_length:从 ADC 读取的数据的实际长度。
[in] timeout_ms:等待数据的时间,以毫秒为单位。
返回
ESP_ERR_INVALID_STATE 驱动状态无效。通常这意味着 ADC 采样率快于任务处理率。
ESP_ERR_TIMEOUT 操作超时
ESP_OK 成功
(6)启动数字ADC和 DMA
esp_err_t adc_digi_start(void);
返回
ESP_ERR_INVALID_STATE 驱动状态无效。
ESP_OK 成功
(6)设置数字控制器
esp_err_t adc_digi_controller_configure(const adc_digi_configuration_t *config);
返回值:
ESP_ERR_INVALID_STATE 驱动状态无效。
ESP_ERR_INVALID_ARG 如果参数组合无效。
ESP_OK 成功
参数为adc_digi_configuration_t 结构体
结构体中参数依次是
1)限制ADC转换的时间,转换完成后是否停止
2)限制ADC转换触发器上限1-255
3)ADC通道数
4)初始化结构体配置参数
5)采样频率611Hz ~ 83333Hz
6)ADC DMA传输模式:选择ADC1、ADC2、ADC1与ADC2、ADC1与ADC2轮流
7)ADC DMA传输转换格式:12BIT转换/11BIT转换
对于设置的输出格式来说如果设置输出12BIT的数据,那么输出的16位中存放格式是[15:12] 通道,[11:0]12 位 ADC 数据 。注意:对于单次转换模式。
如果设置的数是11BIT的数据那么存放内容就是[15]adc 单元,[14:11]通道,[10:0]11 位 ADC 数据 。注意:对于多或交替转换模式。
(7)检查 ADC 校准值是否烧入 eFuse。
esp_err_t esp_adc_cal_check_efuse( esp_adc_cal_value_