PWM输出原理详解:呼吸灯与电机调速的实现方式
一、前言在嵌入式开发里定时器 PWM 绝对是日常使用频率最高的外设功能之一。小到开发板上的 LED 呼吸效果大到直流电机调速、舵机角度控制、简易 DCDC 调压凡是需要连续可调模拟量控制的场景基本都会用到 PWM。很多刚接触 STM32 的朋友会形成一个误区认为 PWM 能够直接输出连续变化的模拟电压。实际并不是这样。PWM 从头到尾都只是高低电平交替的数字方波不存在中间电压。我们看到 LED 明暗变化、电机转速快慢本质是依靠负载特性、人眼视觉暂留或者机械惯性对高频方波做 “平均等效” 得到的效果。本文从 PWM 底层原理、关键参数、定时器硬件运行逻辑入手结合呼吸灯、直流电机调速两个最经典工程案例讲清楚实际开发该如何配置、如何避坑最后附上可直接编译运行的 STM32 示例代码。二、PWM 核心基础原理2.1 什么是 PWMPWM 全称脉冲宽度调制Pulse Width Modulation。核心规则信号周期保持不变只调整一个周期内高电平持续的时间脉宽。普通 GPIO 只有全开、全关两种状态只能控制设备启动或者停止。而 PWM 依靠高速反复通断利用平均效应实现无级调节这也是它在控制领域被广泛使用的根本原因。2.2 PWM 关键工程参数所有单片机定时器配置 PWM都围绕下面几个参数展开弄懂之后不管换 STM32 哪个型号配置思路不会变。周期一次完整高电平 低电平的总时长。PWM 标准设计思路周期固定只修改脉宽。频率周期的倒数代表每秒产生多少组脉冲波形。频率选择没有统一标准需要结合负载特性决定。脉宽单个周期中高电平持续时间是我们程序中动态调整的对象。占空比高电平时长 / 完整周期时长通常使用百分比表示。2.3 等效平均电压负载最终响应的是一个周期内的平均电压公式举个例子3.3V 单片机系统占空比 0%平均电压 0VLED 熄灭、电机停转占空比 50%平均电压 1.65V占空比 100%持续高电平满功率输出。依靠连续修改占空比就能等效实现 0~3.3V 电压连续调节。三、STM32 定时器生成 PWM 硬件机制3.1 定时器计数逻辑STM32 硬件 PWM 依托通用定时器 / 高级定时器实现。定时器从 0 开始向上不断计数不断和捕获比较寄存器 CCR 做对比CNT计数值 CCR输出指定电平CNT计数值 ≥ CCR电平翻转CNT 计数达到 ARR 自动重装载值计数器清零重新开始新一轮计数循环产生稳定方波。3.2 两个核心寄存器分工ARR自动重装载寄存器决定 PWM 周期、输出频率工程上配置完成后一般固定不变CCR捕获比较寄存器决定脉宽、占空比程序运行时动态修改 CCR 数值就能实时调节输出效果。工程经验固定 ARR 调整 CCR不要运行过程中频繁修改 ARR波形容易紊乱。3.3 PWM 模式 1 与模式 2 区别向上计数PWM 模式 1CNT CCR 时输出有效电平高电平常用在呼吸灯、电机调速PWM 模式 2CNT CCR 时输出无效电平低电平适合需要反向逻辑的场景。日常开发绝大多数场景直接选用 PWM 模式 1 即可。四、实战场景一呼吸灯原理与实现逻辑4.1 呼吸灯实现本质单纯调用 HAL_Delay 切换 IO 电平得到的只是闪烁不是呼吸效果。 呼吸灯平滑明暗渐变核心思路持续缓慢修改 PWM 对应的 CCR 数值连续改变占空比LED 平均电压平滑变化肉眼看到明暗渐变。执行流程CCR 数值从小到大增加 → 占空比上升 → LED 由暗逐渐变亮CCR 到达最大值后数值逐步减小 → 占空比下降 → LED 由亮慢慢变暗循环往复形成持续呼吸效果。4.2 实际配置要点LED 属于纯电阻负载没有惯性频率太低会肉眼看到明显频闪。 推荐 PWM 频率区间1kHz ~ 5kHz。同时调整 CCR 的步长不能太大步长过大会出现亮度阶梯跳动步长过小明暗变化速度太慢。4.3 硬件注意事项单片机 IO 口驱动电流有限如果是大功率 LED不能直接用 IO 驱动需要增加三极管或者 MOS 管扩流。普通开发板板载小 LED 可以直接驱动。五、实战场景二直流电机调速原理与实现逻辑5.1 调速底层逻辑直流电机转速和两端平均电压正相关和 LED 调光原理相通。 电机属于机械惯性负载转子惯性相当于天然的低通滤波器对方波有平滑作用对波形的敏感程度比 LED 低很多。5.2 PWM 频率选型重点电机频率不能直接照搬 LED 参数频率直接影响运行噪音200Hz ~ 1kHz低速扭矩充足但运行时会产生刺耳啸叫8kHz ~ 20kHz超出人耳听觉范围运行安静是小型直流电机首选区间。注意频率也不要无限制拉高过高的频率会增大定时器中断、MOS 管开关损耗。5.3 开发常见问题低速抖动无法启动占空比太低平均电压不足以克服静摩擦力代码中需要设置最小启动占空比启停冲击过大不要直接从 0% 跳转到 100% 占空比需要做软启动缓慢增加占空比单片机 IO 不能直接驱动电机电机启动电流大必须搭配 DRV8833、L298N 这类驱动芯片。六、呼吸灯 VS 直流电机调速对比汇总表格对比项LED 呼吸灯直流电机调速推荐 PWM 频率1kHz~5kHz8kHz~20kHz负载类型纯电阻负载无惯性机械惯性负载自带滤波效果控制逻辑循环增减占空比往复变化稳态固定占空比按需变速设计目标调节等效电压控制亮度调节等效电压控制转速驱动需求小功率 LED 可直驱必须使用专用电机驱动芯片七、通用工程避坑总结优先使用定时器硬件 PWM。软件延时模拟 PWM 极度占用 CPU一旦系统中存在中断波形很容易失真只适合临时验证区分有效电平硬件电路加上下拉电阻时注意 PWM 极性配置感性负载电机需要增加续流二极管防止反向电动势击穿芯片占空比不要频繁突变大功率负载容易产生冲击电流调试阶段优先使用示波器观测 PWM 波形确认频率、占空比和预期一致再接入负载。八、STM32 HAL 库 呼吸灯完整示例代码平台说明STM32F103C8T6TIM1_CH1 (PA8) 输出 PWM开发板 LED 外接 PA8 配置定时器 72MHz 时钟预分频 PSC71ARR999PWM 频率 1kHz 编译环境STM32CubeMX 生成工程HAL 库。运行#include main.h #include tim.h // CCR最大值对应ARR数值 #define PWM_MAX_CCR 999 // 亮度变化步长 #define STEP 5 // 延时参数控制呼吸快慢 #define BREATH_DELAY 10 // 全局变量 uint16_t ccr_val 0; uint8_t dir 1; // 1递增0递减 int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM1_Init(); // 启动TIM1 CH1 PWM输出 HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1); while (1) { if(dir 1) { ccr_val STEP; if(ccr_val PWM_MAX_CCR) { dir 0; } } else { ccr_val - STEP; if(ccr_val 0) { dir 1; } } // 更新比较值实时改变占空比 __HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, ccr_val); HAL_Delay(BREATH_DELAY); } }关键配置补充CubeMX 参数TIM1 时钟72MHzPrescaler (PSC)71 → 定时器计数时钟 72M/(711)1MHzCounter Period(ARR)999PWM 频率 1M/(9991) 1000HzPWM 模式PWM Generation CH1 → PWM 模式 1代码扩展改造思路如果想要移植到电机调速调整 PSC、ARR 参数把 PWM 频率提升至 10kHz 左右删除来回增减的 dir 逻辑外部直接固定 / 修改 ccr_val 即可稳定控制转速额外增加 GPIO 控制电机正反转。九、PWM的输出与作用1. 如果要实现PWM信号输出如何输出呢可以直接通过芯片内部模块输出PWM信号前提是这个I/O口要有集成的pwm控制器只需要通过对应的寄存器即可这种自带有PWM输出的功能模块在程序设计更简便同时数据更精确。但是如果IC内部没有PWM功能模块或者要求不是很高的话可以利用I/O口设置一些参数来输出PWM信号因为PWM 信号其实就是一高一低的一系列电平组合在一起。具体方法是给I/O加一个定时器对于你要求输出的 PWM信号频率与你的定时器一致用定时器中断来计数但是这种方法一般不采用除非对于精度、频率等要求不是很高可以这样实现。2. PWM信号应用PWM信号把模拟信号转化为数字电路所需要的编码现在基本是采用数字电路因此在很多场合都采用PWM信号。 我们经常见到的就是交流调光电路也可以说是无级调速高电平占多一点也就是占空比大一点亮度就亮一点占空比小一点亮度就没有那么亮前提是PWM的频率要大于我们人眼识别频率要不然会出现闪烁现象。 除了在调光电路应用还有在直流斩波电路、蜂鸣器驱动、电机驱动、逆变电路、加湿机雾化量等都会有应用。十、全文总结PWM 的本质就是固定周期、可变脉宽的数字方波依靠占空比调整得到等效平均电压。呼吸灯和电机调速底层原理完全一致只是频率选择、负载特性、控制逻辑有明显区别。实际项目开发不要停留在直接复制代码的层面搞懂 ARR、CCR、频率、占空比之间的换算关系遇到灯光、电机、电源类 PWM 需求就能灵活调整参数解决频闪、噪音、低速无力等各类现场问题。

