zoukankan      html  css  js  c++  java
  • STM32 TIM高级定时器死区时间的计算

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

    什么是死区时间?

    死区时间主要是在逆变电路中,防止一个桥臂的上下两个开关器件同时导通,那么会导致电路电流上升,从而对系统造成损害。因为开关元器件的tdont_{don}tdofft_{doff}严格意义并不是相同的。所以在驱动开关元器件门极的时候需要增加一段延时,确保另一个开关管完全关断之后再去打开这个开关元器件,这里的延时就是需要施加的死区时间。
    在这里插入图片描述

    数据手册的参数

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

    在这里插入图片描述
    然后找到相关的tdont_{don}tdfft_{dff}trt_rtft_f的相关典型参数;
    在这里插入图片描述

    • tdont_{don}:门极的开通延迟时间
    • tdofft_{doff}:门极的关断延迟时间
    • trt_r:门极上升时间
    • tft_f:门极下降时间

    下面是一个IGBT的数据手册;
    在这里插入图片描述
    下图是IGBT的开关属性,同样可以找到tdont_{don}tdfft_{dff}trt_rtft_f等参数,下面计算的时候会用到;
    在这里插入图片描述

    如何计算合理的死区时间?

    这里用tdeadt_{dead}表示死区时间,因为门极上升和下降时间通常比延迟时间小很多,所以这里可以不用考虑它们。则死区时间满足;
    Tdead=[(TdoffmaxTdonmin)+(TpddmaxTpddmin)]1.2T_{dead}=[(T_{doffmax}-T_{donmin})+(T_{pddmax}-T_{pddmin})]*1.2

    • TdoffmaxT_{doffmax} :最大的关断延迟时间;
    • TdonminT_{donmin} :最小的开通延迟时间;
    • TpddmaxT_{pddmax} :最大的驱动信号传递延迟时间;
    • TpddminT_{pddmin} :最小的驱动信号传递延迟时间;

    其中TdoffmaxT_{doffmax}TdonminT_{donmin}正如上文所提到的可以元器件的数据手册中找到;
    TpddmaxT_{pddmax}TpddminT_{pddmin} 一般由驱动器厂家给出,如果是MCUIO驱动的话,需要考虑IO的上升时间和下降时间,另外一般会加光耦进行隔离,这里还需要考虑到光耦的开关延时。

    STM32中配置死区时间

    STM32的TIM高级定时器支持互补PWM波形发生,具体可以参考之前的文章《STM32 TIM 多通道互补PWM波形输出配置快速入门》《STM32 TIM1高级定时器配置快速入门》,同时它支持插入死区时间和刹车的配置。

    直接看参考手册里的寄存器TIMx_BDTR,这是配置刹车和死区时间的寄存器;
    在这里插入图片描述
    可以看到死区时间DTUTG[7:0]决定,这里还有一个问题是TDTST_{DTS}是什么?
    在TIMx_CR1的寄存器可以得知,tDTSt_{DTS}由TIMx_CR1寄存器的CKD决定;如果这里配置成
    00
    ,那么tDTSt_{DTS}和内部定时器的频率相同,为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
    直接写成宏定义的形式

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

    用示波器验证了一下,结果正确;当时图片忘记保存,下次更新的时候再上图吧。

  • 相关阅读:
    outline basic
    Best lua IDE
    Powershell core
    [转]ceph pg peering过程分析
    [转]ceph rbd到OSD的数据映射
    [转]ceph三种存储接口--块设备-文件系统-对象存储
    ceph monitor----paxos算法1
    ceph monitor----初始化和选举
    ceph monitor---总结1
    [转]ceph RADOS----概述
  • 原文地址:https://www.cnblogs.com/unclemac/p/12783344.html
Copyright © 2011-2022 走看看