ESP32之LEDC(PWM信号的输出)

本文介绍了PWM信号的基本概念,重点讲解了ESP32中的LEDC(PWM控制器)使用方法,包括频率、分辨率、绑定GPIO和编写输出PWM信号以及LED呼吸灯的示例程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、PWM信号简介

  • PWM:脉冲宽度调制,简称脉宽调制
  • 频率(f):一秒钟PWM有多少个周期(单位Hz)
  • 周期(T):一个周期的时间
  • 占空比(duty):在一个脉冲周期内,高电平的时间与整个周期时间的比例
  • 脉宽时间:一个周期内高电平时间
  • 占空比越大,输出的有效电压越高。

二、ESP32中的LEDC(PWM控制器)

  • LEDC:指LED PWM控制器,即PWM信号产生器。
  • LED_PWM有16路通道(0~15)
  • 8路高速通道(0~7),由80MHz时钟驱动
  • 8路低速通道(8~15),由8MHz时钟驱动

 三、产生PWM信号的流程

  1. 建立LEDC通道
  2. 将GPIO与LEDC通道绑定
  3. Write(设置指定通道的占空比)、WriteTone(输出指定频率的占空比)、WriteNote
  4. 解除GPIO与LEDC通道的关联

3.1 LEDC频率与分辨率的关系

3.2 LEDC频率与最大分辨率表

 3.3 使用LEDC输出PWM的示例程序

#include <Arduino.h>

int pwmA = 12;
int pwmB = 13;
int pwmC = 14;

void setup()
{
    // 建立LEDC通道
    ledcSetup(0, 30000, 8); // pwm频道, 频率, 精度
    ledcSetup(1, 30000, 8); // pwm频道, 频率, 精度
    ledcSetup(2, 30000, 8); // pwm频道, 频率, 精度

    // 将GPIO与LEDC通道绑定
    ledcAttachPin(pwmA, 0);
    ledcAttachPin(pwmB, 1);
    ledcAttachPin(pwmC, 2);

    // 输出PWM
    ledcWrite(0, 255);
    ledcWrite(1, 255);
    ledcWrite(2, 255);
}

void loop()
{
}

四、示例程序:ESP32板载LED呼吸灯

#include <Arduino.h>

int led_pin = 2;
int ch0 = 0;
int step = 0; // 占空比步长
int duty = 0;
int count = 0;
int breatheTime = 2; // 呼吸灯的周期,单位s

void setup()
{
  // 建立LEDC通道
  ledcSetup(ch0, 1000, 8); // pwm频道, 频率, 精度

  // 将GPIO与LEDC通道绑定
  ledcAttachPin(led_pin, ch0);
  count = pow(2, 8);

  step = 2 * count / (50 * breatheTime);
}

void loop()
{
  ledcWrite(ch0, duty);
  duty += step;
  if (duty > count)
  {
    duty = count;
    step = -step;
  }
  else if (duty < 0)
  {
    duty = 0;
    step = -step;
  }
  delay(20);
}
### ESP32-C3 输出 PWM 信号的方法 ESP32-C3 支持通过乐鑫 SDK 提供的 `ledc` 库来生成 PWM 波形。该库提供了灵活的方式设置频率、占空比以及其他参数。 #### 配置 LEDC 模块 LEDC (LED Control) 是一种硬件模块,可以用于控制多个通道上的 PWM 信号。为了初始化并配置此功能,需调用一系列 API 函数[^1]: ```cpp #include "driver/ledc.h" // 定义使用的 GPIO 及其他常量 #define LEDC_CHANNEL LEDC_CHANNEL_0 // 使用通道 0 #define LEDC_TIMER LEDC_TIMER_0 // 使用定时器 0 #define LEDC_RESOLUTION 8 // 设置分辨率为 8 bit #define GPIO_PWM 2 // 连接至 GPIO2 的 PWM 输出引脚 void setup_pwm() { // 初始化 LEDC 模块 ledc_timer_config_t timer_conf = { .speed_mode = LEDC_LOW_SPEED_MODE, // 工作模式 .duty_resolution = LEDC_RESOLUTION, // 分辨率 .timer_num = LEDC_TIMER, // 定时器编号 .freq_hz = 5000, // 设定频率为 5kHz .clk_cfg = LEDC_AUTO_CLK // 自动选择时钟源 }; // 将上述配置应用到指定定时器上 ledc_timer_config(&timer_conf); // 接下来配置具体哪个通道要输出 PWM 并绑定到哪一个GPIO口上去 ledc_channel_config_t channel_conf = { .gpio_num = GPIO_PWM, .speed_mode = LEDC_LOW_SPEED_MODE, .channel = LEDC_CHANNEL, .intr_type = LEDC_INTR_DISABLE, .timer_sel = LEDC_TIMER, .duty = 0, // 初始占空比设为零 .hpoint = 0 }; // 执行实际的通道配置操作 ledc_channel_config(&channel_conf); } ``` #### 控制 PWM 占空比 一旦完成了基本设定之后就可以改变输出波形的具体特性比如调整亮度或速度等。这可以通过修改占空比实现,在这里提供了一个简单的函数用来更新当前正在运行中的PWM周期内的高电平时间比例: ```cpp void set_pwm_duty(uint32_t duty) { // 更新指定通道下的占空比数值 ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL, duty); // 确认更改立即生效 ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL); } ``` 以上就是关于如何在 ESP32-C3 上创建和管理 PWM 信号的一个简单介绍以及相应的 C++ 实现例子。需要注意的是具体的引脚定义可能依据个人项目需求有所不同,请参照官方文档确认适合自己的连接方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值