看了一些网上讲死区时间计算的教程,觉得讲述的不是很清楚,所以在此用我自己理解的方式讲述一遍,如有错误,请读者赐教。
  死区时间的设置:由寄存器“TIM1和TIM8刹车和死区寄存器TIMX_BDTR”中,位DTG[7:0]控制(中文数据手册可能出现错误,应当是DTG)。



  官方数据手册的说明不容易看懂,举的例子与我的应用场合也不一致,我使用的是72MHz的晶振,讲一讲我的死区时间是怎么算出来的。
DT死区时间;
TDTS为系统时钟周期时长;
TDTG为系统周期时长乘以倍数,这个值用于计算最终死区时间,也叫作步长。
在72M的定时器时钟下,TDTS = 1/72M = 13.89ns。
  这个计算比较复杂,主要思想就是把DTG的八位,掰成两半用。一半决定步长,另一半是与步长相乘的乘数,乘数可以自行设定,步长*乘数=死区时间。至于步长与乘数从哪里分开,看下表

项目 情况1 情况2 情况3 情况4
步长位置 DTG[7] DTG[7:6] DTG[7:5] DTG[7:5]
步长值(二进制) 1 10 110 111
步长是周期几倍 1 2 8 16
乘数位置 DTG[6:0] DTG[5:0] DTG[4:0] DTG[4:0]
乘数最大值 127 64+63 63+31 32+31
乘数范围 0~127 64~127 32~63 34~63
等价几倍周期 0~127 128~254 256~504 512~1008
周期125ns时,死区范围ns 0~15875 16000~31750 32000~63000 64000~126000
周期13.89ns时,死区范围ns 0~1764 1778~3528 3556~7000 7112~14001

接下来举例说明表格怎么用。
  例如72MHz的晶振,需要14us的死区时间,那么属于情况4,DTG[7:5] = 0b111,DTG[4:0]=31=0b11111,所以DTG = 0xff。72MH晶振的情况下,最大只能14us的死区。
  还是72MHz的晶振,需要3us的死区时间,那么属于情况2,DTG[7:6] = 0b10,步长=27.78,需要的乘数 = 3000÷27.78-64=108-64=44=0b101100,DTG[7:0]=0b10101100=0xAC。
  实际的系统中,死区的时间一般由硬件的响应速度决定。我的系统使用的驱动电路设计参考之前的博客
  使用的电机型号是JGB37-3530B。经过测试,3us的死区时间可以使用。
  下边是电机初始化的函数,主要的功能是用STM32的高级定时器TIM1,输出嵌入死区的互补PWM。
  使用两个通道输出PWM,通道1 的引脚是PA8和PB13,通道2 的引脚是PA9和PB14。一个周期是1ms,频率是1KHz,3us的死区时间。默认通道1的占空比是50%,通道2的占空比是0%,让电机以49.7%(占空比减去死区)的速度正转。

