当前位置: 首页 > article >正文

物联网之PWM呼吸灯、脉冲、LEDC

MENU

  • 前言
  • 原理
  • 硬件电路设计
  • 软件程序设计
    • analogWrite()函数实现呼吸灯效果
    • LEDC输出PWM信号


前言

学习制作呼吸灯,通过LED灯的亮度变化来验证PWM不同电压的输出。呼吸灯是指灯光在单片机的控制之下完成由亮到暗的逐渐变化,感觉好像是人在呼吸。


原理

脉冲宽度调制(PWM),是英文Pulse Width Modulation的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量、通信到功率控制与变换的许多领域中。
PWM通过调节输出不同频率(频率是指1秒钟内信号从高电平到低电平再回到高电平的次数,一个周期)、占空比(一个周期内高电平出现时间占总时间比例)的方波。以实现固定频率或平均电压输出。频率固定,改变占空比可改变输出电压。

PWM


硬件电路设计

材料名称数量
直插式LED1
1kΩ电阻1
杜邦线(跳线)若干
面包板1

LED的正极接开发板的D12引脚,并串联一个电阻,负极接GND。

接线

一定要接电阻,不然会由于电流过大,烧坏LED。


软件程序设计

analogWrite()函数实现呼吸灯效果

使用Arduino自带的analogWrite(pin, value)函数输出PWM。
pin是要写入的Arduino引脚。允许的数据类型为int。
value是占空比,介于0(始终关闭)和255(始终开启)之间。允许的数据类型为int。

// 宏定义GPIO输出引脚
#define LED_PIN 12

void setup() {
  // 配置GPIO输出引脚
  pinMode(LED_PIN, OUTPUT);
}

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

LEDC输出PWM信号

使用ESP32的LEDC外设,在 ESP32 上有一个 LEDC 外设模块专用于输出 PWM 波形。
LED PWM控制器可以生成16路通道(0~15)波形,波形的周期和占空比可配置。分为高低速两组,高速通道(0~7)由80MHz时钟驱动,低速通道(8~15)由1MHz时钟驱动。另外,每路LED PWM支持自动步进式地增加或减少占空比,可以用于LED RGB彩色梯度发生器。
作为刚入门的学习者,上面这段概念不理解也不影响后续的学习,需要了解的是LEDC的控制函数以及PWM信号的产生流程。
打开esp32_hal_led.h文件后,可以看到LEDC的所有控制函数。

// 设置LEDC通道对应的频率和计数位数(占空比分辨率),返回最终频率
// 分辨率的意思就是把一个周期分成2的resolution_bits份。
uint32_t ledcSetup(uint8_t channel, uint32_t freq, uint8_t resolution_bits);

// 指定通道输出一定占空比波形
void ledcWrite(uint8_t channel, uint32_t duty);

// 类似于arduino的tone ,当外接无源蜂鸣器的时候可以发出某个声音(根据频率不同而不同)
uint32_t ledcWriteTone(uint8_t channel, uint32_t freq);

//  该方法是上面方法的进一步封装,可以直接输出指定调式和音阶声音的信号
uint32_t ledcWriteNote(uint8_t channel, note_t note, uint8_t octave);

// 返回指定通道占空比的值
uint32_t ledcRead(uint8_t channel);

// 返回指定通道当前频率(如果当前占空比为0则该方法返回0)
uint32_t ledcReadFreq(uint8_t channel);

// 将LEDC通道绑定到指定IO口上以实现输出
void ledcAttachPin(uint8_t pin, uint8_t channel);

// 解除IO口的LEDC功能
void ledcDetachPin(uint8_t pin);

使用LEDC外设的时候需要遵循以下步骤。
1、使用ledcSetup()函数建立LEDC通道;
2、通过ledcAttachPin()将GPIO口与LEDC通道关联;
3、通过ledcWrite()、ledcWriteTone()、ledcWriteNote()设置频率、设置蜂鸣器音调等等;
4、通过ledcDetachPin()解除GPIO口与LEDC通道的关联。
实现呼吸灯效果的代码。

// 频率
#define FREQ 2000
// 通道
#define CHANNEL 0
// 分辨率
#define RESOLUTION 8
// LED引脚
#define LED 12


void setup() {
  // 设置通道
  ledcSetup(CHANNEL, FREQ, RESOLUTION);
  // 将通道与对应的引脚连接
  ledcAttachPin(LED, CHANNEL);
}

void loop() {
  // 逐渐变亮
  for (int i = 0; i < pow(2, RESOLUTION); i++) {
    // 输出PWM
    ledcWrite(CHANNEL, i);
    delay(5);
  }

  // 逐渐变暗
  for (int i = pow(2, RESOLUTION) - 1; i >= 0; i--) {
    // 输出PWM
    ledcWrite(CHANNEL, i);
    delay(5);
  }
}

http://www.kler.cn/a/301679.html

相关文章:

  • java 读取 有时需要sc.nextLine();读取换行符 有时不需要sc.nextLine();读取换行符 详解
  • Vue中的导航守卫有哪三种?分别有什么作用
  • Spring Boot框架:电商系统的技术革新
  • react 中 useCallback Hook 作用
  • springboot实现简单的数据查询接口(无实体类)
  • 使用 Redis 作为消息队列 - Pub/Sub, List, SortedSet
  • 【Linux】 LTG:移动硬盘部署Ubuntu24.04
  • vue 父组件给子组件传值
  • 基于深度学习的创新设计的生成AI
  • 哪一种反爬虫策略更加人性化,不让用户感知到
  • 02.06、回文链表
  • 离散制造与流程制造的差异分析
  • 熟悉Kafka组成模块、Kafka消息提交的方式及优缺点
  • 在js中观察者模式讲解
  • cross-plateform 跨平台应用程序-02-有哪些主流技术栈?
  • 123.rk3399 uboot(2017.09) 源码分析3(2024-09-12)
  • CSS中的位置定位总结
  • 《2024中国数据要素产业图谱2.0版》重磅发布
  • Java将Word文档转换为PDF文件常用方法总结
  • Android 系统下:普通应用无缝安装,Launcher 应用安装遭遇罕见障碍解析
  • route-forward springboot实现路由转发程序
  • 【C++开发中XML 文件的妙用】
  • Django+Vue协同过滤算法图书推荐系统的设计与实现
  • 【数字集成电路与系统设计】Chisel/Scala简介与Verilog介绍
  • 【分支-快速排序】
  • Python中如何实现列表的排序