ESP32集成了12位的逐次逼近式ADC,分别为ADC1模块ADC2模块,共支持18个模拟输入通道:
ESP32的ADC参考电压为内部提供的
V
R
E
F
V_{REF}
VREF?,不同芯片,
V
R
E
F
V_{REF}
VREF?不同,中位数是1.1V。
默认情况下,ADC的模拟信号输入范围是: 0~1.1V。如果要测量高于1.1V的电压,
则要对输入电压进行衰减,ESP32提供了4种衰减倍数(以ESP32-S2为例) :
在Arduino中,只需要调用analogRead()
方法,即可完成ESP32的转换和读取
uint16_t analogRead(uint8_t pin);
analogRead()
是一个用于读取pin引脚模拟输入值的函数。默认情况下ADC分辨率12位它返回一个介于 0(完全关闭) 和 4095(完全打开) 之间的整数,衰减倍数为11dB,模拟输入的范围0-3.3v,参考电压可取3.3v
// 读取模拟输入值
int sensorValue = analogRead(analogPin);
// 将读取到的值转换为电压值
float voltage = sensorValue * (3.3 / 4095);
#include <Arduino.h>
#define ain 35 // 定义模拟输入引脚为35
uint16_t adc_value = 0; // 定义一个16位无符号整数变量用于存储ADC采样值
float adc_voltage = 0.0; // 定义一个浮点数变量用于存储ADC电压值
void read_adc() // 定义一个函数用于读取ADC采样值和电压值
{
adc_value = analogRead(ain); // 从模拟输入引脚读取采样值并存储到adc_value变量中
adc_voltage = adc_value * (3.3 / 4095); // 根据采样值计算电压值并存储到adc_voltage变量中
Serial.printf("采样值:%d 电压值:%.2f", adc_value, adc_voltage); // 通过串口打印采样值和电压值
Serial.println(); // 换行
delay(500); // 延时500毫秒
}
void setup()
{
Serial.begin(115200); // 设置串口波特率为115200
}
void loop()
{
read_adc(); // 调用read_adc函数读取ADC采样值和电压值
}
效果如下:
#include <Arduino.h>
#define d2 2 // 定义引脚d2为数字输出引脚
#define ain 35 // 定义模拟输入引脚ain为35
uint16_t adc_value = 0; // 定义一个16位无符号整数变量adc_value,用于存储ADC采样值
void Init_PWM() // 初始化PWM函数
{
ledcSetup(1, 128, 12); // 设置PWM通道1的频率为128Hz,占空比为12%
ledcAttachPin(d2, 1); // 将PWM通道1与引脚d2连接
}
void adc_set_pwm() // 设置PWM值的函数
{
adc_value = analogRead(ain); // 读取模拟输入引脚ain的采样值,并存储到adc_value变量中
ledcWrite(1, adc_value); // 将PWM通道1的占空比设置为adc_value
Serial.println(adc_value); // 通过串口打印adc_value的值
delay(100); // 延时100毫秒
}
void setup()
{
Init_PWM(); // 调用初始化PWM函数
Serial.begin(115200); // 设置串口波特率为115200
}
void loop()
{
adc_set_pwm(); // 调用设置PWM值的函数
}
效果如下: