干货分享:开启PWM调光之门,一起来做呼吸灯
PWM作为一种灵活且高效的信号调制手段,在电气设备的性能控制和调节中发挥着重要作用,常用于电机控制、灯光调光、音频信号生成、加热控制等应用。
本文将以合宙低功耗4G模组经典型号——Air780E为例,展示PWM(脉冲宽度调制)输出呼吸灯的实现方法,帮助大家深入理解如何在项目中应用PWM技术。

一、PWM概述
1.1 PWM介绍
脉冲宽度调制PWM,是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
PWM具有高效、控制精度高及实现简便等优点,但PWM信号可能产生高频噪声,需要滤波以减小干扰。另外,某些应用需要特定的硬件支持,如支持PWM输入的微控制器或电路。
要想使用PWM,还需先了解PWM的相关参数:
PWM的频率:
是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期),也就是说一秒钟PWM有多少个周期。单位:Hz。PWM的周期:
T=1/f 周期=1/频率例:如果频率为50Hz,T=1/50=0.02s,也就是说一个周期是20ms; 1s=1000ms,那么一秒钟就有50次PWM周期。
PWM的占空比:
是一个脉冲周期内,高电平的时间占整个周期时间的比例。单位:% (0%-100%)例:一个周期10ms,高电平占8ms,那么此占空比就是8/10=80%。
1.2 PWM原理
单片机的IO引脚输出的是数字信号,且只能输出1和0。那如果TTL电平中,高电平为5V,低电平为0V,但是我们想要输出不同的模拟电压,比如输出3.75V应该怎么操作?
此时要用到PWM,通过改变IO口输出方波的占空比,得到不同的模拟电压。
3.75/5=0.75,也就是高电平时间占整个周期的75%,即占空比为75%,可得到模拟电压3.75V。

注意上图中蓝线,代表着输出的模拟电压,占空比越大,则模拟电压也越大。
1.3 PWM通道说明
当前版本为:
《Air780E_GPIO_table_20240812.pdf》

由上方GPIO复用表可知:
Air780E的实际可用PWM通道有4个(0/1/2/4), 但每个都有3种配置。
PWM3/PWM5已经被底层使用,例如PWM1和PWM11都使用硬件通道1,只能选其中一个使用。启用PWM1就不能启用PWM11,调用PWM库的API时,填软件通道id。
相关注意事项:
软件通道10/11/12/14需要V1002以上的固件,即20221219之后编译的版本。
软件通道20/21/22需要V1016以上的固件,即20230330之后编译的版本。
上述映射是固定的,mcu.iomux也没有配置项, 而且已经枚举了全部可用PWM通道。
二、演示功能概述
接下来本文将用两个示例,演示如何使用Air780E的PWM功能:
PWM输出:
控制Air780E核心板pwm4通道的pwm输出,设置不同的占空比,让小灯有不同的亮度;
呼吸灯效果:
使用Air780E核心板的pwm1通道,外接发光二极管来查看呼吸灯效果。
三、准备硬件环境
3.1 开发板
本文使用Air780E核心板进行演示:

详见Air780E产品手册开发板使用说明:
https://docs.openluat.com/air780e/product/
写这篇文章时最新版本的使用说明为:
<<开发板Core_Air780E使用说明 V1.0.5.pdf>>
核心板使用过程中遇到任何问题,可以直接参考这份使用说明pdf文档。
3.2 PC电脑
Win7及其以上版本的Windows系统。
3.3 数据通信线
USB转Type-C数据线一根;
四、准备软件环境
4.1 下载调试工具
https://docs.openluat.com/Luatools/
4.2 源码及固件
最新固件下载:
https://docs.openluat.com/air780e/luatos/firmware/
固件详见core_V1112压缩包:
LuatOS-SoC_V1112_EC618_FULL.soc

五、PWM软硬件资料
5.1 API接口介绍
本教程使用API接口详见:
https://wiki.luatos.com/api/pwm.html?highlight=pwm

1)按住下载模式按键(boot 键)不放,同时再长按开机键开机,这时开发板会进入下载模式,Luatools下载进度条会开始跑,这时可以松开boot按键。直到工具提示下载完成。
2)如果未能成功进入下载模式,而是进入正常开机模式,这时可以按住 boot 键,再短按复位按键,让开发板重启,重新进入下载模式。
如何判断有没有进入下载模式:
可以通过PC端的设备管理器中虚拟出来的USB端口数量来判断。
正常开机模式:

下载模式:

六、代码示例介绍
6.1 PWM输出
本例使用Air780E核心板上的NetLed(网络状态灯),pwm通道id=4,打开pwm4通道的pwm输出,设置不同的占空比,小灯会有不同的亮度。
6.1.1 代码介绍

6.1.2 效果展示

6.2 呼吸灯效果
本例使用Air780E核心板的pwm1通道,外接发光二极管来查看呼吸灯效果:
呼吸灯效果就是小灯由亮到暗逐渐变化,很有节奏感地一起一伏,”感觉,好像人在呼吸“,我们可以通过不断调高占空比让小灯一点点亮起,再不断调低占空比让小灯一点点熄灭从而达到此效果。
6.2.1 硬件接线
GPIO24 --------发光二极管正极
GND -----------发光二极管负极

6.2.2 代码介绍

6.2.3 效果展示
外接发光二极管,效果如下图所示:

也可用Air780E核心板上的NetLed(网络状态灯)来观察呼吸灯效果,但demo里的PWM通道要改成相应的id,可查看上文的PWM通道说明。
我们通过示波器查看PWM的输出波形,可以看到占空比在10%-90%之间变化。

七、常见问题
1. 如何验证所产生的PWM信号?
可以使用示波器检测PWM输出,查看频率、占空比和波形的完整性。确保波形按照设计参数正常工作,必要时进行调整。
2. PWM的信号的频率如何选择?
频率的选择通常取决于具体应用,根据自己的项目需要来选择:
电机控制:常用频率为1kHz到20kHz,以确保足够的反应速度和控制精度。
LED调光:频率通常在1kHz以上,以避免人眼感知到闪烁。
音频信号:频率设置应高于音频信号的最高频率(例如,至少为20kHz)。
3. 什么是占空比,如何计算PWM的占空比?
占空比即是一个脉冲周期内,高电平的时间占整个周期。
例如:
如果PWM信号的高电平时间为2ms,周期为10ms。
则:占空比 = (2 / 10) × 100 = 20%
干货分享:开启PWM调光之门,一起来做呼吸灯的更多相关文章
- STM8S PWM 应用 呼吸灯
//主功能接受:使用MCU STM8S105C6 的PWM通道2 PC2 来做呼吸灯 已经验证OK,呵 //呵,这个PWM设置刚開始用还是有点麻烦,由于是自己摸索.花点时间.还是解决了 . //所用子 ...
- 【Bugly干货分享】一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言 好吧,说是“粒子引擎”还是大言不 ...
- [问题解决]不使用PWM调速系统,彻底解决一个L298N带动两个电机却转速不同的问题
问题描述:由单片机的VCC引脚供电,使用L298N控制两个电机,发现左右两个轮子的转速老是不一样,更多的情况是左轮转速高(左轮电机接OUT1和OUT2),右轮转速低(右轮电机接OUT3和OUT4)甚至 ...
- ref:【干货分享】PHP漏洞挖掘——进阶篇
ref:http://blog.nsfocus.net/php-vulnerability-mining/ [干货分享]PHP漏洞挖掘——进阶篇 王陶然 从常见的PHP风险点告诉你如何进行PH ...
- 最强最全干货分享:Android开发书籍、教程、工具等
最全干货分享,本文收集整理了Android开发所需的书籍.教程.工具.资讯和周刊各种资源,它们能让你在Android开发之旅的各个阶段都受益. 入门<Learning Android(中文版)& ...
- 干货分享:SQLSERVER使用裸设备
干货分享:SQLSERVER使用裸设备 这篇文章也适合ORACLE DBA和MYSQL DBA 阅读 裸设备适用于Linux和Windows 在ORACLE和MYSQL里也是支持裸设备的!! 介绍 大 ...
- iOS - GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD - ②)
距上一篇博客"APP引导页的高度集成 - DHGuidePageHUD - ①"的发布有一段时间了, 后来又在SDK中补充了一些新的内容进去但是一直没来得及跟大家分享, 今天来跟大 ...
- iOS - GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD - ①)
好长时间没更新博客, 是时候来一波干货分享了;APP引导页话不多说每一个APP都会用到,分量不重但是不可缺少,不论是APP的首次安装还是版本的更新,首先展现给用户眼前的也就只有它了吧,当然这里讲的不是 ...
- 【干货分享】Google 的设计准则,素材和资源
在谷歌,他们说, “专注于用户,所有其它的就会水到渠成 ”.他们遵循设计原则,寻求建立让用户惊喜的用户体验.谷歌一直挑战自己,为他们的用户创造一种视觉语言,综合优秀设计的经典原则和创新.谷歌设计规范是 ...
- 【干货分享】Node.js 中文资料导航
这篇文章与大家分享一批高质量的的 Node.js 中文资料.Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台, 用来方便地搭建快速的, 易于扩展的网络应用 Node ...
随机推荐
- Linux samba的配置和使用
samba是什么 samba是什么?能干什么?什么场合需要用到它? samba 是基于SMB协议(ServerMessage Block,信息服务块)的开源软件,samba也可以是SMB协议的商标.S ...
- SQL中解决i+1 & values中插入变量
基于JDBC环境下使用mysql插入数据的一些小问题 下方代码用于实现 批量向数据库中插入数据 一般为"垃圾"数据 代码例子实现i+1的效果 i=1 i+1=2 for (int ...
- .NET 开源实时监控系统 - WatchDog
前言 在平时的开发中随着我们系统应用不断地迭代变的复杂,对应用的实时监控变得越来越重要.实时监控不仅可以帮助我们快速定位问题,还能在出现问题时及时采取措施,减少业务中断的时间. 本文将介绍一个名为Wa ...
- 【测试平台开发】——01后端web开发框架Flask
官方中文地址:https://flask.net.cn/ 官方英文地址:https://flask.palletsprojects.com/en/2.1.x/ github地址:https://git ...
- Comfyui 基础教程(一) —— 本地安装部署
前言 前面一篇文章已经介绍过,ComfyUI 和 Stable Diffusion 的关系.不清楚的朋友,看传送门 Stable Diffusion 小白的入坑铺垫 . WebUI 以及 ComfyU ...
- R-Adapter:零样本模型微调新突破,提升鲁棒性与泛化能力 | ECCV 2024
大规模图像-文本预训练模型实现了零样本分类,并在不同数据分布下提供了一致的准确性.然而,这些模型在下游任务中通常需要微调优化,这会降低对于超出分布范围的数据的泛化能力,并需要大量的计算资源.论文提出新 ...
- div中多行内容垂直居中显示
div中多行内容垂直居中显示 一.css 样式 .wrap { height: 200px; width: 200px; border: 1px solid #232323; display: fle ...
- C# 泛型对象和DataTable之间的相互转换
应用场景 实际开发场景下会经常出现DataTable和List对象需要相互转换的时候,通过方法提取避免重复造轮子 List转换成DataTable 基本思路: 向DataTable里面添加新的数据内容 ...
- ASP.NET Core – TagHelper
前言 以前写的 Asp.net core 学习笔记之 Tag Helper, 这篇是整理版. 参考 Docs – Author Tag Helpers in ASP.NET Core Creating ...
- @vue/cli eslint插件使用指南
使用步骤 使用 npm 安装 @vue/cli-service 版本对应的 @vue/cli-plugin-eslint 例如:"@vue/cli-service": " ...