ADC模数转换
ESP32集成了12位的逐次逼近式ADC,分别为ADC1模块ADC2模块,共支持18个模拟输入通道:
- ADC1模块:8个通道,32~39
- ADC2模块:10个通道,0,2,4,12 ~ 15,25 ~ 15;部分引脚和WIFI模块共用
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为例) :
- 0dB:不衰减, 可测量输入电压范围: 0~750mv,参考电压: 1.1V。
- 2.5dB:可测量输入电压范围: 0~1050mv, 参考电压: 1 .35V。
- 6dB:可测量输入电压范围: 0~1300mv, 参考电压: 2.2V。
- 11dB:可测量输入电压范围: 0~2600mv, 参考电压: 3.3V。
在Arduino中,只需要调用analogRead()
方法,即可完成ESP32的转换和读取
API
ADC的转换和读取函数
uint16_t analogRead(uint8_t pin);
analogRead()
是一个用于读取pin引脚模拟输入值的函数。默认情况下ADC分辨率12位它返回一个介于 0(完全关闭) 和 4095(完全打开) 之间的整数,衰减倍数为11dB,模拟输入的范围0-3.3v,参考电压可取3.3v
- **pin:**指定引脚编号
// 读取模拟输入值
int sensorValue = analogRead(analogPin);
// 将读取到的值转换为电压值
float voltage = sensorValue * (3.3 / 4095);
实训案例
光照电压采样和换算
#include <Arduino.h> #define ain 35 // 定义模拟输入引脚为35uint16_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为35uint16_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_valueSerial.println(adc_value); // 通过串口打印adc_value的值delay(100); // 延时100毫秒
}void setup()
{Init_PWM(); // 调用初始化PWM函数Serial.begin(115200); // 设置串口波特率为115200
}void loop()
{adc_set_pwm(); // 调用设置PWM值的函数
}
效果如下: