ESP-32的学习日记(3)ADC
打算利用这个暑假学习ESP-32,顺便记录一下学习过程,有什么错误和不对的地方欢迎大家批评指正。今天学了ADC模数转换实验。也是看着b站up主的视频学的。ADC是将模拟信号转化到数字信号,一般用于各种将传感器采集的数据转化为我们能看得懂的数字数据(个人是这么理解的?
打算利用这个暑假学习ESP-32,顺便记录一下学习过程,有什么错误和不对的地方欢迎大家批评指正。今天学了ADC模数转换实验。也是看着b站up主罗大富Bigrich的视频学的。
ADC是将模拟信号转化到数字信号,一般用于各种将传感器采集的数据转化为我们能看得懂的数字数据(个人是这么理解的?)
串口调试
这里需要用到电位器、LED、1KΩ电阻、面包板以及若干杜邦线。连接方式就是用公对母的杜邦线将ESP-32的GND引脚接在面包板上(引出GND),电阻的一端接这个GND,另一端接LED的阴极,LED阳极接在ESP-32的D13引脚上。用公对公将电位器的一个引脚接入GND。中间引脚连接ESP32的D26。另一引脚接ESP32的3V3。接线图如下图所示。
(图源up主罗大富Bigrich)
使用Arduino自带的Serial函数可以实现将读取到的数值打印在串口监视器中。主要是设置波特率以及打印数值。代码如下所示。这里需要注意的是,ESP32不是所有的引脚都是ADC引脚,具体的需要看ESP32引脚图。(第一期文章有)。
//在串口监视器中打印电位计的模拟输入信号
#define POT 26
//初始模拟输出值
int pot_value;
void setup() {
// 设置窗口通讯波特率
Serial.begin(9600);
pinMode(POT, INPUT);
}
void loop() {
//读取电位计模拟输入值
pot_value = analogRead(POT);
//打印模拟输入信号在串口监视器中
Serial.println(pot_value);
delay(50);
}
代码烧录成功后,点击左上角工具,打开那个叫串口监视器的(也可以用快捷键ctrl+shif+M),就可以看到读取的值了。转动电位器还可以看到不同的值。一开始出现的数值不是零也不要慌张,可能是你之前拧到电位器了。拧到最左边输出的是0,最右输出为4095.

通过电位器的模拟输入值来控制 LED 的亮度
学会读取到模拟输入信号,就可以利用这个转化为LED的模拟输出信号,通过analogWrite()控制LED亮度。analogWrite()的输入是0-255,一共256个数,而通过串口打印我们发现模拟输入信号的值是0-4095,一共4056个数,相差16倍。所以我们可以将读取到的模拟输入信号值除以 16,以此来匹配 analogWrite () 控制 LED 亮度所需的数值区间,实现模拟输入信号对 LED 亮度的线性调节。代码如下所示。
#define POT 26
#define LED 13
//初始模拟输出值
int pot_value;
int led_value;
void setup() {
// 设置窗口通讯波特率
Serial.begin(9600);
pinMode(POT, INPUT);
pinMode(LED, OUTPUT);
}
void loop() {
//读取电位计模拟输入值
pot_value = analogRead(POT);
//把电位计模拟输入值转化为LED模拟输出值
led_value = pot_value / 16;
analogWrite(LED, led_value);
delay(50);
}
使用ADC模拟通道输入
通过电位器的模拟输入值直接控制 LEDC 通道的占空比,从而实现对 LED 亮度的连续调节。旋转电位器 → 改变 ADC 模拟输入值 → 改变 LEDC 通道的 PWM 占空比 → LED 亮度随电位器旋钮连续变化。代码如下所示。
#define POT 26
#define LED 13
#define CHANNEL 0 //定义LEDC通道
#define RES 12
#define FREQ 1000
//初始模拟输出值
int pot_value;
int led_value;
void setup() {
//设置ADC分辨率
analogReadResolution(12);
//配置输入衰减
analogSetAttenuation(ADC_11db);
//建立LEDC通道,配置LEDC分辨率
ledcSetup(CHANNEL, FREQ, RES);
//关联GPIO与LEDC通道
ledcAttachPin(LED, CHANNEL);
}
void loop() {
//读取电位计模拟输入值
pot_value = analogRead(POT);
//输出PWM
ledcWrite(CHANNEL, pot_value);
delay(50);
}
更多推荐


所有评论(0)