STM32高级定时器死区时间设置探究
STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时。。。
STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)⾼级定时。
⽂章结构:——> ⼀、定时器基本介绍——> ⼆、普通定时器详细介绍TIM2-TIM5——> 三、定时器代码实例⼀、定时器基本介绍之前有⽤过野⽕的学习板上⾯讲解很详细,所以直接上野⽕官⽅的资料吧,作为学习参考笔记发出来⼆、普通定时器详细介绍TIM2-TIM52.1 时钟来源计数器时钟可以由下列时钟源提供:·内部时钟(CK_INT)·外部时钟模式1:外部输⼊脚(TIx)·外部时钟模式2:外部触发输⼊(ETR)·内部触发输⼊(ITRx):使⽤⼀个定时器作为另⼀个定时器的预分频器,如可以配置⼀个定时器Timer1⽽作为另⼀个定时器Timer2的预分频器。
由于今天的学习是最基本的定时功能,所以采⽤内部时钟。
TIM2-TIM5的时钟不是直接来⾃于APB1,⽽是来⾃于输⼊为APB1的⼀个倍频器。
这个倍频器的作⽤是:当APB1的预分频系数为1时,这个倍频器不起作⽤,定时器的时钟频率等于APB1的频率(36MHZ);当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作⽤,定时器的时钟频率等于APB1的频率的2倍。
{假如APB1预分频为2(变成36MHZ),则定时器TIM2-5的时钟倍频器起作⽤,将变成2倍的APB1(2x36MHZ)将为72MHZ给定时器提供时钟脉冲。
⼀般APB1和APB2的RCC时钟配置放在初始化函数中例如下⾯的void RCC_Configuration(void)配置函数所⽰,将APB1进⾏2分频,导致TIM2时钟变为72MHZ输⼊。
如果是1分频则会是36MHZ输⼊,如果4分频:CKINT=72MHZ/4x2=36MHZ; 8分频:CKINT=72MHZ/8x2=18MHZ;16分频:CKINT=72MHZ/16x2=9MHZ}1//系统时钟初始化配置2void RCC_Configuration(void)3 {4//定义错误状态变量5 ErrorStatus HSEStartUpStatus;6//将RCC寄存器重新设置为默认值7 RCC_DeInit();8//打开外部⾼速时钟晶振9 RCC_HSEConfig(RCC_HSE_ON);10//等待外部⾼速时钟晶振⼯作11 HSEStartUpStatus = RCC_WaitForHSEStartUp();12if(HSEStartUpStatus == SUCCESS)13 {14//设置AHB时钟(HCLK)为系统时钟15 RCC_HCLKConfig(RCC_SYSCLK_Div1);16//设置⾼速AHB时钟(APB2)为HCLK时钟17 RCC_PCLK2Config(RCC_HCLK_Div1);18 //设置低速AHB时钟(APB1)为HCLK的2分频(TIM2-TIM5输⼊TIMxCLK频率将为72MHZ/2x2=72MHZ输⼊)19 RCC_PCLK1Config(RCC_HCLK_Div2);20//设置FLASH代码延时21 FLASH_SetLatency(FLASH_Latency_2);22//使能预取指缓存23 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);24//设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz25 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);26//使能PLL27 RCC_PLLCmd(ENABLE);28//等待PLL准备就绪29while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);30//设置PLL为系统时钟源31 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);32//判断PLL是否是系统时钟33while(RCC_GetSYSCLKSource() != 0x08);34 }35//允许TIM2的时钟36 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);37//允许GPIO的时钟38 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);39 }APB1的分频在STM32_SYSTICK的学习笔记中有详细描述。
STM32TIM高级定时器死区时间的计算
STM32TIM⾼级定时器死区时间的计算STM32 TIM⾼级定时器的互补PWM⽀持插⼊死区时间,本⽂将介绍如何计算以及配置正确的死区时间。
⽂章⽬录什么是死区时间?死区时间主要是在逆变电路中,防⽌⼀个桥臂的上下两个开关器件同时导通,那么会导致电路电流上升,从⽽对系统造成损害。
因为开关元器件的t don tdon和t doff tdoff严格意义并不是相同的。
所以在驱动开关元器件门极的时候需要增加⼀段延时,确保另⼀个开关管完全关断之后再去打开这个开关元器件,这⾥的延时就是需要施加的死区时间。
数据⼿册的参数这⾥看了⼀下NXP的IRF540的数据⼿册,门极开关时间如下所⽰;然后找到相关的t don tdon,t dff tdff,t r tr,t f tf的相关典型参数;t don tdon:门极的开通延迟时间t doff tdoff:门极的关断延迟时间t r tr:门极上升时间t f tf:门极下降时间下⾯是⼀个IGBT的数据⼿册;下图是IGBT的开关属性,同样可以找到t don tdon,t dff tdff,t r tr,t f tf等参数,下⾯计算的时候会⽤到;如何计算合理的死区时间?这⾥⽤t dead tdead表⽰死区时间,因为门极上升和下降时间通常⽐延迟时间⼩很多,所以这⾥可以不⽤考虑它们。
则死区时间满⾜;T dead=[(T doffmax−T donmin)+(T pddmax−T pddmin)]∗1.2Tdead=[(Tdoffmax−Tdonmin)+(Tpddmax−Tpddmin)]∗1.2 T doffmax Tdoffmax:最⼤的关断延迟时间;T donmin Tdonmin:最⼩的开通延迟时间;T pddmax Tpddmax:最⼤的驱动信号传递延迟时间;T pddmin Tpddmin:最⼩的驱动信号传递延迟时间;其中T doffmax Tdoffmax和T donmin Tdonmin正如上⽂所提到的可以元器件的数据⼿册中找到;T pddmax Tpddmax和T pddmin Tpddmin⼀般由驱动器⼚家给出,如果是MCU的IO驱动的话,需要考虑IO的上升时间和下降时间,另外⼀般会加光耦进⾏隔离,这⾥还需要考虑到光耦的开关延时。
STM32高级定时器使用方法及注意事项
STM32高级定时器使用方法及注意事项By 深圳市威睿晶科Felix主要特性:高级定时器与通用定时器的主要差别如下红色区域●16位向上、向下、向上/下自动装载计数器●16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值●多达4个独立通道:─ 输入捕获─ 输出比较─ PWM生成(边缘或中间对齐模式)─ 单脉冲模式输出●死区时间可编程的互补输出●使用外部信号控制定时器和定时器互联的同步电路●允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器●刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态●如下事件发生时产生中断/DMA:─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─ 输入捕获─ 输出比较─ 刹车信号输入●支持针对定位的增量(正交)编码器和霍尔传感器电路●触发输入作为外部时钟或者按周期的电流管理如上所示,对于一般地应用是体现不出来它高端的地方了。
使用心得:由于V3.5库函数将定时器资源全部融合在一块了,所以显得stm32f10x_tim.c库特别庞大,找功能函数很是麻烦,还容易搞混乱。
面对这种情况寄存器操作就显得很方便了,所以以下程序我是直接参考寄存器说明来逐步配置的,阅读起来不太方便,但写起来方便,而且不会重复混乱,更容易理解到定时器的工作过程。
1 首先是作为定时器的通用功能:定时定时功能的实现,是通过设置定时时钟为内部时钟源来实现,如手册上介绍:“如果禁止了从模式控制器(SMS=000),则CEN、DIR(TIMx_CR1寄存器)和UG 位(TIMx_EGR寄存器)是事实上的控制位,并且只能被软件修改(UG位仍被自动清除)。
只要CEN位被写成’1’,预分频器的时钟就由内部时钟CK_INT提供。
”配置步骤如下:void TIM1Timing(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB 2Periph_GPIOA,ENABLE); //打开TIM1时钟TIM1->CR1 =0x380 ;//456bit=0,向上计数TIM1->SMCR&=0xfff8;//sms=000,禁止从模式控制器TIM1->PSC=7199;//设置预分频,公式fCK_PSC/( PSC[15:0]+1)= 0.1Mhz,100us/+1TIM1->ARR=10000;//设置自动重装载值为10000,即溢出一次时间为1STIM1->RCR=0;//重复计数寄存器为0,这个是设置事件(中断)频率的,为0即溢出1次中断标志置位TIM1->EGR|=1;重新初始化计数器,即清空计数器(要是向上计数则清0,要是向下计数则填装自动装载值)TIM1->SR&=0x0000;//清中断标志TIM1->DIER|=1;//开启更新中断,即出现一次溢出事件中断一次TIM1->CR1|=0X001;//打开定时器1}这样就实现了最基本的定时功能,可以在中断函数里实现1S的定时处理2,输入捕获功能:InputCapture这个功能可以很方便的计算出输入信号的频率,兼具外部计数以及内部定时的功能手册上的实现步骤:是以配置TIM1的通道1-TI1为例的●选择有效输入端:TIMx_CCR1必须连接到TI1输入,所以写入TIMx_CCR1寄存器中的CC1S=01,只要CC1S不为’00’,通道被配置为输入,并且TIMx_CCR1寄存器变为只读。
STM32的定时器定时时间计算(计数时间和中断定时时间)
STM32的定时器定时时间计算(计数时间和中断定时时间)时基单元可编程⾼级控制定时器的主要部分是⼀个16位计数器和与其相关的⾃动装载寄存器。
这个计数器可以向上计数、向下计数或者向上向下双向计数。
此计数器时钟由预分频器分频得到。
计数器、⾃动装载寄存器和预分频器寄存器可以由软件读写,即使计数器还在运⾏读写仍然有效。
时基单元包含:●计数器寄存器(TIMx_CNT)●预分频器寄存器 (TIMx_PSC)●⾃动装载寄存器 (TIMx_ARR)●重复次数寄存器 (TIMx_RCR)⾃动装载寄存器是预先装载的,写或读⾃动重装载寄存器将访问预装载寄存器。
根据在TIMx_CR1寄存器中的⾃动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被⽴即或在每次的更新事件UEV时传送到影⼦寄存器。
当计数器达到溢出条件(向下计数时的下溢条件)并当TIMx_CR1寄存器中的UDIS位等于0时,产⽣更新事件。
更新事件也可以由软件产⽣。
随后会详细描述每⼀种配置下更新事件的产⽣。
计数器由预分频器的时钟输出CK_CNT驱动,仅当设置了计数器TIMx_CR1寄存器中的计数器使能位(CEN)时,CK_CNT才有效。
(更多有关使能计数器的细节,请参见控制器的从模式描述)。
注意,在设置了TIMx_CR寄存器的CEN位的⼀个时钟周期后,计数器开始计数。
预分频器描述预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。
它是基于⼀个(在TIMx_PSC寄存器中的)16位寄存器控制的16位计数器。
因为这个控制寄存器带有缓冲器,它能够在运⾏时被改变。
新的预分频器的参数在下⼀次更新事件到来时被采⽤。
尤其注意的是当发⽣⼀个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器中的UIF位)。
●重复计数器被重新加载为TIMx_RCR寄存器的内容。
●⾃动装载影⼦寄存器被重新置⼊预装载寄存器的值(TIMx_ARR)。
STM32高级定时器死区时间设置探究
STM32高级定时器死区时间设置探究一、死区设置位置:决定死区时间设置的位是‘刹车和死区寄存器TIM1->BDTR’中的DTG[7:0],设置范围是0x00~0xff。
二、死区时间设置公式如下:DT为死区持续时间,TDTS为系统时钟周期时长,Tdtg为系统时钟周期时长乘以倍数后的死区设置时间步进值。
在72M的定时器时钟下TDTS=1/72M=13.89ns.所以以第一个公式,死区时间能以13.89ns的步进从0调整到127*13.89ns=1764ns第二个公式则能(64+0)*2*13.89~(64+63)*2*13.89=1777.9ns~3528.88ns换个角度看,就是(128~254)*13.89同理,第三个公式就是3555.84ns~7000.56ns换个角度看,就是(256~504)*13.89第四个公式就是7111.68ns~14001.12ns换个角度看,就是(512~1008)*13.89综上:死区时间就是不同的公式代表不同范围的死区时间设置,这个范围是互不重叠的。
而但是在不同的死区时间范围内死区时间设置步进是不同的。
若某个系统时钟下的死区时间不够,可以通过改变定时器时钟来改变最大死区时间范围。
当根据硬件电路的特性定下死区时间后,可以根据目标死区时间范围来找到相应的公式,然后代入公式求解出相应的整数(有时候不一定是整数,那就选择最近的那个),拼接DTG[7:5]+DTG[4:0]即可。
例子:这样当我需要3us的死区持续时间时,则可这么计算:3us在第二个公式决定的死区范围之内。
所以选择第二个公式。
3000/(13.89*2)=108,所以DTG[5:0]=108-64=44,所以DTG=127+44=171=0XabTIM1->BDTR|=0xab;反过来验算//72Mhz,死区时间=13.89nsX108*2=3000us经示波器验证,完全正确。
By zxx2013.07.18。
STM32高级定时器详解
STM32高级定时器详解高级定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱。
它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM 等)。
使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。
高级控制定时器和通用定时器是完全独立的,它们不共享任何资源。
它们可以同步操作。
Table 457. TIM寄存器寄存器描述CR1 控制寄存器1CR2 控制寄存器2SMCR 从模式控制寄存器DIER DMA/中断使能寄存器SR 状态寄存器EGR 事件产生寄存器CCMR1 捕获/比较模式寄存器1CCMR2 捕获/比较模式寄存器2CCER 捕获/比较使能寄存器CNT 计数器寄存器PSC 预分频寄存器APR 自动重装载寄存器CCR1 捕获/比较寄存器1CCR2 捕获/比较寄存器2CCR3 捕获/比较寄存器3CCR4 捕获/比较寄存器4DCR DMA控制寄存器DMAR 连续模式的DMA地址寄存器Table 458. 例举了TIM的库函数Table 458. TIM库函数函数名描述TIM_DeInit 将外设TIMx寄存器重设为缺省值TIM_TimeBaseInit根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCInit 根据TIM_OCInitStruct 中指定的参数初始化外设TIMxTIM_ICInit 根据TIM_ICInitStruct 中指定的参数初始化外设TIMx TIM_TimeBaseStructInit 把TIM_TimeBaseInitStruct 中的每一个参数按缺省值填入TIM_OCStructInit 把TIM_OCInitStruct 中的每一个参数按缺省值填入TIM_ICStructInit 把TIM_ICInitStruct 中的每一个参数按缺省值填入TIM_Cmd 使能或者失能TIMx 外设TIM _ITConfig 使能或者失能指定的TIM 中断TIM_DMAConfig 设置TIMx的DMA接口TIM_DMACmd 使能或者失能指定的TIMx 的DMA请求TIM_InternalClockConfig 设置TIMx 内部时钟TIM_ITRxExternalClockConfig 设置TIMx 内部触发为外部时钟模式TIM_TIxExternalClockConfig 设置TIMx 触发为外部时钟TIM_ETRClockMode1Config 配置TIMx 外部时钟模式1TIM_ETRClockMode2Config 配置TIMx 外部时钟模式2TIM_ETRConfig 配置TIMx 外部触发TIM_SelectInputTrigger 选择TIMx 输入触发源TIM_PrescalerConfig 设置TIMx 预分频TIM_CounterModeConfig 设置TIMx 计数器模式TIM_ForcedOC1Config 置TIMx 输出1 为活动或者非活动电平TIM_ForcedOC2Config 置TIMx 输出2 为活动或者非活动电平TIM_ForcedOC3Config 置TIMx 输出3 为活动或者非活动电平TIM_ForcedOC4Config 置TIMx 输出4 为活动或者非活动电平TIM_ARRPreloadConfig 使能或者失能TIMx在ARR 上的预装载寄存器TIM_SelectCCDMA 选择TIMx 外设的捕获比较DMA源TIM_OC1PreloadConfig 使能或者失能TIMx在CCR1 上的预装载寄存器TIM_OC2PreloadConfig 使能或者失能TIMx在CCR2 上的预装载寄存器TIM_OC3PreloadConfig 使能或者失能TIMx在CCR3 上的预装载寄存器TIM_OC4PreloadConfig 使能或者失能TIMx在CCR4 上的预装载寄存器TIM_OC1FastConfig 设置TIMx 捕获比较1 快速特征。
STM32定时器定时时间配置总结
STM32定时器定时时间配置总结STM32系列微控制器内置了多个定时器模块,它们可以用于各种定时功能,如延时、周期性触发、脉冲计数等。
在使用STM32定时器之前,我们需要进行定时时间配置,本文将总结一下STM32定时器定时时间配置的相关知识,包括定时器工作模式、定时器时钟源选择、定时器时钟分频、定时器计数器重载值以及定时器中断配置等内容。
首先,我们需要选择定时器的工作模式。
STM32定时器支持多种工作模式,包括基本定时器模式、高级定时器模式、输入捕获模式和输出比较模式等。
基本定时器模式适用于简单的定时和延时操作,输入捕获模式适用于捕获外部事件的时间参数,输出比较模式适用于产生精确的PWM波形。
根据具体的应用需求,选择合适的工作模式。
其次,我们需要选择定时器的时钟源。
STM32定时器的时钟源可以选择内部时钟源(如系统时钟、HCLK等)或外部时钟源(如外部晶体)。
内部时钟源的稳定性较差,适用于简单的定时操作,而外部时钟源的稳定性较好,适用于要求较高的定时操作。
然后,我们需要选择定时器的时钟分频系数。
定时器的时钟分频系数决定了定时器的时钟频率,从而影响了定时器的计数速度。
我们可以通过改变时钟分频系数来调整定时器的计数速度,从而实现不同的定时时间。
时钟分频系数的选择需要考虑定时器的最大计数周期和所需的定时精度。
接着,我们需要配置定时器的计数器重载值。
定时器的计数器从0开始计数,当计数器达到重载值时,定时器将重新开始计数。
通过改变计数器重载值,可以实现不同的定时时间。
计数器重载值的选择需要考虑定时器的时钟频率和所需的定时时间。
最后,我们需要配置定时器的中断。
定时器中断可以在定时器计数达到重载值时触发,用于通知CPU定时器已经计数完成。
在定时器中断中,我们可以执行相应的中断服务程序,比如改变一些IO口的状态,实现定时操作。
通过配置定时器的中断使能和中断优先级,可以实现不同的中断操作。
需要注意的是,不同型号的STM32微控制器的定时器模块可能略有不同,具体的配置方法和寄存器设置也可能不同,请参考相应的数据手册和参考手册进行具体操作。
STM32定时器之定时时间
STM32定时器之定时时间STM32的定时器是个强⼤的模块,定时器使⽤的频率也是很⾼的,定时器可以做⼀些基本的定时,还可以做PWM输出或者输⼊捕获功能。
时钟源问题:名为TIMx的有⼋个,其中TIM1和TIM8挂在APB2总线上,⽽TIM2-TIM7则挂在APB1总线上。
其中TIM1&TIM8称为⾼级控制定时器(advanced control timer).他们所在的APB2总线也⽐APB1总线要好。
APB2可以⼯作在72MHz下,⽽APB1最⼤是36MHz。
定时器的时钟不是直接来⾃APB1或APB2,⽽是来⾃于输⼊为APB1或APB2的⼀个倍频器。
下⾯以定时器2~7的时钟说明这个倍频器的作⽤:当APB1的预分频系数为1时,这个倍频器不起作⽤,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作⽤,定时器的时钟频率等于APB1的频率两倍。
假定AHB=36MHz,因为APB1允许的最⼤频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作⽤);当预分频系数=2时,APB1=18MHz,在倍频器的作⽤下,TIM2~7的时钟频率=36MHz。
有⼈会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,⽽且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使⽤较低时钟频率时,TIM2~7仍能得到较⾼的时钟频率。
再举个例⼦:当AHB=72MHz时,APB1的预分频系数必须⼤于2,因为APB1的最⼤频率只能为36MHz。
如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。
能够使⽤更⾼的时钟频率,⽆疑提⾼了定时器的分辨率,这也正是设计这个倍频器的初衷。
stm32定时实验原理
stm32定时实验原理
STM32的定时实验原理主要基于其内部的定时器模块。
STM32具有多个定时器,每个定时器都有自己的计数器和预分频器。
通过配置这些组件,可以产生不同频率的定时中断或PWM信号。
在定时实验中,通常会使用STM32的定时器模块来产生一个固定频率的脉冲信号。
这个脉冲信号可以用于驱动其他设备或产生特定的实验效果。
具体来说,定时器的工作原理如下:
1. 初始化定时器:首先,需要配置定时器的计数器、预分频器和输出比较等参数。
计数器用于计算定时时间,预分频器用于减缓计数速度,输出比较用于产生PWM信号或其他控制信号。
2. 启动定时器:通过设置定时器的启动位,启动定时器开始计数。
3. 计数到设定值:当计数器计数到设定值时,会触发一个中断或产生一个PWM信号。
这个中断或PWM信号可以用于控制其他设备的动作或状态。
4. 重新加载:当计数器计到最大值时,会自动重新加载计数器的值,并继续计数。
这样,定时器就可以连续产生中断或PWM信号。
在STM32的定时实验中,还可以使用其他功能,如输入捕获、死区时间设置等,来进一步丰富实验内容。
通过合理配置这些功能,可以实现各种复杂的定时控制和实验效果。
STM32高级定时器死区控制
STM32高级定时器都带有死区控制功能,一般来说死区控制主要用于马达、变频器等控制。
一、死区时间概念BLDC控制换相电路如下死区时间是两路互补PWM输出时,为了使桥式换相电路上管T1和下管T2、上管T3和下管T4、上管T5和下管T6不会因为开关速度问题发生同时导通(同时导通电源会短路)而设置的一个保护时段。
假设STM32高级定时器OCX和OCXN输出互补通道PWM,极性都是高电平有效,则下图中标注“延迟”那段时间就是死区时间,此时间段上管和下管都没有导通。
二、STM32高级定时器死区时间计算1. 配置寄存器2. 死区时间计算示例假设STM32F407的高级定时器TIM1的时钟为168MHz,设置tDTS=1/168us。
死区时间设置2us,经过估算该死区时间落在DTG[7:5]=110段。
(32+DTG[4:0]) /21 us= 2us,计算出DTG[4:0]=10=01010B,再与DTG[7:5]拼接,最后算得DTG[7:0]=10=11001010B=0xCA。
死区时间设置4us,经过估算该死区时间落在DTG[7:5]=111段。
2*(32+DTG[4:0]) /21 us= 4us,计算出DTG[4:0]=10=01010B,再与DTG[7:5]拼接,最后算得DTG[7:0]=10=11101010B=0xEA。
需注意死区时间计算是分段计算,每段公式不一样。
三、配置死区时间过程可能出现的问题问题:发现插入死区时间后,没有互补脉冲输出了。
一般是死区参数设置不合适导致出现了以下两种情况。
如果延迟时间大于有效输出(OCx 或OCxN)的宽度,则不会产生相应的脉冲。
注意:插入死区是为了保证桥式驱动电路中上下桥臂的开关管不会同时导通,提高控制安全性,但不是死区时间越长越好,死区是以牺牲开关管有效驱动脉冲时间为代价的,死区时间长短是由开关管硬件开关的速度决定。
STM32学习之定时器
STM32定时器一、STM32定时器概述STM32有8个16位定时器,根据功能分为三种:1)TIM6和TIM7是基本定时器,只具有基本定时功能,即计数值超过预设值后触发中断或DMA请求,与51单片机相似;2)TIM2,TIM3,TIM4,TIM5是通用定时器,除了基本定时器的功能外,还具有输入捕获和输出比较的功能,输入捕获可以用于测量输入脉冲的频率及脉冲宽度,输出比较可以输出PWM;3)TIM1和TIM8为高级定时器,该定时器内部结构相对复杂,比通用定时器多了BRK和DTG两个结构,即多了刹车和死区时间控制的功能,隐刺适用于电机控制。
二、基础/通用定时器TIMx_CNT为计数器,当累加或递减到重载寄存器TIMx_ARR的值时,产生溢出事件,但通用定时器比基本定时器多了一个捕获/比较寄存器TIMx_CCR才具有输入捕获和输出比较的功能,当用于输入时,该寄存器为捕获寄存器,当用于输出时,该寄存器为比较寄存器。
下面简介两种模式下的工作过程分析。
1.输入功能首先将定时器配置为向上计数,并设定好重载值,若被测量信号足够长,应当把重载寄存器TIMx_ARR中的值设得大一点。
此时TIMx_CCR是作为捕获寄存器,测量脉冲信号的过程分为以下三个过程:1)待测量的信号通过GPIO引脚输入到脉冲测量通道,当信号的上升沿来临时,脉冲计数器TIMx_CNT的值清零;2)TIMx_CNT开始累加,直到被测信号的下降沿来临,捕获寄存器TIMx_CCR2将TIMx_CNT中的值x存储下来;3)当被测信号的上升沿再次来临时,TIMx_CCR1将TIMx_CNT中的值y存储下来,然后TIMx_CNT清零,到此被测信号的一个周期结束。
由上可知,被测信号的周期为y+1个定时器周期,占空比为(x+1)/(y+1)。
2.输出功能此模式下TIMx_CCR 为比较寄存器,先将定时器配置为向上/向下计数,重载寄存器TIMx_ARR 的值为N ,比较寄存器TIMx_CCR 值为M ,计数器不断累加/递减,计数值与M 比较,比它大/小时输出高电平,反之低电平,也就生成了PWM 波,占空比Duty=M/(N+1),这些模式可以在定时器PWM 结构体中的相应值配置。
stm32中死区函数
stm32中死区函数STM32中,死区函数被广泛应用于电机控制和电源电路等领域。
本文将对STM32中的死区函数进行详细的讲述,包括其概念、原理及应用等内容。
一、概念死区是电机驱动器设计时的一种特殊区域,它防止了两个独立的半桥开关同时通断,从而避免了瞬间短路。
因此,死区函数也称为“电机驱动器的瞬态保护功能”。
STM32中的死区函数(DeadTime)可以通过芯片内部的定时器控制,它能够延时开关开启和关闭,以确保电源电路中的电子元件在运行时保持安全和稳定。
二、原理死区函数通过控制某种波形(如正弦波或方波)的占空比来实现电机控制或电源电路的设计。
在控制器的输出信号中插入一个死区延迟,防止了两个半桥开关同时通断,避免了瞬间短路现象的发生,这就是死区函数的原理。
以STM32F407VG芯片为例,它具有四个通道,每个通道有两个半桥管。
STM32中死区函数的具体实现方法是通过使用定时器的死区控制寄存器来设置死区的时长。
三、应用死区函数广泛应用于电机控制和电源电路中。
在BLDC(无刷直流电机)驱动控制电路中,死区函数可以改善驱动器和电机之间的通信,从而有效减少了电机产生的噪声和振动。
在PWM(脉冲宽度调制)电源电路中,死区函数可以提高工作效率,减少损耗和热量,延长电源电路的使用寿命。
在STM32中的具体应用中,一般需要按照以下步骤进行:1、根据电机或电源电路的设计要求确定死区的时长。
2、使用STM32的定时器模块,配置死区控制寄存器。
3、将该代码嵌入到电机控制或电源电路的程序之中,即可实现死区的控制。
总之,STM32中的死区函数是一种非常重要的功能,它可以在电机控制和电源电路的设计中发挥重要作用,通过降低噪声和振动,延长电源电路使用寿命。
既能满足不同领域的设计要求,又能保证电路的安全和稳定性,是系统中不可或缺的一部分。
STM32定时器时钟配置技巧
STM32定时器时钟配置技巧众所周知STM32 的时钟配置⽐较复杂,⽽定时器的时钟配置更是 ‘奇葩‘。
如下图(截图⾃STM32F4编程⼿册)APB 的预分频器分频系数如果不为1,则定时器的时钟就倍频了反⽽。
配置技巧下⾯以STM32F4为例,这⾥配置定时器8的计数频率为 10Khz,从时钟树中可知TIM8挂在APB2总线获取当前 APB2(PLCK2) 的时钟频率获取 APB2 预分频器的分频值根据上述参数判断,如果分频值不为1,则定时器时钟 x2.Prescaler = xxx 这是⼀个推荐的写法int hw_timer_init(TIM_HandleTypeDef *htim){uint32_t FLatency, t8Clk;RCC_ClkInitTypeDef clkCfg;TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_OC_InitTypeDef sConfigOC = {0};/* USER CODE BEGIN TIM_Init 1 */t8Clk = HAL_RCC_GetPCLK2Freq();HAL_RCC_GetClockConfig(&clkCfg, &FLatency);if (clkCfg.APB2CLKDivider != RCC_HCLK_DIV1) {t8Clk = HAL_RCC_GetPCLK2Freq() * 2;}/* USER CODE END TIM1_Init 1 */htim->Instance = TIM8;htim->Init.Prescaler = (t8Clk / 10000) - 1;// 10Khtim->Init.CounterMode = TIM_COUNTERMODE_UP;htim->Init.Period = 0xFFFF;htim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim->Init.RepetitionCounter = 0;htim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;HAL_TIM_Base_Init(htim);...return 0;}```总结这种配置⽅法最⼤的好处就是该定时器不受底层时钟配置的影响,移植性也更好。
STM32f407系统定时器时钟配置计算
STM32f407系统定时器时钟配置计算首先,我们需要配置系统定时器的时钟源。
STM32F407的系统定时器可以使用内部时钟源(HCLK/8)或外部时钟源。
通过软件配置,我们可以选择其中一种时钟源。
1.配置内部时钟源:要使用内部时钟源,可以通过RCC寄存器来配置。
具体需要做以下几步:a. 使能系统定时器时钟:在 RCC_APBxENR 寄存器中设置位SysTickEN=1,其中 x 为适当的 APBx 总线索引。
b.配置系统定时器时钟源:在STK_CTRL寄存器中设置位CLKSOURCE=12.配置外部时钟源:如果要使用外部时钟源作为系统定时器的时钟源,我们需要将外部时钟源与系统的时钟树相连。
具体的配置方法因时钟源的不同而不同,可参考具体芯片的参考手册。
配置了系统定时器的时钟源后,我们可以计算定时器中断的时间间隔。
系统定时器中断的时间间隔=(计数器周期)*(重载值+1)/(时钟频率)其中,计数器周期为24位,取值范围为0~2^24-1、时钟频率为系统定时器的时钟源频率。
重载值是计数器的初始值,当计数器减到0时,会触发定时中断。
举个例子,假设系统定时器的时钟源频率为8MHz,我们希望计算系统定时器中断每100ms触发一次的重载值。
中断触发周期 = 100ms = 0.1s时钟频率=8MHz=8*10^6Hz由于重载值需要为整数,我们可以将计算结果四舍五入为最接近的整数,即重载值为477以上就是STM32F407系统定时器时钟配置和计算方法的简要介绍。
配置完系统定时器的时钟源,并计算出需要的重载值后,我们可以通过编程设置相关寄存器,来开始使用系统定时器进行定时中断的任务。
STM32的系统时钟设置SystemClock_Config()探究
STM32的系统时钟设置SystemClock_Config()探究⼀、⾸先了解⼏个硬件名词:stm32有多种时钟源,为HSE、HSI、LSE、LSI、PLL,对于L系统的,还有⼀个专门的MSI1、HSE是⾼速外部时钟,⼀般8M的晶振,精度⽐较⾼,⽐较稳定。
2、HSI是⾼速内部时钟,RC振荡器,频率为8MHz。
精度略差。
3、LSE是低速外部时钟,接频率为32.768kHz的⽯英晶体。
⼀般为RTC使⽤。
4、LSI是低速内部时钟,RC振荡器,频率为40kHz。
5、PLL为锁相环倍频输出,其时钟输⼊源可选择为HSI/2、HSE或者HSE/2。
倍频可选择为2~16倍,但是其输出频率最⼤不得超过72MHz。
6、MSI是L系列独有的,它是⼀个产⽣于内部的可选择的时钟源,能提供12种不同频率:100 kHz, 200 kHz, 400 kHz, 800 kHz, 1 MHz, 2 MHz, 4 MHz (default value), 8 MHz, 16 MHz, 24 MHz, 32 MHz and 48 MHz。
可以直接选择为系统主系统时钟,也可以作为PLL源,经倍频后选择作为系统的主系统时钟。
为低功耗提供更多的选择。
其相当于代替了HSI了。
stm32有多个总线,主要有AHB和APB总线AHB是⾼速总线,是⼀种系统总线,它主要负责连接处理器、DMA等⼀些内部接⼝。
AHB 系统由主模块、从模块和基础结构3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。
APB是低速总线,它主要负责连接外围设备,它⼜分为APB1和APB2,它的总线架构不像 AHB⽀持多个主模块,在APB⾥⾯唯⼀的主模块就是APB 桥。
APB桥就是连接AHB和APB中间的玩意。
APB1最⼤时钟频率为36MHzAPB2最⼤时钟频率为72MHz⼆、其次了解三个结构体:stm32的HAL库,在系统时钟设置的结构有,RCC_OscInitTypeDef和RCC_ClkInitTypeDef、RCC_PLLInitTypeDef三个。
STM32定时器解析
/* Enables the TIM2 counter */ TIM_Cmd(TIM2, ENABLE);
函数TIM _ITCONFIG
更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/ 外部触发) ;
触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ; 输入捕获; 输出比较 ; 支持针对定位的增量(正交)编码器和霍尔传感器电路; 触发输入作为外部时钟或者按周期的电流管理。
6.2 通用定时器TIMX相关寄存器
状态寄存器(TIMX_SR)
位0 (UIF):更新中断标记 (Update interrupt flag) 当产生更新事件时该位由硬件置’1’。它由软件清’0’。 0:无更新事件产生; 1:更新中断等待响应。 当寄存器被更新时该位由硬件置’1’:
− 若TIMx_CR1寄存器的UDIS=0、URS=0,当TIMx_EGR寄存器的UG=1时产生更 新事件(软件对计数器CNT重新初始化);
例: /* Clear the TIM2 Capture Compare 1 flag */ TIM_ClearFlag(TIM2, TIM_FLAG_CC1);
函数TIM_CLEARITPENDINGBIT
功能描述:清除TIMx的中断待处理位 函数原形:void TIM_ClearITPendingBit (TIM_TypeDef* TIMx, u16
TIM_CounterMode_Down
TIM 向下计数模式
TIM_CounterMode_CenterAligned1 TIM 中央对齐模式1计数模式
STM32库开发实战指南-M4:32- TIM—高级定时器
2{3if(TIM_GetITStatus(BASIC_TIM,TIM_IT_Update)!=RESET){4LED1_TOGGLE;5TIM_ClearITPendingBit(BASIC_TIM,TIM_IT_Update);6}7}我们在TIM_Mode_Config函数启动了定时器更新中断,在发生中断时,中断服务函数就得到运行。
在服务函数内我们先调用定时器中断标志读取函数TIM_GetITStatus获取当前定时器中断位状态,确定产生中断后才运行RGB彩灯翻转动作,并使用定时器标志位清除函数TIM_ClearITPendingBit清除中断标志位。
主函数代码清单31-6主函数1int main(void)2{34LED_GPIO_Config();56/*初始化基本定时器定时,1s产生一次中断*/7TIMx_Configuration();89while(1){10}11}实验用到RGB彩灯,需要对其初始化配置。
LED_GPIO_Config函数是定义在bsp_led.c文件的完成RGB彩灯GPIO初始化配置的程序。
TIMx_Configuration函数是定义在bsp_basic_tim.c文件的一个函数,它只是简单的先后调用TIMx_NVIC_Configuration和TIM_Mode_Config两个函数完成NVIC配置和基本定时器模式配置。
31.5.3下载验证保证开发板相关硬件连接正确,把编译好的程序下载到开发板。
开始RGB彩灯是暗的,等一会RGB彩灯变为红色,再等一会又暗了,如此反复。
如果我们使用表钟与RGB彩灯闪烁对比,可以发现它是每0.5s改变一次RGB彩灯状态的。
31.6每课一问1.计算基本定时器一次最长定时时间,如果需要使用基本定时器产生100s周期事件有什么办法实现?2.修改实验程序,在保使其每0.5s翻转一次LED1的同时在每10s翻转LED2。
第32章TIM—高级定时器本章参考资料:《STM32F4xx参考手册》、《STM32F4xx规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。
STM32通用定时器(时钟选择,模式选择)
STM32通⽤定时器(时钟选择,模式选择)STM32通⽤定时器STM32的定时器功能很强⼤,学习起来也很费劲⼉.其实⼿册讲的还是挺全⾯的,只是⽆奈TIMER的功能太复杂,所以显得⼿册很难懂,我就是通过这样看⼿册:while(!SUCCESS){看⼿册…}才搞明⽩的!所以接下来我以⼿册的顺序为主线,增加⼀些⾃⼰的理解,并通过11个例程对TIMER做个剖析。
实验环境是STM103V100的实验板,MDK3.2 +Library2.东西都不怎么新,凑合⽤……TIMER主要是由三部分组成:1、时基单元。
2、输⼊捕获。
3、输出⽐较。
还有两种模式控制功能:从模式控制和主模式控制。
⼀、框图让我们看下⼿册,⼀开始是定时器的框图,这⾥⾯⼏乎包含了所有定时器的信息,您要是能看明⽩,那么接下来就不⽤再看别的了…为了⽅便的看图,我对⾥⾯出现的名词和符号做个注解:TIMx_ETR:TIMER外部触发引脚 ETR:外部触发输⼊ETRP:分频后的外部触发输⼊ ETRF:滤波后的外部触发输⼊ITRx:内部触发x(由另外的定时器触发)TI1F_ED:TI1的边沿检测器。
TI1FP1/2:滤波后定时器1/2的输⼊TRGI:触发输⼊ TRGO:触发输出CK_PSC:应该叫分频器时钟输⼊CK_CNT:定时器时钟。
(定时周期的计算就靠它)TIMx_CHx:TIMER的输⼊脚 TIx:应该叫做定时器输⼊信号xICx:输⼊⽐较x ICxPS:分频后的ICxOCx:输出捕获x OCxREF:输出参考信号关于框图还有以下⼏点要注意:1、影⼦寄存器。
2、输⼊滤波机制3、输⼊引脚和输出引脚是相同的。
⼆、时基单元时基单元有三个部分:CNT、PSC、ARR。
CNT的计数⽅式分三种:向上、向下、中央对齐。
通俗的说就是0—ARR、ARR—0、0—(ARR-1)—ARR—1.三、时钟源的选择这个是难点之⼀。
从⼿册上我们看到共有三种时钟源:1、内部时钟。
也就是选择CK_INT做时钟,这个简单,但是有⼀点要注意,定时器的时钟不是直接来⾃APB1或APB2,⽽是来⾃于输⼊为APB1或APB2的⼀个倍频器,当APB1的预分频系数为1时,这个倍频器不起作⽤,定时器的时钟频率等于APB1的频率;当 APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作⽤,定时器的时钟频率等于APB1的频率两倍。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32高级定时器死区时间设置探究
一、死区设置位置:
决定死区时间设置的位是‘刹车和死区寄存器TIM1->BDTR’中的DTG[7:0],设置范围是0x00~0xff。
二、死区时间设置公式如下:
DT为死区持续时间,TDTS为系统时钟周期时长,Tdtg为系统时钟周期时长乘以倍数后的死区设置时间步进值。
在72M的定时器时钟下TDTS=1/72M=13.89ns.
所以以第一个公式,死区时间能以13.89ns的步进从0调整到127*13.89ns=1764ns
第二个公式则能(64+0)*2*13.89~(64+63)*2*13.89=1777.9ns~3528.88ns
换个角度看,就是(128~254)*13.89
同理,第三个公式就是3555.84ns~7000.56ns
换个角度看,就是(256~504)*13.89
第四个公式就是7111.68ns~14001.12ns
换个角度看,就是(512~1008)*13.89
综上:
死区时间就是不同的公式代表不同范围的死区时间设置,这个范围是互不重叠的。
而但是在不同的死区时间范围内死区时间设置步进是不同的。
若某个系统时钟下的死区时间不够,可以通过改变定时器时钟来改变最大死区时间范围。
当根据硬件电路的特性定下死区时间后,可以根据目标死区时间范围来找到相应的公式,然后代入公式求解出相应的整数(有时候不一定是整数,那就选择最近的那个),拼接DTG[7:5]+DTG[4:0]即可。
例子:这样当我需要3us的死区持续时间时,则可这么计算:
3us在第二个公式决定的死区范围之内。
所以选择第二个公式。
3000/(13.89*2)=108,所以DTG[5:0]=108-64=44,所以DTG=127+44=171=0Xab
TIM1->BDTR|=0xab;
反过来验算//72Mhz,死区时间=13.89nsX108*2=3000us
经示波器验证,完全正确。
By zxx2013.07.18。