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

news2024/9/21 19:55:01

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.coloradmin.cn/o/2113810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity小技巧】URP管线遮挡高亮效果

前言 在URP渲染管线环境下实现物体遮挡高亮显示效果&#xff0c;效果如下&#xff1a;Unity URP遮挡高亮 实现步骤 创建层级&#xff0c;为需要显示高亮效果的物体添加层级&#xff0c;比如Player 创建一个材质球&#xff0c;也就是高亮效果显示的材质球找到Universal Render…

固态硬盘装系统有必要分区吗?

前言 现在的新电脑有哪一台是不使用固态硬盘的呢&#xff1f;这个好像很少很少了…… 有个朋友买了一台新的笔记本电脑&#xff0c;开机之后&#xff0c;电脑只有一个分区&#xff08;系统C盘500GB&#xff09;。这时候她想要给笔记本分区…… 这个真的有必要分区吗&#xf…

springboot流浪天使乐园管理系统

基于springbootvue实现的流浪天使乐园管理系统&#xff08;源码L文ppt&#xff09;4-039 第4章 系统设计 4.1 总体功能设计 一般个人用户和管理者都需要登录才能进入流浪天使乐园管理系统&#xff0c;使用者登录时会在后台判断使用的权限类型&#xff0c;包括一般使用者…

【VUE】Vue 组件详解

&#x1f4dd;个人主页&#x1f339;&#xff1a;个人主页 ⏩收录专栏⏪&#xff1a;VUE &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339;&#xff0c;让我们共同进步&#xff01; 文章目录 一、Vue 组件的基础概念1.1 什么是组件&#xff1f;1.2 组件的作…

Unity教程(十五)敌人战斗状态的实现

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

u盘显示需要格式化才能用预警下的数据拯救恢复指南

U盘困境&#xff1a;需要格式化的紧急应对 在数字信息爆炸的时代&#xff0c;U盘作为便携的数据存储介质&#xff0c;承载着我们工作、学习乃至生活中的大量重要资料。然而&#xff0c;当U盘突然弹出“需要格式化才能用”的提示时&#xff0c;这份便捷瞬间转化为焦虑与不安。这…

MiniCPM-V: A GPT-4V Level MLLM on Your Phone

MiniCPM-V: A GPT-4V Level MLLM on Your Phone 研究背景和动机 现有的MLLM通常需要大量的参数和计算资源&#xff0c;限制了其在实际应用中的范围。大部分MLLM需要部署在高性能云服务器上&#xff0c;这种高成本和高能耗的特点&#xff0c;阻碍了其在移动设备、离线和隐私保…

通信工程学习:什么是AM标准调幅

AM标准调幅 AM标准调幅&#xff0c;即Amplitude Modulation&#xff08;振幅调制&#xff09;&#xff0c;是一种在电子通信中广泛使用的调制方法&#xff0c;特别是在无线电载波传输信息方面。以下是关于AM标准调幅的详细解释&#xff1a; 一、AM标准调幅的定义与原理 AM标准…

机器视觉硬件选型根据某项目相机镜头

一 项目总需求 1、大视野检测需求: (1)大视野&#xff1a; ①产品尺寸15.6寸屏幕&#xff0c;产品大小&#xff1a;350mm x 225mm&#xff1b; ②产品料盘尺寸大小&#xff1a;565mm x 425mm; ③工作距离&#xff1a;880mm&#xff1b;检测精度&#xff1a;500μm&#xff…

如何使用 ef core 的 code first(fluent api)模式实现自定义类型转换器?

如何使用 ef core 的 code first 模式实现自定义类型转换器 前言 1. 项目结构2. 实现步骤2.1 定义转换器2.1.1 DateTime 转换器2.1.2 JsonDocument 转换器 2.2 创建实体类并配置数据结构类型2.3 定义 Utility 工具类2.4 配置 DbContext2.4.1 使用 EF Core 配置 DbContext 的两种…

浅谈人工智能之基于AutoGen Studio+Ollama本地大模型构建AI Agent

