ESP32 Arduino开发之路(2)— 使用PWM实现LED呼吸灯

ESP32 Arduino开发之路(2)— 使用PWM实现LED呼吸灯

一、前言

在ESP32上有一个LEDC外设模块专用于输出PWM波形,其介绍如下所示:
在这里插入图片描述
参考文章:在 ESP32 上使用 LEDC (PWM) (3)

二、PWM引脚

如图所示为引脚映射
在这里插入图片描述

三、控制函数

1、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

2、ledcAttachPin()函数

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

void ledcAttachPin(uint8_t pin, uint8_t channel);

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

3、ledcWrite()函数

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

void ledcWrite(uint8_t chan, uint32_t duty)

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

四、PWM输出

编写代码如下所示,设置PWM频率为1KHz,分辨率为1024,输出占空比为50%

/* 设置led输出引脚号 */
uint8_t led_pin = 2;

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

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

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

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

void loop() 
{
  delay(100);
}

编译上传到开发板,串口打印如下所示,可以看到,1kHz频率设置成功
在这里插入图片描述
另外可以通过示波器抓取波形如下所示,可以看到其波形频率为1kHz,占空比为50%
在这里插入图片描述

五、呼吸灯实现

编写代码如下所示

/*
 * ESP32使用PWM实现呼吸灯程序
 */
 
/* 设置led输出引脚号 */
uint8_t led_pin = 2;
uint8_t led_ch = 1;

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

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

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

  /* 3. 设置ledc通道占空比为512/1024=50% */
  ledcWrite(led_ch, 511);
}

void loop() 
{
  uint8_t dir = 0;
  uint32_t pwmval = 255;
  while(1)
  {
    if(dir) pwmval++;                 // dir==1  pwmval递增
    else pwmval--;                    // dir==0  pwmval递减
    if( pwmval == 0 ) dir=1;          // pwmval降低至0后,方向为递增
    if( pwmval >= 500) dir=0;         // pwmval递增到500后,方向改为递减
    ledcWrite(led_ch, pwmval);           // 修改占空比
    if( pwmval==0 ) delay(500);    // 在LED熄灭时等待300ms
    delay(5);
  }
}

编译上传到开发板,可以看到运行效果如下所示
在这里插入图片描述

六、附录

上一篇:ESP32 Arduino开发之路(1)— 搭建开发环境并点亮LED
下一篇:ESP32 Arduino开发之路(3)— 使用Ticker库的软件定时器

版权声明:本文为CSDN博主「Willliam_william」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38113006/article/details/119940933

ESP32 Arduino开发之路(2)— 使用PWM实现LED呼吸灯

一、前言

在ESP32上有一个LEDC外设模块专用于输出PWM波形,其介绍如下所示:
在这里插入图片描述
参考文章:在 ESP32 上使用 LEDC (PWM) (3)

二、PWM引脚

如图所示为引脚映射
在这里插入图片描述

三、控制函数

1、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

2、ledcAttachPin()函数

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

void ledcAttachPin(uint8_t pin, uint8_t channel);

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

3、ledcWrite()函数

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

void ledcWrite(uint8_t chan, uint32_t duty)

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

四、PWM输出

编写代码如下所示,设置PWM频率为1KHz,分辨率为1024,输出占空比为50%

/* 设置led输出引脚号 */
uint8_t led_pin = 2;

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

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

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

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

void loop() 
{
  delay(100);
}

编译上传到开发板,串口打印如下所示,可以看到,1kHz频率设置成功
在这里插入图片描述
另外可以通过示波器抓取波形如下所示,可以看到其波形频率为1kHz,占空比为50%
在这里插入图片描述

五、呼吸灯实现

编写代码如下所示

/*
 * ESP32使用PWM实现呼吸灯程序
 */
 
/* 设置led输出引脚号 */
uint8_t led_pin = 2;
uint8_t led_ch = 1;

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

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

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

  /* 3. 设置ledc通道占空比为512/1024=50% */
  ledcWrite(led_ch, 511);
}

void loop() 
{
  uint8_t dir = 0;
  uint32_t pwmval = 255;
  while(1)
  {
    if(dir) pwmval++;                 // dir==1  pwmval递增
    else pwmval--;                    // dir==0  pwmval递减
    if( pwmval == 0 ) dir=1;          // pwmval降低至0后,方向为递增
    if( pwmval >= 500) dir=0;         // pwmval递增到500后,方向改为递减
    ledcWrite(led_ch, pwmval);           // 修改占空比
    if( pwmval==0 ) delay(500);    // 在LED熄灭时等待300ms
    delay(5);
  }
}

编译上传到开发板,可以看到运行效果如下所示
在这里插入图片描述

六、附录

上一篇:ESP32 Arduino开发之路(1)— 搭建开发环境并点亮LED
下一篇:ESP32 Arduino开发之路(3)— 使用Ticker库的软件定时器

版权声明:本文为CSDN博主「Willliam_william」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38113006/article/details/119940933

生成海报
点赞 0

Willliam_william

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

esp32测试wifi速率

一、下载demo, demo路径esp-idf\examples\wifi\iperf 注意:运行可能会报分区表错,idf.py menuconfig修改下flash为DIO模式再试;

ESP32­-PICO-­D4的使用

特点 尺寸仅为 (7.000±0.100) mm × (7.000±0.100) mm × (0.940±0.100) mm集成1 个 4 MB 串行外围设备接口 (SPI) flash集成 2.4 GHz Wi-Fi 和蓝牙双模的单芯片方案

ESP32_FreeRTOS_Arduino_1_创建任务

关于FreeRTOS 在arduino环境下的应用 一、关于FreeRTOS 1、什么是FreeRTOS FreeRTOS是运行在微控制器上的一种实时操作系统,可以有效的管理任务,合理的分配硬件资源。 举例来