自学内容网 自学内容网

【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的值的问题。

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


原文地址:https://blog.csdn.net/JackieCoo/article/details/142900912

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!