基于Arduino框架esp32的ADC使用

  • 1、ADC简介
  • 2、Arduino框架下ESP32的ADC相关函数
  • (1)analogReadResolution设置所有ADC分辨率
  • (2)analogSetClockDiv设置ADC时钟分频
  • (3)analogSetAttenuation设置所有ADC通道衰减(设计电压采集范围)
  • (4)analogSetPinAttenuation设置特定ADC通道衰减(设计电压采集范围)
  • (5)analogRead读取ADC通道原始值
  • (6)analogReadMillivolts读取ADC通道电压值
  • (7)analogSetWidth设置所有ADC通道硬件分辨率
  • (8)analogSetVRefPin设置ADC校准引脚
  • (9)hallRead读取引脚36、39连接的HALL传感器ADC值
  • 3、ESP32 ADC使用例子(Arduino框架)


3、基于Arduino框架esp32的GPIO使用介绍:基于Arduino框架esp32的GPIO使用介绍

注:本文章内容是基于arduino框架进行esp32的开发。
开发环境搭建可以参考上一篇文章:2、搭建ESP32开发环境

1、ADC简介

ADC(模数转换器)是非常常见的外围设备之一,用于将模拟电压信号转换为数字形式。在监控大多数产生模拟输出电压的传感器(例如温度、压力、水压等)中使用非常广泛。
在实际使用中被采集的电压可能超出片内ADC的电压采集范围,此时需要设计相应的分压电路分压后才进行采集计算得到实际电压。
不同芯片有不同数量的ADC,每个ADC也可能具有不同数量的可用通道和引脚。请参阅每个板的数据手册。

2、Arduino框架下ESP32的ADC相关函数

Arduino框架ADC通用API:1~6
ESP32芯片专用的ADC API:7~9

(1)analogReadResolution设置所有ADC分辨率

**功能:**用于设置模拟读取返回值的分辨率。所有芯片的默认值为12位(范围从0到4096),但ESP32S3除外,ESP32S3的默认值是13位(范围为0到8192)。当设置不同的分辨率时,读取的值将被移动以匹配给定的分辨率。范围为1-16。如果未使用此函数,将使用默认值。对于ESP32,分辨率介于9到12之间,这将改变ADC硬件分辨率。否则将移动值。
函数原型:

void analogReadResolution(uint8_t bits);
/*
参数说明:
bits:ADC模拟读取分辨率。
*/

(2)analogSetClockDiv设置ADC时钟分频

**功能:**用于设置ADC时钟的分频器。
函数原型:

void analogSetClockDiv(uint8_t clockDiv);
/*
参数说明:
clockDiv:为ADC时钟设置分频器。范围为1-255,默认值为1。
*/

(3)analogSetAttenuation设置所有ADC通道衰减(设计电压采集范围)

**功能:**用于设置所有通道的衰减,实现修改ADC的电压测量范围。
函数原型:

void analogSetAttenuation(adc_attenuation_t attenuation);
/*
参数说明:
attenuation:设置的衰减。(ADC_ATTEN_DB_0、ADC_ATTEN_DB_2_5、ADC_ATTEN_DB_2_5、ADC_ATTEN_DB_2_5)
*/

宏定义

衰减宏

对于esp32的意义

ADC_ATTEN_DB_0

电压测量范围100 mV ~ 950 mV

ADC_ATTEN_DB_2_5

电压测量范围100 mV ~ 1250 mV

ADC_ATTEN_DB_6

电压测量范围150 mV ~ 1750 mV

ADC_ATTEN_DB_11

电压测量范围150 mV ~ 2450 mV

(4)analogSetPinAttenuation设置特定ADC通道衰减(设计电压采集范围)

**功能:**用于设置特定pin/ADC通道的衰减。
函数原型:

void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation);
/*
参数说明:
pin: ADC通道对应的特定管脚。
attenuation:设置衰减。(ADC_ATTEN_DB_0、ADC_ATTEN_DB_2_5、ADC_ATTEN_DB_2_5、ADC_ATTEN_DB_2_5)
*/

宏定义

衰减宏

对于esp32的意义

ADC_ATTEN_DB_0

电压测量范围100 mV ~ 950 mV

ADC_ATTEN_DB_2_5

电压测量范围100 mV ~ 1250 mV

ADC_ATTEN_DB_6

电压测量范围150 mV ~ 1750 mV

ADC_ATTEN_DB_11

电压测量范围150 mV ~ 2450 mV

(5)analogRead读取ADC通道原始值

**功能:**用于获取给定pin/ADC通道的ADC原始值。
函数原型:

uint16_t analogRead(uint8_t pin);
/*
参数说明:
pin:ADC通道对应的管脚编号。
*/

(6)analogReadMillivolts读取ADC通道电压值

**功能:**用于获取给定pin/ADC通道的ADC值,f返回值单位为毫伏。
函数原型:

uint32_t analogReadMilliVolts(uint8_t pin);
/*
参数说明:
pin:ADC通道对应的管脚编号。
*/

(7)analogSetWidth设置所有ADC通道硬件分辨率

**功能:**用于设置硬件采样位和读取分辨率。默认值为12位(0-4095),范围为9-12。
函数原型:

void analogSetWidth(uint8_t bits);
/*
参数说明:
bits:ADC采样分辨率位宽。
*/

(8)analogSetVRefPin设置ADC校准引脚

**功能:**用于在esp32尚未校准时用于设置ADC校准的引脚(引脚25、26或27)。
函数原型:

void analogSetVRefPin(uint8_t pin);
/*
参数说明:
pin:用于设置ADC校准的VRefPin的引脚编号。
*/

(9)hallRead读取引脚36、39连接的HALL传感器ADC值

**功能:**用于获得连接到引脚36(SVP)和39(SVN)的HALL传感器的ADC值。
函数原型:

int hallRead();
/*
参数说明:
*/

3、ESP32 ADC使用例子(Arduino框架)

#include <Arduino.h>

#define PIN_ADC2_CH2 2   //定义引脚宏  

void setup() {

  Serial.begin(115200);      //初始化配置串口
  analogReadResolution(12);  //设置ADC的分辨率为12位(0-4096)
}

void loop() {
  //定义两个变量用于保存ADC采集的原始值和电压值(单位毫伏)
  int analogOriginalValue = 0;
  int analogVoltsValue = 0;

  analogOriginalValue = analogRead(PIN_ADC2_CH2);         //读取ADC原始值
  analogVoltsValue = analogReadMilliVolts(PIN_ADC2_CH2);  //读取ADC电压值(范围毫伏)
  
  // 上传A读取的ADC值:
  Serial.printf("ADC analog value = %d\n",analogOriginalValue);
  Serial.printf("ADC millivolts value = %d ms\n",analogVoltsValue);
  
  delay(100);  //延时
}
如有不对之处,欢迎大家指正!