STM32的TIM1之PWM互补输出_死区时间和刹车配置
STM32的TIM1之PWM互补输出_死区时间和刹车配置
1、定时器1的PWM输出通道
STM32高级定时器TIM1在用作PWM互补输出时,共有4个输出通道,其中有3个是互补输出通道,如下:
通道1:TIM1_CH1对应PA8引脚,TIM1_CH1N对应PB13引脚;
通道2:TIM1_CH2对应PA9引脚,TIM1_CH2N对应PB14引脚;
通道3:TIM1_CH3对应PA10引脚,TIM1_CH3N对应PB15引脚;
通道4:TIM1_CH4对应PA11引脚;
STM32高级定时器TIM1的PWM刹车引脚TIM1_BKIN对应PB12引脚;
2、PWM互补输出的意义
在使用互补输出时,通常需要考虑死区时间,防止互补引脚控制的功率管同时而导通引起烧坏。见下图:

如果死区Deadtime>0,则在TIM1_CH1和TIM1_CH1N输出波形中插入“死区时间”,可防止TIM1_CH1和TIM1_CH1N控制的功率管同时导通。
3、互补输出
如果死区Deadtime=0,则TIM1_CH1N的输出波形是TIM1_CH1的反相;当死区时间为0,且没有收到刹车信号时,如果TIM1_CH1输出高电平,则TIM1_CH1N一定会输出低电平,我们称之为互补输出。
4、PWM刹车
PWM刹车,就是停止PWM输出波形。
5、PWM的“有效电平”和“无效电平”定义:
在PWM模式1中
1)、在向上计数时,一旦TIMx_CNT<TIMx_CCR1时,通道1引脚输出“有效电平”,否则输出“无效电平”;
2)、在向下计数时,一旦TIMx_CNT>TIMx_CCR1时,通道1引脚输出“无效电平”(OC1REF=0),否则输出“有效电平”(OC1REF=1)。
在PWM模式2中
1)、在向上计数时,一旦TIMx_CNT<TIMx_CCR1时,通道1引脚输出“无效电平”,否则输出“有效电平”;
2)、在向下计数时,一旦TIMx_CNT>TIMx_CCR1时,通道1引脚输出“有效电平”,否则输出“无效电平”。
6、PWM在死区期间输出的电平
1)、若配置了死区时间,则在死区期间,通道1引脚输出的电平和其“无效电平”保持一致。
2)、将“死区期间和无效电平期间”的TIM1_CH1和TIM1_CH1N配置输出为低电平:
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//TIM1_CH1引脚输出有效电平为高电平,则在死区期间和无效电平期间均为低电平
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
// TIM1_CH1N引脚输出有效电平为高电平,则在死区期间和无效电平期间均为低电平
3)、死区时间
TIM_BDTRInitStructure.TIM_DeadTime = 11;
//输出比较信号死区时间配置,具体如何计算可参考 BDTR:DTG[7:0]的描述
//DTG[7:5]=0xx => DT=DTG[7:0]*tdtg,这里的tdtg=tDTS.
//DTG[7:5]=10x => DT=(64+DTG[5:0])*tdtg,这里的Tdtg=2*tDTS.
//DTG[7:5]=110 => DT=(32+DTG[4:0])*tdtg,这里的Tdtg=8*tDTS.
//DTG[7:5]=111 => DT=(32+DTG[4:0])*tdtg,这里的Tdtg=16*tDTS.
//tDTS=tCKINT=1/72000000=13.8ns,11*13.8=152.7ns
//这里配置的死区时间为152ns
7、PWM空闲电平极性配置和PWM刹车的关系
TIM1_CH1和TIM1_CH1N引脚的“空闲电平极性”指的是在“刹车”时TIM1_CH1和TIM1_CH1N引脚输出的极性。
刹车输出配置:
1)、TIM1_CH1和TIM1_CH1N输出配置为互异电平,可能会导致无法刹车;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
2)、TIM1_CH1和TIM1_CH1N输出同时配置为低电平,当刹车信号到来时,会执行有效刹车;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
3)、TIM1_CH1和TIM1_CH1N输出同时配置为高电平,当刹车信号到来时,会执行有效刹车;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;
8、TIM1之PWM程序举例:
void TIM1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/// TIM1_CH1引脚初始化///
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//使能PA口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//PA8为TIM1_CH1通道,TIM1输出比较通道
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//设置引脚为复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//设置引脚的最高输出速率为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
/// TIM1_CH1N引脚初始化///
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
//PB13为TIM1_CH1N通道,TIM1输出比较通道的互补通道
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//设置引脚为复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//设置引脚的最高输出速率为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
//TIM1_BKIN刹车引脚初始化/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
//PB12对应TIM1_BKIN,为PWM刹车引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//设置引脚为浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//设置引脚的最高输出速率为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void TIM1_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //时基结构体
TIM_OCInitTypeDef TIM_OCInitStructure; //输出比较结构体
TIM_BDTRInitTypeDef TIM_BDTRInitStructure; //刹车结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
//使能TIM1时钟,即内部时钟CK_INT=72M
/*--------------------时基结构体初始化-------------------------*/
TIM_TimeBaseStructure.TIM_Period=(8-1);//周期ARR
//自动重装载寄存器的值,累计(TIM_Period+1)个"分频时钟"后产生一个更新或者中断
TIM_TimeBaseStructure.TIM_Prescaler= (9-1);
//TIM1时钟分频因子PSC
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
//时钟分频因子 = 1,tDTS=tCKINT
//PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}
//72000000/(8*9)=1000000Hz=1MHz
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
//计数器计数模式,设置为向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
//重复计数器的值,没用到不用管
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//初始化定时器
/*--------------------输出比较结构体初始化-------------------*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//PWM输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
//互补输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//TIM1_CH1引脚输出有效电平为高电平,则在死区期间和无效期间均为低电平
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
//TIM1_CH1N引脚输出有效电平为高电平,则在死区期间和无效空闲期间均为低电平
//TIM1_CH1和TIM1_CH1N输出配置为互异电平,导致会无法刹车,死区期间的输出电平这个设置无关/
// TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
//刹车时,TIM1_CH1引脚为高电平
// TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
//刹车时,互补输出TIM1_CH1N引脚为低电平
//TIM1_CH1和TIM1_CH1N输出同时配置为低电平,当刹车信号到来时,会执行有效刹车/
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
//刹车时,TIM1_CH1引脚为低电平
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
//刹车时,互补输出TIM1_CH1N引脚为低电平
//TIM1_CH1和TIM1_CH1N输出同时配置为高电平,当刹车信号到来时,会执行有效刹车/
// TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
//刹车时,TIM1_CH1引脚为高电平
// TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;
//刹车时,TIM1_CH1N引脚为高电平
TIM_OCInitStructure.TIM_Pulse = (5-1); //占空比 = 4 / 8 = 50%
TIM_OC1Init(TIM1, &TIM_OCInitStructure);//初始化PWM输出通道1
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
//开启通道1预装载,在更新时间后才会重新装载数值
/*-------------------刹车和死区结构体初始化-------------------*/
// 有关刹车和死区结构体的成员具体可参考BDTR寄存器的描述
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
//运行模式下“关闭模式”选择 = 1
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
//空闲模式下“关闭模式”选择 = 1
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
//锁定级别1,见参考手册
TIM_BDTRInitStructure.TIM_DeadTime = 11;
//输出比较信号死区时间配置,具体如何计算可参考 BDTR:DTG[7:0]的描述
//DTG[7:5]=0xx => DT=DTG[7:0]*tdtg,这里的tdtg=tDTS.
//DTG[7:5]=10x => DT=(64+DTG[5:0])*tdtg,这里的Tdtg=2*tDTS.
//DTG[7:5]=110 => DT=(32+DTG[4:0])*tdtg,这里的Tdtg=8*tDTS.
//DTG[7:5]=111 => DT=(32+DTG[4:0])*tdtg,这里的Tdtg=16*tDTS.
//tDTS=tCKINT=1/72000000=13.8ns,11*13.8=152.7ns
//这里配置的死区时间为152ns
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;//开启刹车功能
TIM_BDTRInitStructure.TIM_BreakPolarity =TIM_BreakPolarity_Low;
//PWM刹车时,输入低电平有效,则不会产生任何PWM输出波形
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
//开启自动输出
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
TIM_Cmd(TIM1, ENABLE);//使能定时器,计数器开始计数
TIM_CtrlPWMOutputs(TIM1, ENABLE);
//主输出使能,当使用的是通用定时器时,这句不需要
}
void TIM1_PWM_Init(void)
{
TIM1_GPIO_Config();
TIM1_Mode_Config();
}
9、测试结果




