本篇介绍旋钮控制LED亮度的过程。旋钮使用电位器,旋转产生电压变化,然后接入ESP32-C3,做ADC采样,再根据采样值——也就是电压值,来调整PWM占空比,达到控制LED亮度的效果。
图3-1 蓝白电位器连接(图中A0接入ESP32的ADC)
ESP32-C3技术规格书(datasheet)上有管脚介绍。本例选择了IO5,也就是ADC2_CH0作为模拟信号输入管脚。
Arduino-ESP32框架中ADC的使用非常简单,IO无须初始化,只要调用函数analogRead(pin)就可以读取管脚上的电压值,当然参考电压是3.3V,可以测量的电压值也在0~3.3V之间,因为是12位的ADC,所以对应数字转换值为0~4095。
图3-2 ESP32-C3的管脚描述表截图
本人开始准备启用Serial1(DFROBOT文档介绍的用法),后来就想先试试Serial看看,没想到板子的Type-C USB口就可以作为串口使用(对应Serial),这就省得连接USB-TTL模块了。
当然,本人在测试过程中也遇到一些坑。基本就是一旦板子程序启用了Serial,那么上电后就可以自动通过Type-C USB识别到串口,这样还省得将IO9脚拉低了。不过开始不清楚,再加上这种形式有时也会识别不到,所以连接USB-TTL搞了半天。
目前的测试现象是:Type-C USB识别为串口后,使用USB-TTL模块连接板子的20、21脚(看管脚描述是RxD和TxD)并没有效果。即只能使用Type-C USB自动识别的串口。
图3-3 板子Type-C USB自动识别串口的输出
#define LED 7 //GPIO7 控制LED
#define Ain 5 //GPIO6 模拟输入
int i = 0;
/*
* 设置PWM参数,采用10位分辨率,这样PWM有效值0~1023
* 和12 bit ADC采样值0~4095呈1:4,方便转化。
*/
const int freq = 5000; //PWM频率
const int ledChannel = 0; //信号生成GPIO
const int resolution = 10;//10位分辨率
void setup() {
/*
* 个人测试,如果启用了Serial,那么Beetle ESP32-C3的USB口可以作为串口使用,
* 而且重启后,即使IO9没有拉低也可以检测到串口(可能有小概率会检测不到)。
*/
Serial.begin(115200);
//设置LEDC通道8频率为5000,分辨率为10位
ledcSetup(ledChannel, freq, resolution);
//设置LEDC通道0在IO7上输出
ledcAttachPin(LED, ledChannel);
}
void loop() {
//读取Ain模拟口的数值(0-3.3V对应0-4095取值)
int n = analogRead(Ain);
//PWM输出,占空比有效值0~1023
ledcWrite(ledChannel, n/4);
delay(1);
i++;
if(i>=2000){
Serial.print("ADC value : ");
Serial.println(n);
i=0;
}
}