【STM32】PWM

news2024/9/24 13:01:02
一、 PWM 概述
  1. 定义
    PWM(Pulse Width Modulation), 脉冲宽度调制。
    脉冲: 方波, 频率(freq)
    宽度: 高电平的宽度, 占空比(duty)

​ 详细波形如下图。

在这里插入图片描述

  1. 用途
    控制灯光的亮度(手机/平板/显示器背光灯)
    电机的转速

  2. 灯光的控制细节
    频率要大于 25Hz, 灯光的亮度的变化是跟着占空比而变化, 占空比越大, 灯光越暗; 占空比越小, 灯光越亮。

  3. STM32工作过程

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

​ CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。

​ CCMR1: OC1M[2:0]位:

​ 对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】

​ CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。

​ CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。

PWM模式1 & PWM模式2

寄存器TIMx_CCMR1的OC1M[2:0]位来分析:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

自动重载的预装载寄存器

在这里插入图片描述

在这里插入图片描述

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

简单的说,ARPE=1,ARR立即生效。。。APRE=0,ARR下个比较周期生效。

STM32 定时器14输出通道引脚

在这里插入图片描述

PWM输出库函数

void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
typedef struct
{
  uint16_t TIM_OCMode;  //PWM模式1或者模式2
  uint16_t TIM_OutputState; //输出使能 OR失能
  uint16_t TIM_OutputNState;
  uint16_t TIM_Pulse; //比较值,写CCRx
  uint16_t TIM_OCPolarity; //比较输出极性
  uint16_t TIM_OCNPolarity; 
  uint16_t TIM_OCIdleState;  
  uint16_t TIM_OCNIdleState; 
} TIM_OCInitTypeDef;

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure. TIM_Pulse=100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

设置比较函数:

void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Comparex);

使能输出比较预装载:

void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

u使能自动重装载的预装载寄存器允许位:

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

PWM输出配置步骤:

①使能定时器14和相关IO口时钟.

​ 使能定时器14时钟:RCC_APB1PeriphClockCmd();

​ 使能GPIOF时钟:RCC_AHB1PeriphClockCmd ();

初始化IO口为复用功能输出。函数:GPIO_Init();

​ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能

③ GPIOF9复用映射到定时器14

​ GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);

初始化定时器:ARR,PSC等:TIM_TimeBaseInit();

初始化输出比较参数:TIM_OC1Init();

使能预装载寄存器:TIM_OC1PreloadConfig(TIM14, **TIM_OCPreload_Enable);

⑦使能自动重装载的预装载寄存器允许位TIM_ARRPreloadConfig(TIM14,ENABLE);

⑧使能定时器.

⑨不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare1();

二. 程序设计
  1. 原理图

在这里插入图片描述

​ 不同的定时器, 输出通道的数目都有所不一样。 在高级定时器输出多路的 PWM,
​ 比可以是不一样的, 能够由 TIM_SetComparex[1-3]来进行设置不同的通道占空比!

  1. 配置频率

    /* TIM14 clock enable , 定时器 14 时钟使能*/
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
    /* Time base configuration , 定时器基本配置, TIM_Period 是计数值*/
    TIM_TimeBaseStructure.TIM_Period = (10000/100)-1; //输出频率为 100Hz,(10000/100) -1 得到的结果就是计数值。
    TIM_TimeBaseStructure.TIM_Prescaler = 8400-1; //预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频, 也称之为二次分频,当前是 1 分频, 说白了不分频,
    不降低频率
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数的方法
    TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure); //初始化
    
  2. 配置PWM输出功能

在这里插入图片描述

在这里插入图片描述

/* PWM1 Mode configuration: Channel1 , 让 PWM 的通道 1 工作在模式 1*/
//PWM 模式 1, 在递增模式下, 只要 TIMx_CNT < TIMx_CCR1, 通道 1 便为有效状态(高电平), 否则为无效状态(低电平)。
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //允许输出
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //有效的时候, 输出高电平
TIM_OC1Init(TIM14, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //自动重载初值, 不断输出 PWM 脉冲
TIM_ARRPreloadConfig(TIM14, ENABLE); //自动重载初值使能
/* TIM14 enable counter, 使能定时器 14 工作 */
TIM_Cmd(TIM14, ENABLE);

demo:

#include "beep.h"
#include "sys.h"
#include "delay.h"


// LED pwm定时器设置
void init_TIM14()
{
	// 定义GPIO外设
	GPIO_InitTypeDef  GPIO_InitStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

	// 使能定时器14系统时钟源
	// APB1 :42M
    // TIM3 : 42*2 = 84M == 1s	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
	
	// 配置定时时间 10ms
	TIM_TimeBaseStructure.TIM_Period = 100-1; // 重装载寄存器
	TIM_TimeBaseStructure.TIM_Prescaler = 8400-1; // 分频系数
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟二次分频
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
	
	/* PWM1 Mode configuration: Channel1 */
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // pwm1模式,CNT < CCR,输出有效电平
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
	TIM_OCInitStructure.TIM_Pulse = 0; // CCR初始值,通过改变CCR设置占空比
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 有效电平为高电平
	
	TIM_OC1Init(TIM14, &TIM_OCInitStructure);
	// 自动重装载器使能
	TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
	
	/* TIM14 enable counter */
	TIM_Cmd(TIM14, ENABLE);
	
	// 初始化LED PF9
	// 使能F组管脚工作
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 复用模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 无拉电阻
	GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;
	// 初始化GPIO
	GPIO_Init(GPIOF, &GPIO_InitStructure);
	
	// 将PF9和定时器进行绑定
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);
	
}


