sonicfirr 发表于 2022-8-7 21:56

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

<div class='showpostmsg'><h2><b>1、功能说明</b></h2>

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

<p>&nbsp;</p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center">图3-1&nbsp;蓝白电位器连接(图中A0接入ESP32的ADC)</p>

<p align="center">&nbsp;</p>

<h2><b>2、ESP32-C3的ADC</b></h2>

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

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

<p>&nbsp;</p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center">图3-2&nbsp;ESP32-C3的管脚描述表截图</p>

<p align="center">&nbsp;</p>

<h2><b>3、串口启用</b></h2>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本人开始准备启用Serial1(DFROBOT文档介绍的用法),后来就想先试试Serial看看,没想到板子的Type-C USB口就可以作为串口使用(对应Serial),这就省得连接USB-TTL模块了。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然,本人在测试过程中也遇到一些坑。基本就是一旦板子程序启用了Serial,那么上电后就可以自动通过Type-C USB识别到串口,这样还省得将IO9脚拉低了。不过开始不清楚,再加上这种形式有时也会识别不到,所以连接USB-TTL搞了半天。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目前的测试现象是:Type-C USB识别为串口后,使用USB-TTL模块连接板子的20、21脚(看管脚描述是RxD和TxD)并没有效果。即只能使用Type-C USB自动识别的串口。</p>

<p>&nbsp;</p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center">图3-3&nbsp;板子Type-C USB自动识别串口的输出</p>

<p align="center">&nbsp;</p>

<h2><b>4、ADC_PWM案例代码</b></h2>

<pre>
<code class="language-cpp">#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&gt;=2000){
    Serial.print("ADC value : ");
    Serial.println(n);
    i=0;
}
}</code></pre>

<p>&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2022-8-9 07:24

<p>一般是Type-C USB是自动识别的串口的</p>
页: [1]
查看完整版本: 【Beetle ESP32-C3】三、旋钮(电位器)调整LED亮度(Arduino)