【STM32】软件模拟PWM波
一、代码分析1.1 纯软件延时实现 PWM不用 TIM实现原理纯软件模拟 PWM 的核心是完全依靠 CPU 执行指令来手动控制 GPIO 引脚的电平翻转不借助芯片内置的定时器硬件外设。PWM 波形的两个核心参数为周期与占空比软件实现通过固定的循环延时来维持周期稳定在单个周期内分别控制高电平与低电平的持续时长通过改变两段时长的比例即可实现占空比的调节。整个波形生成过程完全依赖 CPU 逐条执行代码每一次电平翻转都需要 CPU 主动调用 GPIO 操作函数完成。设计思路代码以固定的延时单位作为 PWM 的周期基准通过循环变量控制单个周期内高低电平的分配比例。程序设置两个连续的循环结构第一个循环逐步增加低电平的延时时长、对应缩短高电平时长实现占空比的线性递减第二个循环逐步增加高电平的延时时长、对应缩短低电平时长实现占空比的线性递增。两个循环首尾衔接即可实现占空比在 0%~100% 区间内的连续往复变化。#include stm32f10x.h void MY_GPIOInit() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA外设时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 配置引脚为推挽输出模式 GPIO_InitStructure.GPIO_Speed GPIO_Speed_2MHz; GPIO_Init(GPIOA, GPIO_InitStructure); } void MY_Delay(int t) { while(t--); // 空循环消耗CPU时钟实现粗略软件延时 } int main() { MY_GPIOInit(); while(1) { for(int i 0; i 10000; i 3) // i控制低电平时长总周期固定为10000个延时单位 { GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); MY_Delay(i); GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); MY_Delay(10000 - i); } for(int i 0; i 10000; i 3) // i控制高电平时长占空比随i递增逐步升高 { GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); MY_Delay(10000 - i); GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); MY_Delay(i); } } }1.2 硬件定时器实现 PWM用 TIM实现原理硬件定时器 PWM 依托 STM32 内置的通用定时器外设通过输出比较功能由硬件电路自动生成 PWM 波形。定时器内部的计数器 CNT 会按照预设的时钟频率自动累加计数硬件实时将 CNT 的计数值与捕获比较寄存器 CCR 的数值进行比对根据比对结果自动翻转输出引脚的电平状态。当 CNT 计数值达到自动重装载寄存器 ARR 的设定值时计数器自动清零并开启下一个计数周期。其中 ARR 的数值决定 PWM 的周期长度CCR 的数值决定单个周期内有效电平的持续时长即占空比。设计思路代码采用模块化设计将 PWM 的硬件初始化与占空比调节封装为独立函数。初始化流程遵循标准的外设配置逻辑依次完成外设时钟使能、GPIO 引脚复用配置、定时器时基参数配置、输出比较通道模式配置四个步骤最终启动定时器即可让硬件自动输出稳定的 PWM 波形。主循环中通过循环变量逐步修改 CCR 的数值先递增后递减实现占空比在设定范围内的连续往复调节延时函数用于控制占空比变化的速率。main.c#include stm32f10x.h #include Delay.h #include PWM.h int main() { PWM_Init(); uint8_t i; while(1) { for(i 0; i 100; i) { PWM_SetCompare1(i); // 修改CCR值线性提升占空比 Delay_ms(10); } for(i 0; i 100; i) { PWM_SetCompare1(100 - i); // 修改CCR值线性降低占空比 Delay_ms(10); } } }PWM.c#include stm32f10x.h void PWM_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2定时器时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA端口时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 复用推挽输出引脚控制权交给定时器硬件 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); TIM_InternalClockConfig(TIM2); // 选择内部72MHz时钟作为定时器计数时钟源 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; // 设置为向上计数模式 TIM_TimeBaseInitStructure.TIM_Period 100 - 1; // ARR自动重装载值决定PWM周期与分辨率 TIM_TimeBaseInitStructure.TIM_Prescaler 720 - 1; // PSC预分频值分频得到计数频率 TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure); TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; // 配置通道为PWM1输出模式 TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; // 设置有效电平极性为高电平 TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 0; // 初始CCR值上电默认占空比为0 TIM_OC1Init(TIM2, TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE); // 启动定时器硬件开始自动输出PWM波形 } void PWM_SetCompare1(uint16_t Compare) { TIM_SetCompare1(TIM2, Compare); // 修改捕获比较寄存器数值调整占空比 }二、波形显示完成 PWM 代码编写后可直接利用 Keil5 内置的软件仿真功能通过逻辑分析仪工具在线观测引脚输出的波形无需连接实物硬件即可验证 PWM 的周期、占空比变化是否符合设计预期。具体操作流程如下1. 仿真环境参数配置点击工程工具栏的 “魔术棒” 图标打开Options for Target...配置窗口切换到Debug选项卡勾选上方的Use Simulator启用纯软件仿真模式将Dialog DLL栏的内容修改为DARMSTM.DLL加载 STM32 系列对应的仿真驱动库将Parameter栏的内容修改为-pSTM32F103ZE指定仿真的芯片型号确保外设寄存器模型与代码中的 STM32F10x 系列完全匹配。2. 添加引脚观测通道配置完成后点击工具栏的Start/Stop Debug Session按钮进入调试会话在调试界面的菜单栏中调出Logic Analyzer逻辑分析仪窗口点击逻辑分析仪窗口内的Setup...按钮在弹出的配置面板中点击New在输入框中输入PORTA.0并按下回车即将 PA0 引脚添加为波形观测对象与代码中 PWM 的输出引脚对应。3. 启动仿真查看波形关闭配置面板后在逻辑分析仪的波形显示区域右键在弹出的菜单中将显示模式设置为Bit以标准数字电平的形式展示引脚高低电平状态。 设置完成后点击调试工具栏的Run按钮启动仿真即可在逻辑分析仪窗口中看到 PA0 引脚输出的连续 PWM 波形。随着程序循环运行能够直观观察到占空比线性递增、再线性递减的完整变化过程以此验证两种 PWM 实现方式的输出逻辑是否正确。