void PWM_Configuration(void)
{GPIO_InitTypeDef    GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;TIM_BDTRInitTypeDef TIM_BDTRInitStructure;NVIC_InitTypeDef NVIC_InitStructure;//开启TIM和相应端口时钟//启动GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_GPIOB,ENABLE);//启动AFIORCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//启动TIM1RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//GPIO做相应设置,为AF输出             //PA8,PB13一组互补输出  A9,PB14一组互补输出//PA.8/9口设置为TIM1的OC1输出口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//PB.13/14口设置为TIM1_CH1N和TIM1_CH2N输出口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_9);GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);    NVIC_InitStructure.NVIC_IRQChannel =  TIM1_UP_IRQn;    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  NVIC_Init(&NVIC_InitStructure);//TIM1基本计数器设置(设置PWM频率)1KHz TIM_BaseInitStructure.TIM_Period = 1000-1;      //1khz  好计算。按照1%的精确度,理论最大72000/100 = 720KHzTIM_BaseInitStructure.TIM_Prescaler = 72-1;TIM_BaseInitStructure.TIM_ClockDivision = 0;TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数TIM_BaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);//启用ARR的影子寄存器(直到产生更新事件才更改设置)TIM_ARRPreloadConfig(TIM1, ENABLE);//TIM1_OC1模块设置(设置1通道占空比)TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//TIM脉冲宽度调制模式1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出通道使能TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//互补输出TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;//TIM输出比较极性高//TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;TIM_OCInitStructure.TIM_Pulse = 500;//待装入捕获比较寄存器的脉冲值TIM_OC1Init(TIM1, &TIM_OCInitStructure);//启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//TIM1_OC2模块设置(设置2通道占空比)TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;TIM_OC2Init(TIM1, &TIM_OCInitStructure);//启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);//OCx输出信号与参考信号相同,只是它的上升沿相对参考信号的上升沿有一个延迟//OCxN输出信号与参考信号相同,只是它的上升沿相对参考信号的下降沿有一个延迟//死区设置TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_2;TIM_BDTRInitStructure.TIM_DeadTime = 0xAC; //这里调整死区大小为3us      TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);//TIM1_OC通道输出PWMTIM_CtrlPWMOutputs(TIM1, ENABLE);//TIM1开启TIM_Cmd(TIM1, ENABLE);
}

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

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

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

  2. STM32 TIM高级定时器死区时间的计算

    STM32 TIM高级定时器的互补PWM支持插入死区时间,本文将介绍如何计算以及配置正确的死区时间. 文章目录 什么是死区时间? 数据手册的参数 如何计算合理的死区时间? STM32中配置死区时间 什 ...

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

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

  4. STM32F103高级定时器使用

      STM32F103单片机中定时器分为3种,高级定时器.通用定时器.基本定时器.   高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动.它适合多种用 ...

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

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

  6. STM32F103高级定时器作输入捕获(以TIM1通道4为例)

    毕业设计需要使用比较多的定时器,但手上的F103C8T6核心板定时器资源比较少,所以被迫使用高级定时器1(一直都是用通用定时器,毕竟以前玩F429的时候管脚资源充足,就没有去学习高级定时器的用法,以为 ...

  7. STM32高级定时器死区时间的配置及计算

    互补输出和死区插入 1. 死区概念 高级控制定时器(TIM1 和 TIM8)可以输出两路互补信号,并管理输出的关断与接通瞬间.这段时间通常称为死区,用户必须根据与输出相连接的器件及其特性(电平转换器的 ...

  8. STM32F103的11个定时器详解 高级定时器pwm

    STM32F103VC这款单片机一共有2个高级定时器TIM1和TIM8 这2个高级定时器都可以同时产生3路互补带死区时间的PWM信号和一路单独的PWM信号, 具有刹车输入功能,在紧急的情况下这个刹车功 ...

  9. STM32———高级定时器的死区时间计算方法

    STM32---高级定时器的死区时间计算方法 1.定时器的时钟分频因子和预分频系数的区别: 1.1 时钟分频因子(Clock division),决定定时器的工作时钟频率. tDTS=fDTS ; t ...

最新文章

  1. NA,NP,IE学习之路
  2. 多线程问题导致的JDBMonitor的bug分析
  3. python入门作业编程题-python入门(一)作业
  4. WIN32 使用事件实现高效生产者消费者模型
  5. win10安装docker desktop之后没有ADVANCED选项解决办法
  6. spark python 上传代码包_使用 Livy Rest API 提交 spark 批量任务 (jar,Python, streaming)...
  7. install scikit-learn
  8. HTTP 请求之URLs 与 URNs
  9. ecshop最全去版权
  10. 快速接入阿里云应用配置管理工具 轻松开启企业效率新时代
  11. tempdb 数据文件暴涨
  12. 标准库Allocator的简易实现(二)
  13. matlab曲线拟合幅频特性曲线_频域稳定性与matlab指令计算
  14. 原生拨号盘设置电信卡呼叫转移概率失败
  15. 【hdu】6441 Find Integer - 费马大定理
  16. android mac 照片恢复,照片恢复
  17. UVA 1603 Square Destroyer
  18. sharedpreferences存不进去_搞笑:主人买了一个钢铁侠模型,小猫咪直接就坐进去了...
  19. Springboot整合JPA多数据源(Oracle+Mysql)
  20. 关于.net介绍 /第一行C#代码 /什么是面向对象

热门文章

  1. CodeForces - 510A 蛇形图案输出 难度:C++入门 复杂度:简单 翻译难度:一般
  2. ​居家?如何获得一个公网IP​
  3. 几种常见代码管理工具比较(2009)
  4. Excel表格中实现IP地址排序
  5. 一键安装微信已完成,编号10,欢迎品尝
  6. 硬盘内部硬件结构和工作原理详解
  7. 为 Surface Pro 3 全新安装 Windows 10 技术预览版
  8. MarkdownPad2安装教程
  9. 【转载】如何学习统计学,或我的学习之路——初学者写给初学者
  10. 大恒相机开发实践(1)——实时采图