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);
}
### 解决 UniApp 中 `uni.getUserProfile` 方法编译至抖音小程序时报错的问题 在处理 UniApp 应用程序向抖音小程序迁移的过程中,可能会遇到一些特定于平台的方法不兼容问题。对于 `uni.getUserProfile` 报错的情况,这通常是因为不同平台对接口的支持程度存在差异。 抖音小程序可能并未完全支持某些微信小程序 API 或者实现方式有所不同。为了确保代码能够在目标平台上顺利执行,建议采取以下措施: #### 1. 平台适配检测 通过条件编译标签来区分不同的运行环境,并针对各个平台编写相应的逻辑分支[^1]。 ```javascript if (process.env.VUE_APP_PLATFORM === 'douyin') { // 针对抖音小程序的具体操作 } else { // 对其他平台的操作保持不变 } ``` #### 2. 替代方案设计 如果发现 `getUserProfile` 不被抖⾳小程序所⽀持,则可以考虑寻找替代⽅法获取⽤户信息。例如,可以直接调用微信登录接口获得 openid 和 session_key 后再请求服务器端交换完整的用户资料[^2]。 #### 3. 更新依赖库版本 有时官方会修复已知 bug 或增加新功能,因此确认使用的框架以及插件都是最新稳定版也很重要。定期查看更新日志并升级项目中的相关组件可以帮助减少此类跨平台移植过程中可能出现的问题。 #### 4. 错误捕获机制完善 无论在哪种情况下都应加入异常处理语句以防止未预见错误影响整个应用流程。利用 try-catch 结构包裹可能存在风险的部分代码段,在发生异常时给出友好提示或采取补救措施。 ```javascript try { const res = await uni.getUserProfile({ desc: "用于完善会员资料" }); console.log(res); } catch(e){ console.error('Failed to get user profile:', e.errMsg || e.message); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值