PWM刹车实验
相关文章:
STM32的TIM1之PWM互补输出_死区时间和刹车配置
STM32的TIM1之PWM互补输出_死区时间和刹车配置 1、定时器1的PWM输出通道 STM32高级定时器TIM1在用作PWM互补输出时,共有4个输出通道,其中有3个是互补输出通道,如下: 通道1:TIM1_CH1对应PA8引脚,TIM1_CH1N对应PB13引…...
C++复习的长文指南
C复习的长文指南 一、入门语法知识1.预备1.1 main函数1.2 注释1.3 变量1.3 常量1.4 关键字1.5 标识符明明规则 2. 数据类型2.1 整型2.1.1 sizeof关键字 2.2 实型(浮点型)2.3 字符型2.4 转义字符2.5 字符串型2.6 布尔类型bool2.7 数据的输入 3. 运算符3.1…...
深入了解MySQL文件排序
数据准备 CREATE TABLE user_info (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ID,name varchar(20) NOT NULL COMMENT 用户名,age tinyint(4) NOT NULL DEFAULT 0 COMMENT 年龄,sex tinyint(2) NOT NULL DEFAULT 0 COMMENT 状态 0:男 1: 女,creat…...
【JAVA基础】反射
编译期和运行期 首先大家应该先了解两个概念,编译期和运行期,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java代码编译成jvm识别的字节码文件,而运行期指的是将可执行文件交给操作系统去执行, …...
贪心算法(2024/7/16)
1合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:inter…...
Python 在Word表格中插入、删除行或列
Word文档中的表格可以用于组织和展示数据。在实际应用过程中,有时为了调整表格的结构或适应不同的数据展示需求,我们可能会需要插入、删除行或列。以下提供了几种使用Python在Word表格中插入或删除行、列的方法供参考: 文章目录 Python 在Wo…...
Java二十三种设计模式-单例模式(1/23)
引言 在软件开发中,设计模式是一套被反复使用的、大家公认的、经过分类编目的代码设计经验的总结。单例模式作为其中一种创建型模式,确保一个类只有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的概念、实现方式、使用场景以及潜…...
Unity动画系统(3)---融合树
6.1 动画系统基础2-6_哔哩哔哩_bilibili Animator类 using System.Collections; using System.Collections.Generic; using UnityEngine; public class EthanController : MonoBehaviour { private Animator ani; private void Awake() { ani GetComponen…...
sqlalchemy.orm中validates对两个字段进行联合校验
版本 sqlalchemy1.4.37 需求说明 有个场景,需要在orm中对两个字段进行联合校验,当 col1 xxx’时,对 col2的长度进行检查,超过限制(500)时,进行截断。 网上找了很久,没找到类似的…...
【ROS2】高级:解锁 Fast DDS 中间件的潜力 [社区贡献]
目标:本教程将展示如何在 ROS 2 中使用 Fast DDS 的扩展配置功能。 教程级别:高级 时间:20 分钟 目录 背景 先决条件在同一个节点中混合同步和异步发布 创建具有发布者的节点创建包含配置文件的 XML 文件执行发布者节点创建一个包含订阅者的节…...
VirtualBox虚拟机与主机互传文件的方法
建立共享文件夹 1.点击设置,点击共享文件夹,添加共享文件夹路径,保存 2.启动虚拟机,点击设备,点击安装增强功能,界面会出现一个光碟图标,点击光碟图标 3.打开光碟图标,出现一个目…...
访问控制系列
目录 一、基本概念 1.客体与主体 2.引用监控器与引用验证机制 3.安全策略与安全模型 4.安全内核 5.可信计算基 二、访问矩阵 三、访问控制策略 1.主体属性 2.客体属性 3.授权者组成 4.访问控制粒度 5.主体、客体状态 6.历史记录和上下文环境 7.数据内容 8.决策…...
【BUG】已解决:ModuleNotFoundError: No module named ‘cv2’
已解决:ModuleNotFoundError: No module named ‘cv2’ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开…...
成都亚恒丰创教育科技有限公司 【插画猴子:笔尖下的灵动世界】
在浩瀚的艺术海洋中,每一种创作形式都是人类情感与想象力的独特表达。而插画,作为这一广阔领域中的璀璨明珠,以其独特的视觉语言和丰富的叙事能力,构建了一个又一个令人遐想连篇的梦幻空间。成都亚恒丰创教育科技有限公司 在众多插…...
gite+picgo+typora打造个人免费笔记软件
文章目录 1️⃣个人笔记软件2️⃣ 配置教程2.1 使用软件2.2 node 环境配置2.3 软件安装2.4 gite仓库设置2.5 配置picgo2.6 测试检验2.7 github教程 🎡 完结撒花 1️⃣个人笔记软件 最近换了环境,没有之前的生产环境舒适,写笔记也没有劲头&…...
只用 CSS 能玩出什么花样?
在前端开发领域,CSS 不仅仅是一种样式语言,它更像是一位多才多艺的艺术家,能够创造出令人惊叹的视觉效果。本文将带你探索 CSS 的无限可能,从基本形状到动态动画,从几何艺术到仿生设计,只用 CSS 就能玩出令…...
Linux C++ 056-设计模式之迭代器模式
Linux C 056-设计模式之迭代器模式 本节关键字:Linux、C、设计模式、迭代器模式 相关库函数: 概念 迭代器模式(Iterator Pattern)是一种常用的设计模式。迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而…...
【Elasticsearch7.11】reindex问题
参考博文链接 问题:reindex 时出现如下问题 原因:数据量大,kibana的问题 解决方法: 将DSL命令转化成CURL命令在服务上执行 CURL命令 自动转化 curl -XPOST "http://IP:PORT/_reindex" -H Content-Type: application…...
nginx代理缓存
在服务器架构中,反向代理服务器除了能够起到反向代理的作用之外,还可以缓存一些资源,加速客户端访问,nginx的ngx_http_proxy_module模块不仅包含了反向代理的功能还包含了缓存功能。 1、定义代理缓存规则 参数详解: p…...
[React 进阶系列] useSyncExternalStore hook
[React 进阶系列] useSyncExternalStore hook 前情提要,包括 yup 的实现在这里:yup 基础使用以及 jest 测试 简单的提一下,需要实现的功能是: yup schema 需要访问外部的 storage外部的 storage 是可变的React 内部也需要访问同…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
