ESP32_ADC(Arduino)

2024-01-10 06:58:54

ADC模数转换

ESP32集成了12位的逐次逼近式ADC,分别为ADC1模块ADC2模块,共支持18个模拟输入通道:

  • ADC1模块:8个通道,32~39
  • ADC2模块:10个通道,0,2,4,12 ~ 15,25 ~ 15;部分引脚和WIFI模块共用

ESP32ADC参考电压为内部提供的 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 // 定义模拟输入引脚为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值的函数
}

效果如下:
请添加图片描述
请添加图片描述

文章来源:https://blog.csdn.net/m0_60134435/article/details/135441932
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。