[STM32F1] 这个死区时间是如何计算的

[复制链接]
264|12
手机看帖
扫描二维码
随时随地手机跟帖
比神乐|  楼主 | 2022-1-15 15:31 | 显示全部楼层 |阅读模式
我买了一个开发板,控制直流无刷电机。
死区时间大约1.8us.
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
  // The DeadTime=8(32+DTG[4:0])Tdts   DTG= C4            
  TIM_BDTRInitStructure.TIM_DeadTime = 0x6A; //  带死区 1.8us左右


1.png
晶振8兆。程序用的HAL库。
请高手指教,是如何计算的?谢谢!

使用特权

评论回复
lu50211| | 2022-1-15 16:50 | 显示全部楼层
一直没搞明白死区问题。

使用特权

评论回复
kiwis66| | 2022-1-17 09:03 | 显示全部楼层
哎呀,电机啊~

使用特权

评论回复
香水城| | 2022-1-17 17:41 | 显示全部楼层
本帖最后由 香水城 于 2022-1-17 17:42 编辑

首先 你先把DTS定下来:
535061e53943b1b79.png

然后在BDTR寄存器里配置UTG[7:0】,其中UTG的高三位 选择Tdtg的计数方式,即T_DTS的倍数关系

使用特权

评论回复
比神乐|  楼主 | 2022-1-18 09:10 | 显示全部楼层
谢谢!
1.png
但是这个CKD就好像没设置。
我在工程里搜CKD
2.png
那是不是按照默认的值呀?
void  Tim1_PWM_Init(void)
{

        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef       TIM_OCInitStructure;
  TIM_BDTRInitTypeDef     TIM_BDTRInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        /* Enable TIM1 clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);       

  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;       //  模式增
  TIM_TimeBaseStructure.TIM_Period = 5999;                    //    从装比较最大  18k  =   72000/ 6000= 12k   
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;                 //  分频
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;      
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;                               //  控制占空比

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ;         //  上桥臂
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High ;        // 下桥臂
       
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;

  TIM_OC1Init(TIM1, &TIM_OCInitStructure);                         //  比较单元1 2 3
  TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  TIM_OC3Init(TIM1, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);               //  
  TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
  TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);

  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
  // The DeadTime=8(32+DTG[4:0])Tdts   DTG= C4            
  TIM_BDTRInitStructure.TIM_DeadTime = 0x6A; //  带死区 1.8us左右
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);       

        TIM_ClearITPendingBit(TIM1, TIM_IT_Break);  //清中断标志位
  TIM_ITConfig(TIM1,TIM_IT_Break ,ENABLE); //使能中断
       
        TIM_ClearFlag(TIM1, TIM_FLAG_Update);  
        TIM_ClearITPendingBit(TIM1, TIM_IT_Update);  //清中断标志位
  TIM_ITConfig(TIM1,TIM_IT_Update ,ENABLE); //打开中断

  TIM_Cmd(TIM1, ENABLE);//计数开始
        TIM_CtrlPWMOutputs(TIM1, ENABLE);

/* Configure one bit for preemption priority */
        //选择优先级分组
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       
        //配置TIM1的刹车中断使能
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_BRK_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//指定抢占优先级0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//指定抢占优先级0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
       
        //配置TIM1的更新中断使能
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//指定抢占优先级1
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//指定抢占优先级0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}





使用特权

评论回复
比神乐|  楼主 | 2022-1-18 09:27 | 显示全部楼层
3.png
按Tdtg=Tdts,
The DeadTime=8(32+DTG[4:0])Tdts   DTG= C4
8(32+4)*125=36uS.肯定不对。
按手册上
4.png
DTG也没设置,只是注释C4
196*125=149.5US
我越弄越糊涂。

使用特权

评论回复
香水城| | 2022-1-18 14:40 | 显示全部楼层
首先 你要确定定时器的时钟是多少,如果是F1的话,一般是72MHz 或64MHz.

手册中的8MHz 只是举个例而已.

那么 如果CKD【1:0】是默认值00的话,Tdts=Tck_int.

如果这里DTG=0XC4, 则DT =(32+4)*8*Tdts

使用特权

评论回复
香水城| | 2022-1-18 14:45 | 显示全部楼层
还有,你可以基于调试功能看看DTG的配置到底是多少。
顺便提下,你看得中文手册那个地方有点问题,是DTG,不是UTG.
8974161e661fddf494.png

使用特权

评论回复
比神乐|  楼主 | 2022-1-18 15:04 | 显示全部楼层
谢谢!DTG=0x6A
5.png

使用特权

评论回复
比神乐|  楼主 | 2022-1-18 15:07 | 显示全部楼层
6.png
CKD=0

使用特权

评论回复
比神乐|  楼主 | 2022-1-18 15:12 | 显示全部楼层
本帖最后由 比神乐 于 2022-1-18 16:05 编辑

死区时间
106*125=13.25us
或者
13.25/9=1.472us
或者
13.25/8=1.656us

使用特权

评论回复
asmine| | 2022-1-24 17:10 | 显示全部楼层
看了半天,还是没搞清死区时间,看来我不适合玩电机

使用特权

评论回复
比神乐|  楼主 | 2022-1-25 08:13 | 显示全部楼层
我也不适合,板子炸了两块了,我都不敢上电了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则