4. 读取电位器模拟值

任务目标

使用ESP32内置ADC读取电位器分压电压,将模拟量转换为数字量后通过串口输出,掌握模拟信号采集的基本流程。

硬件与接线

  • ESP32开发板(如ESP32-DevKitC)
  • 10kΩ电位器(旋钮式)
  • 杜邦线3根

接线方式:电位器两端分别接3.3V和GND,中间抽头(滑片)接GPIO34(ADC1_CH6)。GPIO34为纯输入引脚,无需外部上拉/下拉电阻。

关键实现说明

ESP32的ADC精度为12位(0~4095),默认衰减为0dB时测量范围约0~1.1V,不满足0~3.3V测量需求。因此需通过analogSetPinAttenuation()将衰减设置为ADC_11db,使测量范围扩展至约0~3.3V。代码中同时输出原始ADC值和换算后的电压值(单位mV),便于直接观察电位器旋转与电压变化的对应关系。

完整代码

#include <Arduino.h>

#define POT_PIN 34  // GPIO34 = ADC1_CH6

void setup() {
  Serial.begin(115200);
  // 设置衰减为11dB,使ADC测量范围覆盖0~3.3V
  analogSetPinAttenuation(POT_PIN, ADC_11db);
  delay(100);
  Serial.println("ESP32 ADC Potentiometer Demo");
}

void loop() {
  int raw = analogRead(POT_PIN);          // 读取原始值 0~4095
  int voltage_mv = map(raw, 0, 4095, 0, 3300);  // 换算为毫伏

  Serial.printf("Raw: %4d | Voltage: %4d mV\n", raw, voltage_mv);
  delay(200);  // 每200ms输出一次
}

编译与烧录

  1. 在Arduino IDE中,选择开发板为“ESP32 Dev Module”。
  2. 确认串口端口选择正确(如COM3或/dev/ttyUSB0)。
  3. 将上述代码粘贴到编辑器,点击“上传”按钮完成编译烧录。

验证方法

  1. 打开Arduino IDE的串口监视器,波特率设为115200。
  2. 旋转电位器旋钮至一端极限,观察串口输出:原始值应接近0,电压接近0 mV。
  3. 旋转至另一端极限,原始值应接近4095,电压接近3300 mV。
  4. 缓慢旋转旋钮,串口输出的原始值和电压值应连续平滑变化,无跳变或卡顿。

通过标准:串口输出的电压值随旋钮转动在0~3300 mV范围内单调连续变化,且两端极限值与上述预期一致。

常见问题

  • 电压读数始终为0或4095:检查电位器两端是否分别接3.3V和GND,中间抽头是否确实接到GPIO34。
  • 读数跳动剧烈:确保杜邦线连接稳固,可尝试缩短导线长度;若仍跳动,可在GPIO34与GND之间并联一个0.1μF陶瓷电容滤波。
  • 电压上限不足3300 mV:确认已调用analogSetPinAttenuation(POT_PIN, ADC_11db),否则默认衰减下满量程仅约1.1V。