[原创] 【Beetle ESP32-C3】三、旋钮(电位器)调整LED亮度(Arduino)

sonicfirr   2022-8-7 21:56 楼主

1、功能说明

       本篇介绍旋钮控制LED亮度的过程。旋钮使用电位器,旋转产生电压变化,然后接入ESP32-C3,做ADC采样,再根据采样值——也就是电压值,来调整PWM占空比,达到控制LED亮度的效果。

 

image-20220807215438-1.png

图3-1 蓝白电位器连接(图中A0接入ESP32的ADC)

 

2、ESP32-C3的ADC

       ESP32-C3技术规格书(datasheet)上有管脚介绍。本例选择了IO5,也就是ADC2_CH0作为模拟信号输入管脚。

       Arduino-ESP32框架中ADC的使用非常简单,IO无须初始化,只要调用函数analogRead(pin)就可以读取管脚上的电压值,当然参考电压是3.3V,可以测量的电压值也在0~3.3V之间,因为是12位的ADC,所以对应数字转换值为0~4095。

 

image-20220807215438-2.png

图3-2 ESP32-C3的管脚描述表截图

 

3、串口启用

       本人开始准备启用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自动识别的串口。

 

image-20220807215438-3.png

图3-3 板子Type-C USB自动识别串口的输出

 

4、ADC_PWM案例代码

#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;
  }
}

 

回复评论 (1)

一般是Type-C USB是自动识别的串口的

点赞  2022-8-9 07:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复