ESP32_ADC(Arduino)

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值的函数
}

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

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁子希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值