STM32 TIM高级定时器的互补PWM支持插入死区时间,本文将介绍如何计算以及配置正确的死区时间。

文章目录

  • 什么是死区时间?
  • 数据手册的参数
  • 如何计算合理的死区时间?
  • STM32中配置死区时间

什么是死区时间?

PWM是脉冲宽度调制,在电力电子中,最常用的就是整流和逆变。这就需要用到整流桥和逆变桥。

对三相电来说,就需要三个桥臂。以两电平为例,每个桥臂上有两个电力电子器件,比如IGBT。大致如下图所示;

这两个IGBT不能同时导通,否则就会出现短路的情况,从而对系统造成损害。

那为什么会出现同时导通的情况呢?

因为开关元器件的tdont_{don}tdon​和tdofft_{doff}tdoff​严格意义并不是相同的。

所以在驱动开关元器件门极的时候需要增加一段延时,确保另一个开关管完全关断之后再去打开这个开关元器件,通常存在两种情况;

  • 上半桥关断后,延迟一段时间再打开下半桥;
  • 下半桥关断后,延迟一段时间再打开上半桥;

这样就不会同时导通,从而避免功率元件烧毁;死区时间控制在通常的单片机所配备的PWM中都有这样的功能,下面会进一步介绍。

相对于PWM来说,死区时间是在PWM输出的这个时间,上下管都不会有输出,当然会使波形输出中断,死区时间一般只占百分之几的周期。但是当PWM波本身占空比小时,空出的部分要比死区还大,所以死区会影响输出的纹波,但应该不是起到决定性作用的。

另外如果死区设置过小,但是仍然出现上下管同时导通,因为导通时间较短,电流较小,不足以烧毁,此时会导致开关元器件发热严重,所以选择合适的死区时间尤为重要;

数据手册的参数

这里看了一下NXPIRF540的数据手册,栅极开关时间如下所示;


然后找到相关的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​ 一般由驱动器厂家给出,如果是MCUIO驱动的话,需要考虑IO的上升时间和下降时间,另外一般会加光耦进行隔离,这里还需要考虑到光耦的开关延时。

STM32中配置死区时间

STM32的TIM高级定时器支持互补PWM波形发生,同时它支持插入死区时间和刹车的配置。

直接看参考手册里的寄存器TIMx_BDTR,这是配置刹车和死区时间的寄存器;

可以看到死区时间DTUTG[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;

如果需要配置死区时间 1000ns,系统频率72,000,000Hz,那么需要配置寄存器的值为;
VREG=1000ns31=32V_{REG} = \cfrac{1000ns}{31} = 32 VREG​=311000ns​=32
直接写成宏定义的形式

#define DEADTIME  (u16)((unsigned long long)CKTIM/2 \*(unsigned long long)DEADTIME_NS/1000 000 000uL)

用示波器验证了一下,结果正确;

STM32 TIM高级定时器死区时间的计算相关推荐

  1. STM32F103高级定时器死区时间的计算

    看了一些网上讲死区时间计算的教程,觉得讲述的不是很清楚,所以在此用我自己理解的方式讲述一遍,如有错误,请读者赐教. 死区时间的设置:由寄存器"TIM1和TIM8刹车和死区寄存器TIMX_BD ...

  2. 关于F4高级定时器死区时间的计算

    死区时间的计算 高级定时器中相关寄存器 关于死区时间的计算 比较详细的过程推导 高级定时器中相关寄存器 关于高级定时器1和8死区配置的寄存器为TIM_BDTR寄存器 其中对于定时器死区模式的配置(具体 ...

  3. STM32F103高级定时器死区时间计算

    官方数据手册的说明不容易看懂,举的例子与我的应用场合也不一致,我使用的是72MHz的晶振,讲一讲我的死区时间是怎么算出来的. DT死区时间: TDTS为系统时钟周期时长: TDTG为系统周期时长乘以倍 ...

  4. STM32 TIM1高级定时器RCR重复计数器的理解

    STM32 TIM1高级定时器RCR重复计数器的理解 TIMx_RCR重复计数器寄存器,重复计数器只支持高级定时器TIM1和TIM8,下面看标准外设库的TIM结构体的封装: typedef struc ...

  5. 第十五章 TIM高级定时器(下)

    目录 14.6 使用高级定时器实现精确计时 14.6.1 实验要求 14.6.2 软件设计 14.6.3 下载验证 14.7 TIM高级定时器PWM波互补输出 14.7.1 PWM波是什么 14.7. ...

  6. STM32F407高级定时器-死区时间研究-STM32CubeMX

    距离上次写笔记,已经过去好长时间了 中间也折腾过不少东西,但是都没咋整理,主要是这中间都是在干活儿,不是自己想要研究的,也没想着要写. 从去年10月份开始想要学习FOC,10月份研究了一个月,到11月 ...

  7. STM32 TIM1高级定时器配置快速入门

    layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 重点内容 时基单元 计 ...

  8. 【STM32】高级定时器、通用定时器和基本定时器---配置寄存器产生PWM

    文章目录 1.高级定时器和通用定时器 2.配置产生PWM 1.高级定时器和通用定时器   高级定时器:TIM1.TIM8   Tips:黄色词条为高级定时器相对于通用定时器的功能.   通用定时器:T ...

  9. STM32学习——高级定时器

    高级定时器简介 1.输入捕获模式,可用来测频率或脉宽(原理:捕获到信号的跳变沿的时候,把计数器CNT的值锁存到捕获寄存器CCR中,把前后两次捕获到的CCR寄存器中的值相减,就可以算出脉宽或者频率.如果 ...

最新文章

  1. 线上java JVM问题排查
  2. ETSI MEC — 容灾组网模型
  3. [LeetCode]Remove Nth Node From End of List
  4. matlab_exercise(2)----输入一个三位数,依次输出其个位数字,十位数字,百位数字...
  5. WebGIS开发培训(ArcGIS API for JavaScript方向)
  6. 常用DOS命令及用法
  7. 图灵 计算机 ppt,人工智能导论(ppt 155页)
  8. 微信网页开发调试的一些方法
  9. Java中的按拼音排序
  10. 图像处理评价指标之模糊度(更新中)
  11. macbook配置java环境变量_Mac怎么配置JDK环境变量 安装JDK并配置环境变量教程
  12. oracle ebs ar 表,EBS AR 模块常用表
  13. argc和argv的定义和用法
  14. matlab中的isreal函数,matlab线代 isreal函数检测矩阵的复数元素
  15. window下MySQL的压缩包方式安装--单版本或多版本(5.7和8共存)通用
  16. uni-app小程序onShow执行两次;微信小程序onShow重复执行原因;导航栏tabBar页的onLoad函数不执行;App.vue页的onShow执行原因;onShow莫名其妙执行
  17. Hue连接Mysql一直转圈圈连接不上的问题
  18. 狼性多了,人性就少了
  19. OpenCV_电路板焊点的定位
  20. 新斗罗大陆手游服务端,自动搭建脚本,有手就可以,

热门文章

  1. excel 根据某单元格的值设置整行颜色(条件格式)
  2. 华为什么时候能升android10,华为手机什么时候升级安卓Q 华为首批适配Android10机型列表...
  3. 工业自动化数据采集方案
  4. 隐私保护技术之差分隐私
  5. 你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。 如输入1234,则输出: yi er san si 注意,每个字的拼音之间有一个空格
  6. “2021流行趋势发布·新品试骑活动”引爆羊城
  7. 个人简历管理系统-总结
  8. Excel -- 排序与排名
  9. 利用手机访问电脑上开发的html页面
  10. 智能窗帘电机究竟有何亮点?智汀小米有何优势?