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

物联网之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 12void setup() {// 配置GPIO输出引脚pinMode(LED_PIN, OUTPUT);
}void loop() {// 实现渐亮效果for (int i = 0; i < 256; i++) {// 设置亮度模拟值analogWrite(LED_PIN, i);// 延时10msdelay(10);}// 实现渐灭效果for (int i = 255; i >= 0; i--) {// 设置亮度模拟值analogWrite(LED_PIN, i);// 延时10msdelay(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 12void setup() {// 设置通道ledcSetup(CHANNEL, FREQ, RESOLUTION);// 将通道与对应的引脚连接ledcAttachPin(LED, CHANNEL);
}void loop() {// 逐渐变亮for (int i = 0; i < pow(2, RESOLUTION); i++) {// 输出PWMledcWrite(CHANNEL, i);delay(5);}// 逐渐变暗for (int i = pow(2, RESOLUTION) - 1; i >= 0; i--) {// 输出PWMledcWrite(CHANNEL, i);delay(5);}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Oracle篇】全面理解优化器和SQL语句的解析步骤(含执行计划的详细分析和四种查看方式)(第二篇,总共七篇)
  • memmove函数的使用与模拟实现
  • 基于人工智能的智能语音助手
  • DMDPC单副本集群安装
  • HarmonyOS开发实战( Beta5.0)滑动视频自动播放案例实践
  • Caffenie配合Redis做两级缓存,Redis发布订阅实现缓存一致更新
  • 利士策分享,在延长退休背景下,应该如何合理的规划退休生活?
  • openstack之glance介绍
  • 数据库-基本操作(一)
  • c/c++面试100道
  • 单个 java 虚拟机 生产者消费者
  • 《OpenCV计算机视觉》—— 对图片进行旋转的两种方法
  • 3D云渲染农场为何怎么贵?主要消耗成本介绍
  • 什么是野指针和悬空指针?
  • NVIDIA驱动学习
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • cookie和session
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • mongodb--安装和初步使用教程
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Webpack 4x 之路 ( 四 )
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 关于使用markdown的方法(引自CSDN教程)
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 简单基于spring的redis配置(单机和集群模式)
  • 那些被忽略的 JavaScript 数组方法细节
  • 盘点那些不知名却常用的 Git 操作
  • 前端
  • 悄悄地说一个bug
  • 深度学习在携程攻略社区的应用
  • 我的业余项目总结
  • 我有几个粽子,和一个故事
  • 小程序 setData 学问多
  • 在weex里面使用chart图表
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • ###C语言程序设计-----C语言学习(6)#
  • #include<初见C语言之指针(5)>
  • (02)Hive SQL编译成MapReduce任务的过程
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三)elasticsearch 源码之启动流程分析
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • ***监测系统的构建(chkrootkit )
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .Net MVC + EF搭建学生管理系统
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C# 使用 SpanT 为字符串处理提升性能