互补PWM波配置
STM32F407VET6的高级定时器TIM1、TIM8可以生成互补的PWM波,用HAL库配置非常方便。
我们使用高级定时器TIM1,选择一个通道(我这里选择通道二),然后选择PWM Generation CH2 CH2N。这里N的意思是互补,CH2N是与CH2的PWM互补的。
此时我们可以看到CH2输出以及其互补通道输出PWM波的IO口。
我的时钟主频配置的是100Mhz,当你配置的时候要注意自己的始终主频,涉及后面的PWM波的频率计算、死区时间计算。
时钟源选择Internal Clock。选择不分频(Prescaler=1),由于我需要配置100Khz频率的PWM波,所以我的Counter Period值填写的是999(ARR=999)。
pwm波的周期:
而主频为100Mhz,其周期为:
所以Counter Period值应该为:
同理:如果要配置10Khz频率的PWM波,则ARR的值应该为9999.
死区时间计算
我们可以看到有一个Dead Time的值需要我们填写。
其计算规则如下图所示。
乍一看很复杂,我来解释一下计算步骤。
首先,我们需要确定时钟的主频,上图为8Mhz,所以其时钟周期T0为:
第二步,又要分为4种情况:
1)步长为T0(125ns),乘数范围是0-127,此时得出的范围是:步长 x 乘数
0-127*T0 即 0-15.875us.
2)步长为2T0(125ns),乘数范围是64-127,此时得出的范围是:步长 x 乘数
128-254*T0 即16us-31.75us.
3)步长为8T0(125ns),乘数范围是32-63,此时得出的范围是:步长 x 乘数
256-504*T0 即 32us-63us.
4)步长为16T0(125ns),乘数范围是0-127,此时得出的范围是:步长 x 乘数
512-1008*T0 即 64us-126us.
需要配置的死区时间在哪种情况的范围内,则是哪一种情况。
第三步,
1)如果是情况1,可以直接用需要配置的死区时间除以步长T0,就是需要填入DeadTime那一栏的DTG寄存器的值.
因为情况1的步长值为0,乘数位置为DGT[6:0],那么其合在一起还是看DGT[6:0]的大小,所以可以直接使用需要配置的死区时间除以步长T0。
2)如果是情况二,其步长值为二进制10
公式为:(此处的DeadTime和配置处需要填入的不一样,配置处填入的是寄存器数值,这里的是期望的死区时间)
解出DTG[5:0]的值,将其转化为二进制,与 前面的步长值10拼在一起。
例如DTG[5:0]为31,其二进制就是011111,合在一起后就是10011111即159.
所以需要填入DeadTime的值就是159,就是这一栏Dead Time所需要填入的数值。
3)如果是情况三,其步长值为二进制110
同理,解出DTG[4:0]的值,将其转化为二进制,与 前面的步长值110拼在一起。
公式为:
4)如果是情况四,其步长值为二进制111
同理,解出DTG[4:0]的值,将其转化为二进制,与 前面的步长值111拼在一起。
公式为:
主要思想就是把DTG寄存器拆成两部分,前面的部分决定步长(取0、10、110、111),后面的部分为DTG的值,两者拼在一起就是DeadTime处需要填入的数值。