零基础STM32单片机编程入门(七)定时器PWM波输出实战含源码视频
文章目录
- 一.概要
- 二.PWM产生框架图
- 三.CubeMX配置一个TIME输出1KHZ,占空比50%PWM波例程
- 1.硬件准备
- 2.创建工程
- 3.测量波形结果
- 四.CubeMX工程源代码下载
- 五.讲解视频链接地址
- 六.小结
一.概要
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用单片机数字输出(1或0)来对外部模拟电路进行控制的一种非常有效的技术。

PWM波主要应用场景:
电机控制
PWM信号可以用来控制直流电机的转速和位置,实现对电机的精确控制。在无刷直流电机(BLDC)和步进电机中,利用PWM调制可以充分发挥电子设备的精确度和能效。
LED灯光调光
PWM信号可用于调控LED灯的亮度。通过改变PWM信号的占空比(on-time和off-time的比值),可以实现对LED灯光的调光操作,达到节能和避免眩光的效果。
电源管理
采用PWM技术的开关稳压器(如降压转换器)在电源管理中具有广泛的应用。
音频放大器
在数字音频放大器中,PWM信号用于控制音频信号的放大和调制。
混合动力电动汽车(HEV)和电动汽车(EV)
PWM信号用于控制电池充放电和电动机的驱动管理,提高电池的使用性能和寿命。
伺服系统
在伺服系统中,PWM信号用于传输伺服电机的控制信号,实现对伺服电机的精确控制。
二.PWM产生框架图
定时器部分框图如下,其中PWM相关的主要是基本定时器和PWM输出控制部分,基本定时器主要控制PWM输出的频率,PWM控制部分主要控制PWM输出的占空比。

PWM输出控制部分信号流向

主要寄存器
1.TIMx_CCR1
捕获比较(值)寄存器(x=1,2,3,4):设置比较值。
2.TIMx_CNT
计数器值与捕获比较寄存器CCR1进行比较,通过比较结果输出有效电平和无效电平 。
3.TIMx_ARR
自动重装载寄存器,计数器(TIMx_CNT)开始计数,直到计数器(TIMx_CNT)达到TIMx_ARR中存放的值后,重新回到0,依次循环 。
在PWM工作模式下,引入一个寄存器CCRx,这个寄存器用于控制PWM输出波的有效电平长度(占空比),假定定时器工作在向上计数 PWM模式,且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1。当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率。
工作过程如下图所示

三.CubeMX配置一个TIME输出1KHZ,占空比50%PWM波例程
1.硬件准备
STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口。

2.创建工程
打开STM32CubeMX软件,新建工程

Part Number处输入STM32F103C8,再双击就创建新的工程

配置下载口引脚

配置外部晶振引脚

配置系统主频

配置TIM1,1ms定时器,TIM1内部时钟是72MHZ,72分频就是1MHZ,计数1000次归零,计数时间就是1ms,脉冲宽度是500us,根据上述配置,PWM波频率就是1KHZ,占空比就是50%。

配置工程文件名,保存路径,KEIL5工程输出方式

生成工程

用Keil5打开工程

增加代码

主要代码如下
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM1_Init();/* USER CODE BEGIN 2 */if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK)//启动定时器通道1,PWM输出{/* PWM generation Error */while(1);}/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}void MX_TIM1_Init(void)
{TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_OC_InitTypeDef sConfigOC = {0};TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};htim1.Instance = TIM1;htim1.Init.Prescaler = 71;htim1.Init.CounterMode = TIM_COUNTERMODE_UP;htim1.Init.Period = 999;htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim1.Init.RepetitionCounter = 0;htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim1) != HAL_OK){}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK){}if (HAL_TIM_PWM_Init(&htim1) != HAL_OK){}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK){}sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = 500;sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){}sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;sBreakDeadTimeConfig.DeadTime = 0;sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK){}HAL_TIM_MspPostInit(&htim1);}
3.测量波形结果
通过波形接收器测量PA8引脚