相关新闻

长沙中央空调维修-周边全小区覆盖-欧米到家本地师傅当日上门|排查准不乱收费不返工|熟悉全城区机型管路|修后有质保|

长沙中央空调维修-周边全小区覆盖-欧米到家本地师傅当日上门|排查准不乱收费不返工|熟悉全城区机型管路|修后有质保|

前言盛夏高温持续攀升,中央空调作为长沙家庭与商业空间的刚需设备,一旦出现制冷失效、漏水异响、跳闸停机等故障,将严重影响居住与办公体验。欧米到家作为长沙本土深耕多年的专业家电维修平台,不仅专注于中央空调全系统深度维修&a…

2026/8/3 10:21:08阅读更多 →
构建高效脚本备忘录:从环境配置到最佳实践的开发效率指南

构建高效脚本备忘录:从环境配置到最佳实践的开发效率指南

1. 从“无法识别”到脚本大师:为什么你需要一个脚本备忘录 如果你在命令行里敲下 npm 、 pip 或者 winget ,却看到屏幕上弹出那句令人沮丧的“无法将‘xxx’项识别为 cmdlet、函数、脚本文件或可运行程序的名称”,那么恭喜你&#xff0…

2026/8/3 10:21:08阅读更多 →
3步诊断与修复TranslucentTB开机自启动失效问题

3步诊断与修复TranslucentTB开机自启动失效问题

3步诊断与修复TranslucentTB开机自启动失效问题 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB作为一款广受欢迎的Windows…

2026/8/3 10:21:08阅读更多 →
零代码AI数据大屏生成工具选型与数字孪生平台应用指南

零代码AI数据大屏生成工具选型与数字孪生平台应用指南

我是做智慧城市项目的,最近两年数字孪生特别火,我们公司也接了好几个数字孪生大屏的项目。从最开始的手足无措,到现在能快速交付,这中间我摸索出了一套工具选型的方法论,今天分享给大家。数字孪生大屏,到底…

2026/8/3 11:35:37阅读更多 →
告别命令行烦恼:用TegraRcmGUI图形化界面轻松玩转Switch注入工具

告别命令行烦恼:用TegraRcmGUI图形化界面轻松玩转Switch注入工具

告别命令行烦恼:用TegraRcmGUI图形化界面轻松玩转Switch注入工具 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI 还在为复杂的Switch注入操作而头…

2026/8/3 11:35:37阅读更多 →
基于springboot线上就医问诊咨询系统系统(源码+lw+部署文档+讲解等)

基于springboot线上就医问诊咨询系统系统(源码+lw+部署文档+讲解等)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 11:35:37阅读更多 →
AI导出鸭:AI对话里面的LaTeX公式导出即可编辑的神器

AI导出鸭:AI对话里面的LaTeX公式导出即可编辑的神器

学术狗和数理化老师的终极救星来了! ——让Word里的公式彻底“活”过来 一、那个让你想把电脑砸了的“公式时刻” 如果你是理工科硕博生,或是天天与公式打交道的数理化老师,下面这个场景你一定经历过——而且绝不止一次。 你在 LaTeX 里敲完了…

2026/8/3 11:35:37阅读更多 →
200 行 Python 手写一个 Coding Agent:能读项目、改代码、跑测试

200 行 Python 手写一个 Coding Agent:能读项目、改代码、跑测试

普通 AI 只能在对话框里“建议你怎么改”,Coding Agent 则会自己查看项目、定位文件、写入修改、运行测试,并根据报错继续修复。本文不使用 LangChain、AutoGen 等框架,只用 Python 和 OpenAI 兼容接口,手写一个真正能跑起来的极简…

2026/8/3 11:35:37阅读更多 →
WSaiOS宣布代码开源并开放第三方验证测试

WSaiOS宣布代码开源并开放第三方验证测试

WSaiOS宣布代码开源并开放第三方验证测试纯符号逻辑模拟人工智能系统接受公开检验---技术支持:WSaiOS多模态智能技术研发工作室日前,独立研究者东塬一老翁主导的WSaiOS(Wang Smart AI Operating System)模拟人工智能工程理论项目宣…

2026/8/3 11:33:30阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 0:29:53阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/3 0:33:53阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/3 0:20:37阅读更多 →
3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:32阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/3 2:32:59阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/3 2:33:01阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/3 2:33:04阅读更多 →