STM32F407高级定时器输出互补PWM的频率和死区时间的计算设置

STM32F407单片机有2个高级定时器(TIM1和TIM8)。本文重点叙述使用高级定时器输出互补PWM时,PWM的频率以及互补PWM的死区时间的计算方法。

一、PWM频率计算

PWM频率或周期由自动重载寄存器(TIMx_ARR)的值决定(下文将用“arr”代表),其占空比由捕获/比较寄存器(TIMx_CCRx)的值决定(下文将用“ccr”代表)。

定时器的本质是计数器,定时器的时钟频率也就是计数器的计数频率,假设定时器的时钟频率为f,则计数器每(1/f)秒计数一次,例如,若定时器的时钟频率为1MHz,则意味着计数器每1us计数一次。

因此,若arr的值为1000,则定时器输出的PWM的周期为(1000*1us=1ms),其频率为1kHz。若arr的值为500,则定时器输出的PWM的周期为(500*1us=0.5ms),其频率为2kHz。

#注意:定时器输出的PWM的频率,是在定时器的时钟频率已确定的前提下进行的计算。实际上定时器输出的PWM的频率由定时器的时钟频率和arr的值共同决定,这在上文的计算过程中也可以看出。

如何设置PWM的输出频率将在另一篇文章重点叙述,本篇文章重点叙述计算方法,充分了解计算方法后才能有的放矢的设置相关参数。

二、死区时间计算

定时器输出的互补PWM波的死区时间由 TIMx_CR1 寄存器的 CKD[1:0]位TIMx_BDTR 寄存器的 DTG[7:0]位决定。

其中,TIMx_BDTR 寄存器的 DTG[7:0]位直接决定死区时间(DT),

DGT[7:0]=[xxxxxxxx](x=0或1),从右到左依次是第0位到第7位,共有8个位,其中x=0或1,

因此DTG[7:0]位根据x的不同,共有2^8个数,即0~255(00000000~11111111)。

其中DTG[7:5]位决定死区时间(DT)的计算公式,其公式如下图所示,

①当DTG[7:5]=“0xx”,即DGT[7:0]=[00000000]~[01111111],即DGT[7:0]=0~127时,

DT=DGT[7:0] x t_dtg,其中 t_dtg=t_DTS

②当DTG[7:5]=“10x”,即DGT[7:0]=[10000000]~[10111111],即DGT[7:0]=128~191时,

DT=( 64+DGT[5:0] )x t_dtg,其中 t_dtg=2xt_DTS

③当DTG[7:5]=“110”,即DGT[7:0]=[11000000]~[11011111],即DGT[7:0]=192~223时,

DT=( 32+DGT[4:0] )x t_dtg,其中 t_dtg=8xt_DTS

④当DTG[7:5]=“111”,即DGT[7:0]=[11100000]~[11111111],即DGT[7:0]=224~255时,

DT=( 32+DGT[4:0] )x t_dtg,其中 t_dtg=16xt_DTS

上式中,t_DTS的值就取决于TIMx_CR1 寄存器的 CKD[1:0]位,计算公式如下图所示:

其中,“t_CK_INT”为计数器的计数周期,即定时器时钟频率的倒数,例如,若定时器的时钟频率为1MHz,则意味着计数器每1us计数一次,则t_CK_INT=1us。(可回顾上文中的“PWM频率计算”的内容分)

①当CKD[1:0]=00时,t_DTS=t_CK_INT

②当CKD[1:0]=01时,t_DTS=2 x t_CK_INT

③当CKD[1:0]=10时,t_DTS=4 x t_CK_INT

④当CKD[1:0]=11时,不设此值;

#注意:死区时间的计算和频率计算一样,都是在定时器时钟频率已确定的前提下完成的计算。本文重点叙述计算过程,同样是为了在设置死区时间时,能够有的放矢的设置相关参数。

三、总结

1、高级定时器输出的互补PWM的频率由arr值直接决定,改变arr值便可以直接改变其输出的PWM频率;

2、高级定时器输出的互补PWM的死区是时间由TIMx_CR1寄存器的CKD[1:0]位TIMx_BDTR 寄存器的DTG[7:0]位共同决定,其中DTG[7:0]位直接决定死区时间计算公式,CKD[1:0]位决定公式中t_dtg的值,从而间接控制死区时间;

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32高级定时器中,可以通过配置定时器输出比较模式来实现PWM输出。而互补输出则是指使用两个定时器通道来实现互补输出,其中一个通道输出PWM波的高电平部分,另一个通道输出PWM波的低电平部分,从而实现互补输出的效果。同时,为了避免MOS管同时导通,可以设置死区时间来控制两个通道的输出时间间隔。 以下是一个简单的代码示例,实现了使用TIM1作为高级定时器,PA8和PA9作为互补输出通道,同时设置死区时间为100个时钟周期: ```c #include "stm32f4xx.h" void TIM1_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_TIM1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_TIM1); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = 8399; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = 4199; TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = 4199; TIM_OC2Init(TIM1, &TIM_OCInitStructure); TIM_BDTRInitTypeDef TIM_BDTRInitStructure; TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable; TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable; TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; TIM_BDTRInitStructure.TIM_DeadTime = 100; TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low; TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); TIM_Cmd(TIM1, ENABLE); } ``` 在该代码中,首先开启了TIM1和GPIOA的时钟,然后配置了PA8和PA9为复用输出模式,并将它们的复用引脚分别与TIM1的通道1和通道2相连。接着,配置了TIM1的计数器周期为8399,即定时器频率为84MHz/8400=10kHz。通道1和通道2都选择了PWM模式1,输出极性为高电平,占空比均为50%。最后,通过TIM_BDTRInitStructure结构体设置死区时间为100个时钟周期,并启用了自动输出功能。 需要注意的是,该例程中使用的是STM32F407VG开发板,所以使用的是TIM1定时器。如果使用其他型号的开发板,需要根据具体情况修改代码中使用的定时器和GPIO引脚。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值