四.CubeMX工程源代码下载
链接:https://pan.baidu.com/s/1ZOkxY7d7Gz1jXCvHHzF6uA
提取码:bhf6
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
五.讲解视频链接地址
PWM输出实验
六.小结
脉冲宽度调制(PWM:Pulse Width Modulation)可以广泛应用于电机控制、灯光的亮度调节、功率控制等领域,所以在那些领域避免不了需要用到PWM输出技能。
相关文章:
零基础STM32单片机编程入门(七)定时器PWM波输出实战含源码视频
文章目录 一.概要二.PWM产生框架图三.CubeMX配置一个TIME输出1KHZ,占空比50%PWM波例程1.硬件准备2.创建工程3.测量波形结果 四.CubeMX工程源代码下载五.讲解视频链接地址六.小结 一.概要 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写&…...
【ubuntu自启shell脚本】——在ubuntu中如何使用系统自带的启动应用程序设置开机自启自己的本地shell脚本
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、设置开机自启shell脚本1.使用 gnome-session-properties2.测试的shell例程代码 总结 前言 在Ubuntu系统中设置开机自启脚本是一种重要的自动化方法。开机自…...
nodejs配置国内镜像
# 设置淘宝镜像 npm config set registry https://registry.npmmirror.com# 查看镜像源 npm get registry...
【JavaEE】多线程进阶
🤡🤡🤡个人主页🤡🤡🤡 🤡🤡🤡JavaEE专栏🤡🤡🤡 文章目录 1.锁策略1.1悲观锁和乐观锁1.2重量级锁和轻量级锁1.3自旋锁和挂起等待锁1.4可…...
大模型LLM面试常见算法题-包括Attention和Transformer常见面试题
大模型: 位置编码有哪些? 介绍LoRA与QLoRA RAG和微调的区别是什么? 哪些因素会导致LLM的偏见? 什么是思维链(CoT)提示? Tokenizer的实现方法及原理 解释一下大模型的涌现能力?…...
90元搭建渗透/攻防利器盒子!【硬件篇】
前言 以下内容请自行思考后进行实践。 使用场景 在某些情况下开软件进行IP代理很麻烦,并不能实现真正全局,而且还老容易忘记,那么为了在实景工作中,防止蓝队猴子封IP,此文正现。 正文 先说一下实验效果࿱…...
用vue2+elementUI封装手机端选择器picker组件,支持单选、多选、远程搜索多选
单选注意点: touchmove.prevent: 在 touchmove 事件上添加 .prevent 修饰符,以阻止默认的滚动行为。 handleTouchStart: 记录触摸开始的 Y 坐标和当前的 translateY 值。 handleTouchMove: 计算触摸移动的距离,并更新 translateY 值。 han…...
『古籍自有答案』古风H5案例赏析
「古籍自有答案」,一部由新京报与字节跳动公益联合打造的古风H5,以诗意盎然的开篇引领用户穿梭于千年文脉。 part1. 创意定位 "人生有惑问先贤,先贤答案存古籍",在这里,每一个灵魂的探问,都能在…...
Laravel模型事件完全指南:触发应用程序的动态行为
标题:Laravel模型事件完全指南:触发应用程序的动态行为 在Laravel框架中,模型事件提供了一种优雅的方式来处理Eloquent模型生命周期中的各种关键时刻。通过监听和响应这些事件,开发者可以自动化许多常见的任务,如日志…...
hot100 |八、二叉树
1-leetcode94. 二叉树的中序遍历 注意:√ 递归方法已经很熟练了,两种不同的递归方式迭代法需要注意,zrm就遇到了要求迭代实现,前序遍历和后续遍历其实不难,中序遍历用的少,注意看一看 // 1.递归方法1Lis…...
Matlab协方差矩阵分解法生成随机场
Matlab协方差矩阵分解法生成随机场 相关系数矩阵 % function outcohesion(x,y,mu,theta) % end % xyload(F:\Research-OUC\基于机器许学习模型的海底斜坡可靠度研究\基于comsol的斜坡稳定性分析\comsol网格操作\grid_operate-matlab.mphtxt); % xxy(:,1); % yxy(:,2); Xlinspac…...
android 在清单文件中配置receiver,系统是何时会注册此广播接收者的?
在 Android 中,通过清单文件(AndroidManifest.xml)配置的广播接收器(BroadcastReceiver),系统会在特定的时机自动注册这些广播接收器。以下是详细的说明: 静态注册的广播接收器 静态注册的广播…...
嵌入式硬件电路常用设计软件
目录 1. Cadence Allegro 2. PADS 3. Altium Designer 4. Multisim 5. Protues 1. Cadence Allegro 功能: Cadence Allegro是Cadence公司推出的先进PCB(Printed Circuit Board,印刷电路板)设计布线工具,也是目前…...
c#的List<T>的SelectMany 和Select
在C#中,List<T>(以及任何实现了IEnumerable<T>的集合)的Select和SelectMany扩展方法都是LINQ(Language Integrated Query)的一部分,用于对集合中的元素进行查询和转换。 尽管它们的作用有些相…...
69.WEB渗透测试-信息收集- WAF、框架组件识别(9)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:68.WEB渗透测试-信息收集- WAF、框架组件识别(8) 有无waf存在&am…...
ASCII码对照表(Matplotlib颜色对照表)
文章目录 1、简介1.1 颜色代码 2、Matplotlib库简介2.1 简介2.2 安装2.3 后端2.4 入门例子 3、Matplotlib库颜色3.1 概述3.2 颜色图的分类3.3 颜色格式表示3.4 内置颜色映射3.5 xkcd 颜色映射3.6 颜色命名表 4、Colorcet库5、颜色对照表结语 1、简介 1.1 颜色代码 颜色代码是…...
Mysql-常用函数及其用法总结
1、字符串函数 测试用例如下: 1.1 CONCAT() 将多个字符串连接成一个字符串。 SELECT CONCAT(first_name, , last_name) AS full_name FROM users; -- 期望结果:John Doe, Jane Smith, Michael Johnson 1.2 SUBSTRING() 提取子字符串 SELECT SUBSTR…...
【c++刷题笔记-数组】day29:452. 用最少数量的箭引爆气球、 435. 无重叠区间 、 763.划分字母区间
452. 用最少数量的箭引爆气球 - 力扣(LeetCode) 思路:先按照左边界排序,当前的左边界大于前一个的右边界的时候,表示没有覆盖所以需要一根箭,反之则要更新为最小的右边界 重点:是区间覆盖问题…...
【数据结构】链表带环问题分析及顺序表链表对比分析
【C语言】链表带环问题分析及顺序表链表对比分析 🔥个人主页:大白的编程日记 🔥专栏:C语言学习之路 文章目录 【C语言】链表带环问题分析及顺序表链表对比分析前言一.顺序表和链表对比1.1顺序表和链表的区别1.2缓存利用率&#…...
快速解决找不到krpt.dll,无法继续执行代码问题
对于那些遇到计算机开机出现由于无法找到krpt.dll,进而无法继续执行代码问题的用户。 krpt.dll是计算机系统中与DirectX紧密相关的重要文件,如果它出现问题,可能会对一些特定的软件或游戏的运行产生影响。实际上,我们有多种解决该…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
