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 内部也需要访问同…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...