STM32 TIM高级定时器死区时间的计算
STM32 TIM高级定时器的互补PWM支持插入死区时间,本文将介绍如何计算以及配置正确的死区时间。
什么是死区时间?
死区时间主要是在逆变电路中,防止一个桥臂的上下两个开关器件同时导通,那么会导致电路电流上升,从而对系统造成损害。因为开关元器件的tdont_{don}tdon和tdofft_{doff}tdoff严格意义并不是相同的。所以在驱动开关元器件门极的时候需要增加一段延时,确保另一个开关管完全关断之后再去打开这个开关元器件,这里的延时就是需要施加的死区时间。
数据手册的参数
这里看了一下NXP
的IRF540
的数据手册,门极开关时间如下所示;
然后找到相关的tdont_{don}tdon,tdfft_{dff}tdff,trt_rtr,tft_ftf的相关典型参数;
- tdont_{don}tdon:门极的开通延迟时间
- tdofft_{doff}tdoff:门极的关断延迟时间
- trt_rtr:门极上升时间
- tft_ftf:门极下降时间
下面是一个IGBT
的数据手册;
下图是IGBT
的开关属性,同样可以找到tdont_{don}tdon,tdfft_{dff}tdff,trt_rtr,tft_ftf等参数,下面计算的时候会用到;
如何计算合理的死区时间?
这里用tdeadt_{dead}tdead表示死区时间,因为门极上升和下降时间通常比延迟时间小很多,所以这里可以不用考虑它们。则死区时间满足;
Tdead=[(Tdoffmax−Tdonmin)+(Tpddmax−Tpddmin)]∗1.2T_{dead}=[(T_{doffmax}-T_{donmin})+(T_{pddmax}-T_{pddmin})]*1.2Tdead=[(Tdoffmax−Tdonmin)+(Tpddmax−Tpddmin)]∗1.2
- TdoffmaxT_{doffmax}Tdoffmax :最大的关断延迟时间;
- TdonminT_{donmin}Tdonmin :最小的开通延迟时间;
- TpddmaxT_{pddmax}Tpddmax :最大的驱动信号传递延迟时间;
- TpddminT_{pddmin}Tpddmin :最小的驱动信号传递延迟时间;
其中TdoffmaxT_{doffmax}Tdoffmax 和TdonminT_{donmin}Tdonmin正如上文所提到的可以元器件的数据手册中找到;
TpddmaxT_{pddmax}Tpddmax 和 TpddminT_{pddmin}Tpddmin 一般由驱动器厂家给出,如果是MCU
的IO
驱动的话,需要考虑IO
的上升时间和下降时间,另外一般会加光耦进行隔离,这里还需要考虑到光耦的开关延时。
STM32中配置死区时间
STM32的TIM
高级定时器支持互补PWM
波形发生,具体可以参考之前的文章《STM32 TIM 多通道互补PWM波形输出配置快速入门》和《STM32 TIM1高级定时器配置快速入门》,同时它支持插入死区时间和刹车的配置。
直接看参考手册里的寄存器TIMx_BDTR,这是配置刹车和死区时间的寄存器;
可以看到死区时间DT由UTG[7:0]决定,这里还有一个问题是TDTST_{DTS}TDTS是什么?
在TIMx_CR1的寄存器可以得知,tDTSt_{DTS}tDTS由TIMx_CR1寄存器的CKD决定;如果这里配置成00,那么tDTSt_{DTS}tDTS和内部定时器的频率相同,为8M
;
结合代码做一下计算;系统频率为72M,下面是时基单元的配置;
#define PWM_FREQ ((u16) 16000) // in Hz (N.b.: pattern type is center aligned)
#define PWM_PRSC ((u8)0)
#define PWM_PERIOD ((u16) (CKTIM / (u32)(2 * PWM_FREQ *(PWM_PRSC+1))))
TIM_TimeBaseStructInit(&TIM1_TimeBaseStructure);
/* Time Base configuration */
TIM1_TimeBaseStructure.TIM_Prescaler = 0x0;
TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
TIM1_TimeBaseStructure.TIM_Period = PWM_PERIOD;
TIM1_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;
PWM的频率是16K
,注意这里的PWM是中央对齐模式,因此配置的时钟频率为32K
;
下面时刹车和死区时间,BDTR寄存器的配置,因此这里的CK_INT
为32M
#define CKTIM ((u32)72000000uL) /* Silicon running at 72MHz Resolution: 1Hz */
#define DEADTIME_NS ((u16) 500) //in nsec; range is [0...3500]
#define DEADTIME (u16)((unsigned long long)CKTIM/2 \
*(unsigned long long)DEADTIME_NS/1000 000 000uL)
TIM1_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM1_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM1_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
TIM1_BDTRInitStructure.TIM_DeadTime = DEADTIME;
TIM1_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
TIM1_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM1_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
例:若TDTS = 31ns(32MHZ),可能的死区时间为:
0到3970ns,若步长时间为31ns;
4000us到8us,若步长时间为62ns;
8us到16us,若步长时间为250ns;
16us到32us,若步长时间为500ns;
如果需要配置死区时间 500ns,系统频率72,000,000Hz
,那么需要配置寄存器的值为;
VREG=50031=16
V_{REG} = \cfrac{500}{31} = 16
VREG=31500=16
直接写成宏定义的形式
#define DEADTIME (u16)((unsigned long long)CKTIM/2 \
*(unsigned long long)DEADTIME_NS/1000 000 000uL)
用示波器验证了一下,结果正确;当时图片忘记保存,下次更新的时候再上图吧。
STM32 TIM高级定时器死区时间的计算的更多相关文章
- 第32章 TIM—高级定时器—零死角玩转STM32-F429系列
第32章 TIM—高级定时器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- STM32 TIM1高级定时器RCR重复计数器的理解
STM32 TIM1高级定时器RCR重复计数器的理解 TIMx_RCR重复计数器寄存器,重复计数器只支持高级定时器TIM1和TIM8,下面看标准外设库的TIM结构体的封装: typedef struc ...
- STM32 TIM1高级定时器配置快速入门
layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 重点内容 时基单元 计 ...
- TIM—高级定时器
本章参考资料:< STM32F4xx 参考手册>.< STM32F4xx 规格书>.库帮助文档< stm32f4xx_dsp_stdperiph_lib_um.chm&g ...
- Stm32高级定时器(三)
Stm32高级定时器(三) 1 互补输出和死区插入 1.1 死区:某个处于相对无效状态的时间或空间 本来OCX信号与OCXREF时序同相同步,OCXN信号与OCXREF时序反相同步.但为了安全考虑,以 ...
- Stm32高级定时器(四)
Stm32高级定时器(四) 1 编码器接口模式 1.1 编码器原理 什么是正交?如果两个信号相位相差90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向.根 ...
- Stm32高级定时器(一)
Stm32高级定时器(一) 1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波 ...
- stm32高级定时器的应用——spwm
用过stm32定时器的朋友都知道,定时器的CCR寄存器,可以用来配置PWM的输出,但同样也可以用来配置spwm.废话不多说,直接上代码. 首先,你得考虑一下几个因素: 1.同步调制还是异步调制. 2 ...
- Stm32高级定时器(二)
Stm32高级定时器(二) 1 主从模式:主?从? 谈论主从,可知至少有两个以上的触发或者驱动信号,stm32内部有多个定时器,可以相互之间驱动或者控制. 主模式:定时器使能只受驱动时钟控制或者输出控 ...
随机推荐
- MySQL的事务隔离级别是什么?
我是平也,这有一个专注Gopher技术成长的开源项目「go home」 背景介绍 想必事务大家都已经非常熟悉了,它是一组SQL组成的一个执行单元,要么全执行要么全不执行,这也是它的一个特性--原子性. ...
- 基于Lua的游戏服务端框架简介
基于Lua的游戏服务端框架简介 [转]https://gameinstitute.qq.com/community/detail/106396 基于lua的游戏服务端框架简介 1. 引言 笔者目前在参 ...
- JavaScript表达式和运算符 —— 基础语法(4)
JavaScript基础语法(4) 运算符 运算符用于将一 个或者多个值变成结果值. 使用运算符的值称为操作数,运算符和操作数的组合称为表达式 JS中的运算符可以分成下面几类: 算术运算符 逻辑运算符 ...
- 移植madplay到ARM板
一.环境和软件介绍 1.主机环境:Ubuntu16.04 2.交叉编译器: gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67) 3.ARM板:kernel: ...
- tensorflow1.0 dropout层
""" Please note, this code is only for python 3+. If you are using python 2+, please ...
- Go gRPC进阶-gRPC转换HTTP(十)
前言 我们通常把RPC用作内部通信,而使用Restful Api进行外部通信.为了避免写两套应用,我们使用grpc-gateway把gRPC转成HTTP.服务接收到HTTP请求后,grpc-gatew ...
- 获取某个时间开始 之后的 N次[周几,周几]
废话不多说,直接上菜! 调用函数代码举例 //PS :这里需要注意的是 周日 是 0 !!!!! console.log(getBeforeDate(-10000)) //一万天之后的日期 conso ...
- kafka相关术语名词
Topic:标签名,一个消息队列的名称 Producer:生产者,发布消息 Consumer:消费者,订阅发布消息,进行处理的存在 Broker:kafka集群,有一个.多个Topic Partiti ...
- 高级数据结构---赫(哈)夫曼树及java代码实现
我们经常会用到文件压缩,压缩之后文件会变小,便于传输,使用的时候又将其解压出来.为什么压缩之后会变小,而且压缩和解压也不会出错.赫夫曼编码和赫夫曼树了解一下. 赫夫曼树: 它是一种的叶子结点带有权重的 ...
- Selenium常见报错问题(2)- 解决和分析StaleElementReferenceException异常
如果你在跑selenium脚本时,需要某些异常不知道怎么解决时,可以看看这一系列的文章,看看有没有你需要的答案 https://www.cnblogs.com/poloyy/category/1749 ...