Arduino ESP32利用PWM实现板载LED呼吸灯效果

Arduino ESP32利用PWM实现板载LED呼吸灯效果


LEDC简介

LED控制(LEDC)外围设备主要用于控制LED的强度,尽管它也可以用于生成PWM信号用于其他目的。它具有16个通道,可以生成独立的波形,这些波形可以用于驱动RGB LED器件。

LEDC通道分为两组,每组8个通道。一组LEDC通道以高速模式运行。此模式在硬件中实现,并提供PWM占空比的自动且无干扰的更改。另一组通道在低速模式下运行,PWM占空比必须由驱动程序在软件中进行更改。每组通道还能够使用不同的时钟源。

PWM控制器可以自动逐渐增加或减少占空比,从而允许淡入而不会受到任何处理器干扰。
在这里插入图片描述

在这里插入图片描述

相关函数

  • ledcSetup()函数

ledcSetup()函数原型如下所示,其功能为设置 LEDC通道对应的频率和计数位数(占空比分辨率)

double ledcSetup(uint8_t chan, double freq, uint8_t bit_num)

其第一个参数chan表示通道号,取值为0 ~ 15即可设置16个通道,其中高速通道(0 ~ 7)由80MHz时钟驱动,低速通道(8 ~ 15)由 1MHz 时钟驱动;第二个参数freq为期望设置的频率;第三个参数为占空比分辨率的计数位数,其取值为0 ~ 20(该值决定后面 ledcWrite 方法中占空比可写值,比如该值写10,则占空比最大可写1023 即(1<<bit_num)-1。

  • ledcAttachPin()函数

ledcAttachPin()函数原型如下所示,其功能为将指定的 LEDC 通道绑定到指定的 IO 口上以实现PWM的输出.

void ledcAttachPin(uint8_t pin, uint8_t channel);

第一个参数pin表示我们需要输出的IO口,第二个参数channel为我们指定的LEDC通道。

  • ledcWrite()函数

ledcWrite()函数原型如下所示,其功能为指定的 LEDC 通道的输出占空比.

void ledcWrite(uint8_t chan, uint32_t duty)

第一个参数chan为我们指定的LEDC通道,第二个参数duty表示占空比,其取值范围与ledcSetup()函数的bit_num有关。

实例代码

实现效果:板载led灯实现忽亮忽灭的呼吸灯效果。

#include <Arduino.h>
 /* 使用ledc通道1,设置频率为1kHz,分辨率为10位 */
int freq = 1000;    // 频率
int channel = 0;    // 通道
int resolution = 10;   // 分辨率

const int led = 2;
void setup()
{

  ledcSetup(channel, freq, resolution); // 设置通道
  ledcAttachPin(led, channel);  // 将通道与对应的引脚连接
}

void loop()
{
  // 逐渐变亮
  for (int dutyCycle = 0; dutyCycle <= 255; dutyCycle = dutyCycle + 5)
  {
    ledcWrite(channel, dutyCycle);  // 输出PWM
    delay(20);
  }

  // 逐渐变暗
  for (int dutyCycle = 255; dutyCycle >= 0; dutyCycle = dutyCycle - 5)
  {
    ledcWrite(channel, dutyCycle);  // 输出PWM
    delay(20);
  }
}

实例代码二

输出固定占空比:PWM频率为2KHz,分辨率为2的8次幂256,输出占空比为50%

#include <Arduino.h>
/* 设置led输出引脚号 */
uint8_t led_pin = 2;

void setup() 
{            
  Serial.begin(115200);
  delay(10); 

  /* 1. 使用ledc通道1,设置频率为2kHz,分辨率为8位 */
  double f = ledcSetup(1, 2000, 8);  
  Serial.print("F=");Serial.println(f); /* 打印实际设置的频率*/

  /* 2. 将LED引脚绑定到ledc通道1 */
  ledcAttachPin(led_pin, 1);

  /* 3. 设置ledc通道占空比为128/256=50% */
  ledcWrite(1, 128);
}

void loop() 
{
  delay(100);
}

  • 10
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值