sonicfirr 发表于 2022-8-6 23:50

【Beetle ESP32-C3】二、PWM呼吸灯(Arduino)

<div class='showpostmsg'><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本篇介绍Beetle ESP32-C3在Arduino IDE中进行PWM开发的过程,实现呼吸灯功能&mdash;&mdash;实际是DFROBOT官网示例代码仅修改为IO7做输出。</p>

<h2><b>1、PWM(Pulse Width Modulation):脉冲宽度调制</b></h2>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调整PWM包括:周期调整和正脉冲调整。PWM就好比是&ldquo;蹬自行车&rdquo;&mdash;&mdash;正脉冲时蹬车,负脉冲时不蹬让其滑行。PWM利用这个原理可以进行&ldquo;直流电机调速&rdquo;、&ldquo;照明亮度调整(即呼吸灯)&rdquo;等操作。</p>

<p>&nbsp;</p>

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

<p align="center">图2-1 PWM原理</p>

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

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Arduino core for the ESP32并没有一般Arduino中用来输出PWM的<s>analogWrite(pin, value)</s>方法,Arduino-ESP32框架提供了一个LEDC(即LED control)库,是设计用来控制LED实现呼吸灯之类,当然也可以用作通用PWM输出。</p>

<p>&nbsp;</p>

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

<p align="center">图2-2&nbsp;ESP32各系列PWM通道数</p>

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

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 乐鑫官方文档LEDC库链接:<a href="https://docs.espressif.com/projects/arduino-esp32/en/latest/api/ledc.html"><u>https://docs.espressif.com/projects/arduino-esp32/en/latest/api/ledc.html</u></a>&nbsp;。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文档页开始给出的表格(图2-2为其截图),说明了ESP32各个系列MCU包含的PWM通道数,其中ESP32的LEDC总共有16个路通道(0 ~ 15),分为高低速两组,高速通道(0 ~ 7)由80MHz时钟驱动,低速通道(8 ~ 15)由1MHz时钟驱动。而ESP32-C3不亏为ESP32&ldquo;阉割版&rdquo;,提供了6个通道&mdash;&mdash;话说通道多了也没有那么多IO。</p>

<h2><b>2、呼吸灯&mdash;&mdash;IO7控制LED</b></h2>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 话说本人选择用了IO7基于两个原因,一是板载的LED做呼吸灯亮度不明显,二是IO7在面包板上好连接(在核心板边上)省得接杜邦线了。</p>

<p>&nbsp;</p>

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

<p align="center">图2-3&nbsp;呼吸灯案例的面包板连接</p>

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

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是案例代码,注释加入了自己的两个理解(标注by&nbsp;Author):</p>

<pre>
<code class="language-cpp">const int ledPin = 7;// PWM生成后实际输出引脚

//设置PWM参数
const int freq = 5000;//PWM频率
const int ledChannel = 0;//信号生成GPIO
const int resolution = 8;//8位分辨率,by Author. C3可设置1~14bits

void setup(){
//PWM参数设置
ledcSetup(ledChannel, freq, resolution);

//将生成信号通道绑定到输出通道上
ledcAttachPin(ledPin, ledChannel);
}

void loop(){
//逐渐变亮,by Author. 8位分辨率因而到255
for(int dutyCycle = 0; dutyCycle &lt;= 255; dutyCycle++){   
    // changing the LED brightness with PWM
    ledcWrite(ledChannel, dutyCycle);
    delay(15);
}

//逐渐变暗
for(int dutyCycle = 255; dutyCycle &gt;= 0; dutyCycle--){
    // changing the LED brightness with PWM
    ledcWrite(ledChannel, dutyCycle);   
    delay(15);
}
}</code></pre>

<p>&nbsp;</p>

<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-7 10:34

<p>乐鑫官方文档支持的还行</p>

lugl4313820 发表于 2022-8-7 10:49

例程注释非常清楚,很好的一篇文章,期待更加精彩的作品!
页: [1]
查看完整版本: 【Beetle ESP32-C3】二、PWM呼吸灯(Arduino)