int main()
{	
	uint32_t pwm_cmp;
	init_TIM14();

	while(1)
	{
		// 设置占空比,pwm_cmp小于ARR(重装载寄存器)值
		for(pwm_cmp = 0; pwm_cmp < 100; pwm_cmp++)
		{
			TIM_SetCompare1(TIM14, pwm_cmp);
			delay_ms(20);
		}
		for(pwm_cmp = 100; pwm_cmp > 0; pwm_cmp--)
		{
			TIM_SetCompare1(TIM14, pwm_cmp);
			delay_ms(20);
		}
	}
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2160406.html

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

相关文章

ASP.NET Core8.0学习笔记(十九)——EF Core DbSet

一、DbSet概述 1.DbSet提供了通过DbContext对表进行查询操作的路径。DbSet对应的属性名称将默认映射为实体T的表名。 2.使用DbSet<T>进行查询的方法&#xff1a; (1)直接在DbContext中创建对应的DbSet<T>属性 (2)使用DbSet DbContext.Set<T>方法操作数据表。…

红外图像绝缘子识别数据集

红外图像绝缘子识别数据集&#xff0c;数据集一共919张图片&#xff0c;标注为voc格式&#xff0c;可以转yolo格式 数据集名称 红外图像绝缘子识别数据集 (Infrared Insulator Recognition Dataset, IIRD) 数据集描述 IIRD是一个专为电气工程领域设计的小规模红外图像数据集…

【iOS】MVC架构模式

文章目录 前言MVC架构模式基本概念通信方式简单应用 总结 前言 “MVC”&#xff0c;即Model&#xff08;模型&#xff09;&#xff0c;View&#xff08;视图&#xff09;&#xff0c;Controller&#xff08;控制器&#xff09;,MVC模式是架构模式的一种。 关于“架构模式”&a…

老包莫名被暂停、删除?Google Play审核这些坑你踩了吗?

相信很多开发者都经历过这样的“晴天霹雳”&#xff1a;自己辛辛苦苦维护多年的应用&#xff0c;突然之间被Google Play暂停或直接删除&#xff0c;理由是“欺骗行为”。收到这样的邮件&#xff0c;开发者往往是一脸懵逼&#xff0c;尤其是那些在架时间长、老老实实运营的“老包…

工作缺乏目标管理,执行力不够用怎么办

在工作中&#xff0c;缺乏目标管理和执行力不够是许多人常常面临的问题。这不仅会影响工作效率&#xff0c;还可能阻碍个人职业发展和团队的整体进步。那么&#xff0c;当我们发现自己处于这样的困境中时&#xff0c;应该怎么办呢&#xff1f; 1、明确并设定SMART目标 明确自己…

缓存装饰器@cached_property

这个装饰器好像在好多包里都有&#xff0c;我在阅读源码的过程中&#xff0c;transformers.utils也有这个。查阅资料&#xff0c;大体上了解了它的用法。参考&#xff1a;[python]cached_property缓存装饰器 - faithfu - 博客园 这个装饰器用在类里面的某个方法前面&#xff0…

科研绘图系列:R语言堆积图(stacked barplot)

文章目录 介绍加载R包导入数据数据预处理画图导出数据系统信息介绍 微生物堆积图是一种数据可视化工具,通常用于展示微生物群落中不同物种的相对丰度。这种图表通过将每个样本中的微生物按照其分类学等级(如门、属等)进行分类,并以不同颜色的块状图表示,每个块的大小代表…

【TabBar嵌套Navigation案例-产品推荐-CollectionView的layout设置 Objective-C语言】

一、我们接着来做这个产品推荐页面啊 1.我们之前,把这个产品推荐页面做出来了,就是长的丑了点儿,所以呢,我们需要去给它设置一下itemSize啦,等等一些东西, 好,首先呢,在这个里边,我们找到我们的layout这块儿, 然后呢,这个layout里边,我们一个一个来设置, 首先呢…

vmware 虚拟机多屏幕或添加屏幕

vmware 虚拟机多屏幕或添加屏幕 前置条件 vmware 安装 vmware tools 虚拟机系统支持多屏幕 物理上有至少两个屏幕&#xff0c;就是物理机上接至少一个屏幕 方法 虚拟机上点设置&#xff0c;需要在虚拟机关机时进行 ctrl alt enter 让当前虚拟机全屏 鼠标移动到屏幕虚拟机…

在 Vue 3 中实现“折叠”与“展开”文本内容

偶然间遇到一个场景&#xff0c;怎么判断一段文本是否超过 5 行或者指定行数&#xff0c;并在超过时显示 "展开/收起" 按钮。那应该如何实现呢&#xff1f; 在 Vue 3 的项目下实现&#xff1a; <template><div class"text-container"><di…

数位dp(算法篇)

算法篇之数位dp 数位dp 概念&#xff1a; 数位dp是一种计数用的dp&#xff0c;一般是要统计一个区级[l,r]内满足一些条件的数的个数所谓数位dp&#xff0c;就是对数位进行dp&#xff0c;也就是个位、十位等相对于普通的暴力枚举&#xff0c;数位dp快就快在它的记忆化&#x…

牛客小白月赛101(上)

tb的区间问题 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include <iostream> #include <climits>using namespace std;int main() {int n, k;cin >> n >> k;int arr[50000];for (int i 0; i < n; i) {cin >> arr[i];}int …

HDL coder使用手册

&#x1f4a1; 由于本科毕设女朋友准备使用FPGA完成&#xff0c;因此写这篇文章帮助她快速上手HDL coder的使用&#xff0c;降低前期入门的难度。 支持生成HDL代码的simulink库 名字中含有HDL的库中的模块一般都可以用来生成HDL代码。直接搜索模块名称&#xff0c;比如搜索fir&…

SpringBoot整合InfluxDB(实战)

一、简单介绍InfluxDB是什么&#xff1f; InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成&#xff0c;着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据&#xff0c;IoT行业的实时数据等场景。 1、主要特点 时间序列数据存储 专门…

网页跨域异常100%解决(谷歌浏览器)

目的&#xff1a; 1.开发过程中&#xff0c;经常出现浏览器提示跨域 2.原因新版本浏览器拦截跨域请求 3.错误关键消息如下&#xff1a; Access-Control-Allow-Origin cess to XMLHttpRequest at http://192.168.1.104:3080/api/Login/Store from origin http://yingyongliere…

sheng的学习笔记-AI-K-摇臂赌博机(K-armed bandit)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 强化学习 sheng的学习笔记-AI-强化学习&#xff08;Reinforcement Learning, RL&#xff09;-CSDN博客 基础知识 单步强化学习任务 先考虑比较简单的情形&#xff1a;最大化单步奖赏&#xff0c;即仅考虑一步操作。需注意…

【LVIO-SLAM】 激光slam理论与实践

【LVIO-SLAM】 激光slam理论与实践 1. 激光slam理论与实践1.1 2D激光SLAM1.2 3D激光SLAM 2. 激光雷达运动畸变去除2.1 Lidar数学模型与点云去畸变2.2 运动畸变 3. 激光slam的前端配准3.1 帧间匹配3.2 3.2 ICP (Iterative Closest Point)3.3 PI-ICP (Point-to-Line Iterative Cl…

虚幻引擎游戏保存/加载存档功能

函数名功能Does Save Game Exist检查存档是否存在Load Game from Slot加载存档Save Game to Slot保存存档Delete Game in Slot删除存档 Slot Name 是插槽名字 存档都是通过插槽名字来 读取/加载/检查/删除的 先创建一个SaveGame类 , 这个类里可以存放要保存的数据 , 比如 玩家…

Unity Debug时出现请选择unity实例

Unity Debug时出现请选择unity实例 问题描述 出现请选择unity实例&#xff0c;并且选择框里为空。 出现原因 你打开了两个Unity工程&#xff0c;在附加时&#xff0c;不知道加在哪个Unity工程上。 解决方法 在调试窗口中点击“附加Unity调试程序”&#xff0c;然后在弹出…

Linux文件IO(三)-Linux系统如何管理文件

1.静态文件与 inode 文件在没有被打开的情况下一般都是存放在磁盘中的&#xff0c;譬如电脑硬盘、移动硬盘、U 盘等外部存储设备&#xff0c;文件存放在磁盘文件系统中&#xff0c;并且以一种固定的形式进行存放&#xff0c;我们把他们称为静态文件。 文件储存在硬盘上&#…