浅谈人工智能之基于AutoGen Studio+Ollama本地大模型构建AI Agent 摘要 随着人工智能技术的飞速发展,大型语言模型已成为推动创新应用的关键力量。然而,云服务的使用虽然便捷,但面临着数据安全、延迟及成本等挑战。为解决这些问题,越来越多的开发者选择在本地部署大模型。…

python学习11-Pytorch张量与数据处理1

ndarray 首先&#xff0c;我们介绍n维数组&#xff0c;也称为张量&#xff08;tensor&#xff09;。 使用过Python中NumPy计算包的读者会对本部分很熟悉。 无论使用哪个深度学习框架&#xff0c;它的张量类&#xff08;在MXNet中为ndarray&#xff0c; 在PyTorch和TensorFlow中…

数据集 CrowdPose 多人姿态估计 深度学习 >> DataBall

数据集 CrowdPose 多人姿态估计 深度学习 CrowdPose 数据集 这是一个用于探讨在拥挤场景中的多人姿态估计的图像数据集。该数据集包括 2 万张图像和标注有 14 个关键点的 8 万个人体姿势&#xff0c;其中测试集包括 8,000 张图像。 article{li2018crowdpose, title{CrowdPose…

mysql-PXC实现高可用

mysql8.0使用PXC实现高可用 什么是 PXC PXC 是一套 MySQL 高可用集群解决方案&#xff0c;与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题&#xff0c;基本上可以达到实时同步。而且节点与节点之间&#xff0c;他们相互的关系是…

数据预处理与协同过滤推荐算法——从数据清洗到个性化电影推荐

推荐系统在现代应用中占据了重要地位&#xff0c;尤其在电影、音乐等个性化内容推荐中广泛使用。本文将介绍如何使用数据预处理、特征工程以及多种推荐算法&#xff08;包括协同过滤、基于内容的推荐、混合推荐等&#xff09;来实现电影推荐系统。通过Pandas、Scikit-learn、Te…

研1日记5

x torch.tensor(x),numpy 转tensor 三维矩阵相加 screen -S pid 进入之前创建好的screen transpose()只能一次操作两个维度&#xff1b;permute()可以一次操作多维数据&#xff0c;且必须传入所有维度数&#xff0c; transpose()中的dim没有数的大小区分&#xff1b;permut…

Redis 分布式锁:线程安全在分布式环境中的解决方案

Redis 分布式锁&#xff1a;线程安全在分布式环境中的解决方案 一 . 分布式锁二 . 分布式锁的实现策略2.1 引入 setnx2.2 引入过期时间2.3 引入校验 ID2.4 引入 lua 脚本2.5 引入看门狗2.6 引入 redlock 算法 Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章给…

Flutter 中的低功耗蓝牙概述

随着智能设备数量的增加&#xff0c;控制这些设备的需求也在增加。对于多种使用情况&#xff0c;期望设备在需要进行控制的同时连接到互联网会受到很大限制&#xff0c;因此是不可行的。在这些情况下&#xff0c;使用低功耗蓝牙&#xff08;也称为 Bluetooth LE 或 BLE&#xf…

[yolov5] --- yolov5入门实战「土堆视频」

1 项目介绍及环境配置 下载yolov5 tags 5.0源码&#xff0c;https://github.com/ultralytics/yolov5/tree/v5.0&#xff0c;解压 Pycharm 中创建conda虚拟环境 激活conda虚拟环境 根据作者提供的requirements.txt文件&#xff0c;pip install -r requirements.txt 如果作者没有…

【Spring Boot】 SpringBoot自动装配-Condition

目录 一、前言二、 定义2.1 Conditional2.2 Condition2.2.1 ConditionContext 三、 使用说明3.1 创建项目3.1.1 导入依赖3.1.2 添加配置信息3.1.3 创建User类3.1.4 创建条件实现类3.1.5 修改启动类 3.2 测试3.2.1 当user.enablefalse3.2.2 当user.enabletrue 3.3 小结 四、改进…