【esp32教程】(三)PWM实验

记录自己学esp32过程,内容仅供参考。


前言

本文主要介绍如何用esp32产生PWM波实现一个呼吸灯,所用配置如下:

开发框架:VScode+PlatfornIO+Arduino

芯片型号:ESP-WROOM-32

开发板型号:ESP32 DEVKITV1


一、PWM

PWM是脉冲宽度调制(Pulse Width Modulation)的缩写,是一种在电子和电气工程中广泛使用的技术,用于对模拟信号进行电平数字编码
PWM的主要参数如下:
1、PWM频率:PWM频率是PWM信号在1s内从高电平到低电平再回到高电平的次数,也就是说1s内有多少个PWM周期,单位为Hz。
2、PWM周期。PWM周期是PWM频率的倒数,即T=1/f,T是PWM周期,f是PWM频率。如果PWM频率为50Hz,也就是说PWM周期为20ms,即 1s由50个PWM周期。
3、PWM占空比:PWM占空比是指在一个PWM周期内,高电平的时间与整个周期时间的比例,取值范围为0%~100%。
PWM周期是一个PWM信号的时间:脉宽时间是指高电平时间;脉宽时间占PWM周期的比例就是占空比。例如,如果PWM周期是10ms,而脉宽时间为8ms,那么PWM占空比就是8/10=80%,此时的 PWM 信号就是占空比为80%的PWM信号。PWM名为脉冲宽度调制,顾名思义,就是通过调节PWM占空比来调节PWM脉宽时间。 在使用PWM控制LED时,亮1s后灭1s,往复循环,就可以看到LED在闪烁。如果把这个周期缩小到200ms,亮 100ms后灭100ms,往复循环,就可以看到LED灯在高频闪烁。继续把这个周期持续缩小,总有一个临界值使人眼分辨不出LED在闪烁,此时LED的亮度处于灭与亮之间亮度的中间值,达到了1/2亮度。PWM占空比和亮度的关系如下图所示。
在这里插入图片描述(图片来源:https://ts1.cn.mm.bing.net/th/id/R-C.e7e6b73e76095c66908b722ee9ea8c67?rik=hSH6U%2fJqM7aoqg&riu=http%3a%2f%2fwww.siriusmicro.com%2fimages%2fPWMwaves.png&ehk=ba9mC88iu2Up%2fST%2fXwgTIXy29%2fXqukLSQxV01%2f8uWMQ%3d&risl=&pid=ImgRaw&r=0,侵删)
本文用到的外部模块为LED,只需将其与esp32的GPIO连接,控制GPIO输出/读取高低电平即可。

二、LEDC

LEDC即LED 控制器,是ESP32芯片上的一个模块,用于产生PWM信号,以控制LED灯或其他需要精确控制亮度的设备。LEDC模块提供了多个独立的PWM通道,每个通道都可以设置不同的分辨率和频率,以及占空比。ESP32不同型号具有不同的通道数,我所使用的芯片有16个通道,即8路高速通道和8路低速通道。这16路通道能够产生独立的数字波形来驱动LED设备。高速或低速通道可以由四个高速定时器之一或四个低速定时器之一进行驱动。高速定时器和低速定时器分别命名为h_timerx和l_timerx,如下图。
在这里插入图片描述
在这里插入图片描述
要实现PWM 输出,先需要设置指定通道的PWM参数:频率、分辨率、占空比,然后将该通道映射到指定引脚,该引脚输出对应通道的PWM信号。

三、相关函数

本文所介绍函数可在如下文件中找到,不同电脑对应不同的路径,可参考该路径找到自己电脑上的文件路径。
C:\Users\ASUS.platformio\packages\framework-arduinoespressif32\cores\esp32\esp32-hal-ledc.c

  • 在引脚上写入模拟值(PWM波)
void  analogWrite(uint8_t pin, int value)

pin:数字引脚编号,例如:2表示GPIO2
value:选择PWM的占空比,范围从 0(始终关闭)到 255(始终打开)。若要实现50%的占空比,value应该设置为128。
返回值:无

  • 设置指定LEDC通道的PWM信号频率和占空比分辨率
uint32_t  ledcSetup(uint8_t channel, uint32_t freq, uint8_t resolution_bits)

channel:LEDC通道号,取值为0-15,共16个通道
freq:待设置的PWM信号频率
resolution_bits:分辨率位数。该值决定占空比的范围。例如:
8:计数位数为8,则占空比设置值的范围为0-255。
10:计数位数为10,则占空比设置值的范围为0-1023。
返回值:返回PWM信号的频率

  • 将指定的LEDC通道绑定到指定的GPIO引脚上
void   ledcAttachPin(uint8_t pin, uint8_t channel)

pin:数字引脚编号,例如:2表示GPIO2
channel:LEDC通道号,取值为0-15,共16个通道
返回值:无

  • 设定指定通道输出的占空比
void   ledcWrite(uint8_t channel, uint32_t duty)

channel:LEDC通道号,取值为0-15,共16个通道
duty:要为所选 LEDC 引脚设置的占空比。该数值的范围由通道初始化设置函数ledcSetup()中的计数位数决定。
例如:计数位数为8,那么,占空比设置值的范围为0-255。
要输出占空比为50%的PWM信号,该参数应设置为128。
返回值:无

四、程序设计

实现一个呼吸灯

方法一

开发板自带LED灯所连接引脚为2引脚,原理图如下:
在这里插入图片描述
使用void analogWrite(uint8_t pin, int value)函数,完整代码如下:

#include "uart.h"
#include "Arduino.h"
#include "led.h"

#define LED_BLUE 2

void setup() 
{
  led_init(LED_BLUE) ;
  uart_init(0,115200);
}

void loop()
{
  // 实现渐亮效果
  for(int i = 0;i <= 255;i++) {
    // 设置亮度模拟值
    analogWrite(LED_BLUE, i);
    // 延时 10ms
    delay(10);
    }
  // 实现渐灭效果
  for(int i=255;i>=0;i--) {
    // 设置亮度模拟值
    analogWrite(LED_BLUE, i);
    // 延时 10ms
    delay(10);
    }
}

效果如下:

呼吸灯

方法二

要实现一个呼吸灯,先需要设置指定通道的PWM参数:频率、分辨率、占空比,然后将该通道映射到板载LED对应引脚,该引脚输出对应通道的PWM信号。

#include <Arduino.h>

#define LED 2

void pwm_init()
{
  //设置通道号为1,频率为1000HZ,分辨率为8位
  ledcSetup(1,1000,8);
  //将通道1产生的PWM波映射到LED引脚上
  ledcAttachPin(LED,1);
}

void led_breathing()
{
  for(int i = 0;i <= 255;i++)
  {
    ledcWrite(1,i);
    delay(10);
  }
  for(int i = 255;i >= 0;i--)
  {
    ledcWrite(1,i);
    delay(10);
  }
}
void setup() {
  //PWM初始化
  pwm_init();
}

void loop() {
  //实现呼吸灯
  led_breathing();
}

效果同上。

参考资料:正点原子esp32教程。

总结

以上就是今天要讲的内容,本文简单介绍了如何用esp32产生PWM波实现一个呼吸灯,之后会继续记录esp32其他方面的学习。

  • 16
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值