相关新闻

动态范围全解析:从传感器原理到HDR实战应用

动态范围全解析:从传感器原理到HDR实战应用

1. 动态范围到底是什么?聊摄影、音频、视频,甚至是你手机屏幕的好坏,总绕不开一个词——“动态范围”。听起来挺玄乎,但说白了,它衡量的就是一个设备或系统能同时记录或呈现的最亮和最暗细节的能力。你可以把它想象成一…

2026/10/21 18:25:38 阅读更多 →
Cesium for Unity Credits显示异常:Play模式下的UI初始化与Canvas渲染问题解决

Cesium for Unity Credits显示异常:Play模式下的UI初始化与Canvas渲染问题解决

1. 项目概述:一个看似微小却影响深远的“顽疾” 如果你正在使用Cesium for Unity开发一个需要发布到WebGL或PC/Mobile平台的3D地理空间应用,那么你很可能在Play模式下遇到过这个令人头疼的问题:Cesium Credits(版权信息&#xff0…

2026/10/22 4:34:55 阅读更多 →
AI应用工程化:从框架搭建到业务落地的Harness实践指南

AI应用工程化:从框架搭建到业务落地的Harness实践指南

1. 项目概述:从“搭轨道”到“摆寿司”的工程哲学最近在跟几个做AI应用开发的朋友聊天,发现大家聊到“Harness”这个词时,总有种微妙的错位感。有人觉得Harness就是个框架,把大模型、Agent、Workflow这些组件像乐高一样拼起来就完…

2026/10/22 14:27:25 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/22 10:18:38 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/22 11:01:53 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/22 9:44:47 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/22 10:42:00 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/22 10:40:08 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/22 10:56:37 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/22 1:47:45 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/22 21:33:42 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/22 5:12:39 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 22:56:44 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 22:56:12 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 19:06:46 阅读更多 →