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 内部也需要访问同…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
