当前位置: 首页 > article >正文

【ESP32】Arduino开发 | LED PWM控制器+呼吸灯例程

有关ESP32的LED PWM控制器的介绍放在了ESP-IDF的对应开发文章中,跳转栏目目录可以找到。

1. API

1.1 初始化

uint32_t ledcSetup(uint8_t channel, uint32_t freq, uint8_t resolution_bits);
  • channel:输出通道;
  • freq:输出频率;
  • resolution_bits:占空比分辨率。

1.2 绑定管脚

void ledcAttachPin(uint8_t pin, uint8_t channel);
  • pin:管脚号;
  • channel:输出通道。

1.3 设置占空比

void ledcWrite(uint8_t channel, uint32_t duty);
  • channel:输出通道;
  • duty:占空比。

1.4 读取占空比

uint32_t ledcRead(uint8_t channel);
  • channel:输出通道。

        返回当前占空比。

2. 例程

        这个例程实现一个呼吸灯应用,LED由灭到亮,再由亮到灭,一直循环。

#include <Arduino.h>

#define LEDC_FADE_TIME 3000
#define LEDC_DUTY_RES 13
#define LEDC_DUTY_MAX ((1 << LEDC_DUTY_RES) - 1)

static uint32_t step;

void setup()
{
    Serial.begin(115200);
    /* 初始化LEDC */
    ledcSetup(0, 5000, LEDC_DUTY_RES);  // 定时器0,5kHz,13位分辨率
    ledcAttachPin(2, 0);  // IO2,通道0
    step = LEDC_DUTY_MAX / LEDC_FADE_TIME;
}

void loop()
{
    /* 亮度递增 */
    uint32_t duty = 0;
    while ((duty = ledcRead(0)) < LEDC_DUTY_MAX) {
        delay(1);
        ledcWrite(0, duty + step);
    }
    /* 亮度递减 */
    duty = LEDC_DUTY_MAX;
    while ((duty = ledcRead(0)) > 0) {
        delay(1);
        ledcWrite(0, duty - step);
    }
}

        最新版本的Arduino貌似删除了自动占空比更新相关的API,所以这里就不像IDF那样可以用库函数,需要自己编写相关的逻辑。

        在setup函数内先初始化LEDC外设,使用定时器0,输出通道0,绑定管脚2,输出频率5kHz,13位占空比分辨率。

        我这里设置的渐变周期是3秒,然后每1毫秒更新一次占空比,因此用周期 / ((1 << 占空比分辨率) - 1)可以得出每毫秒需要更新的占空比步长。变亮就是不断加duty,变暗就是不断减duty,应该很好理解。ledcWrite函数里面会限制duty不超过最大分辨率,所以不用担心duty的值的问题。

        编译并烧录程序就可以看到板子上的呼吸灯效果了。


http://www.kler.cn/news/356499.html

相关文章:

  • 《重置MobaXterm密码并连接Linux虚拟机的完整操作指南》
  • C++类域访问方式(public,protected,private)对象访问 , 通过成员函数访问 ,通过友元函数访问
  • 从新手到高手:Spring AOP的进阶指南
  • 安防综合管理系统EasyCVR视频汇聚平台Linux环境下如何测试UDP端口是否正常开启?
  • 打印机出现线条和残影情况的主要原因和解决办法
  • 项目管理APP推荐_功能对比与用户评价
  • An.如何在an中截取音频片段
  • .Net自动更新程序GeneralUpdate,适用于wpf,winfrom,控制台应用
  • C++ 算法学习——1.3 双向深度优先搜索
  • 将一个单向链表插入到一个循环链表尾部
  • vue element upload取消上传后终止请求
  • 滑铁卢大学大模型公开课资料来了,大模型入门到精通,非常详细收藏我这一篇就够了
  • OpenCV之换脸技术:一场面部识别的奇妙之旅
  • PHP 函数 func_num_args() 的作用
  • spring boot 集成 dynamic-datasource-spring-boot-starter
  • 如何通过AI情侣头像项目日入1000+:详细教程揭秘
  • 推荐?还是踩雷?3款中英互译软件大盘点,你真的选对了吗?
  • 时装购物|基于springBoot的时装购物系统设计与实现(附项目源码+论文+数据库)
  • 【计网笔记】数据链路层
  • Java实现简单的5阶m序列密钥生成