PWM互补输出-死区插入(stm32)


再理解下stm32的一些配置,PWM两种工作模式的核心区别是 有效电平的出发时机想法,他们在PWM输出上形成互补,即反相的状态.

1. PWM两种工作模式

  • PWM模式1:
    当计数器值 CNT < CCR(比较寄存器值)时,输出有效电平。
    当计数器值 CNT >= CCR 时,输出无效电平。
  • PWM模式2
    当计数器值 CNT < CCR 时,输出无效电平。
    当计数器值 CNT >= CCR 时,输出有效电平。

简单来说,模式1是“先有效,后无效”,而模式2是“先无效,后有效”

2. 占空比计算与波形表现

假设自动重装载寄存器 ARR = 100,比较寄存器 CCR = 30,且配置为高电平有效(极性高):

  • PWM模式1:占空比为 30%。波形表现为前30%时间为高电平,后70%为低电平。
  • PWM模式2:占空比为 70%。波形表现为前30%时间为低电平,后70%为高电平。

又如下面这种配置会, 因为是PWM模式2, 且配置为低电平有效,那么PWM前一段是高电平.我们可以这样理解,PWM1=为正即+, PWM2=为负即-, 那么当极性为高(+)时, + -为负, -+为负,++为正,–为正

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

3. 关键补充:极性配置的影响

需要注意的是,STM32中的“有效电平”并不固定等于高电平。它取决于极性配置(TIM_OCPolarity):

  • 如果配置为高电平有效(正常极性),“有效电平”即为高电平。
  • 如果配置为低电平有效(反极性),“有效电平”即为低电平。
    因此,PWM模式决定了“谁先谁后”,而极性配置决定了“有效电平到底是高还是低”,两者配合才能确定最终的输出波形。

4. 互补通道

互补通道和主通道的极性正好是相反的, 如果主通道的极性确定了,那么互补通道的也就确定了. 如下面这段代码,如果ARR=500, 且配置为PWM2模式,有效电平为低,根据 --的正, 我们知道主通道一个周期内前段为高电平,后段为负电平.

  //如果ARR=500
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_Pulse = 250;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;

在这里插入图片描述

5. 整体对比表格

PWM模式输出极性 (OCPolarity)占空比计算占空比结果实际输出波形表现 (一个周期内)
PWM1High (高有效)CCR / (ARR+1)30%前 30% 为高电平,后 70% 为低电平
PWM1Low (低有效)(ARR - CCR + 1) / (ARR+1)70%前 30% 为低电平,后 70% 为高电平
PWM2High (高有效)(ARR - CCR + 1) / (ARR+1)70%前 30% 为低电平,后 70% 为高电平
PWM2Low (低有效)CCR / (ARR+1)30%前 30% 为高电平,后 70% 为低电平

6. 代码理解

下面这段程序,在定时器8的前3个通道输出PWM以及互补信号,并插入死区时间

int comlement_main(void)
{
 /* GPIO配置 */
  TIM_Config();

  /* ---------------------------------------------------------------------------
    PWM的频率为17.57 KHz:
    - TIM1_Period = (SystemCoreClock / 17570) - 1

    The Three Duty cycles are computed as the following description: 

    通道1的占空比为 50% 互补通道为 50%.
    通道2的占空比为 25% 互补通道为 75%.
    通道3的占空比为 12.5% 互补通道为 87.5%.
    
    定时器占空比的计算公式:
      - ChannelxPulse = DutyCycle * (TIM1_Period - 1) / 100

  2/ 插入死区的计算公式为: (11/SystemCoreClock) ns, 这里SystemCoreClock=168M,那么≈65ns

  3/ 配置刹车特性, 有效电平为高,且自动输出
  --------------------------------------------------------------------------- */

  /* Compute the value to be set in ARR register to generate signal frequency at 17.57 Khz */
  TimerPeriod = (SystemCoreClock / 17570) - 1; //配置为17.57Khz的时钟

  /* Compute CCR1 value to generate a duty cycle at 50% for channel 1 */
  Channel1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);

  /* Compute CCR2 value to generate a duty cycle at 25%  for channel 2 */
  Channel2Pulse = (uint16_t) (((uint32_t) 25 * (TimerPeriod - 1)) / 100);

  /* Compute CCR3 value to generate a duty cycle at 12.5%  for channel 3 */
  Channel3Pulse = (uint16_t) (((uint32_t) 125 * (TimerPeriod - 1)) / 1000);

  /* Time Base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

  /* Channel 1, 2 and 3 Configuration in PWM mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  //上面TIM_OutputState_Enable可以理解为,"打开输出开关,允许 PWM 信号输出到对应的 GPIO 引脚"
  TIM_OC1Init(TIM8, &TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;
  TIM_OC2Init(TIM8, &TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;
  TIM_OC3Init(TIM8, &TIM_OCInitStructure);

  /* Automatic Output enable, Break, dead time and lock configuration*/
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  TIM_BDTRInitStructure.TIM_DeadTime = 11;
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

  TIM_BDTRConfig(TIM8, &TIM_BDTRInitStructure);

  /* TIM1 counter enable */
  TIM_Cmd(TIM8, ENABLE);

  /* Main Output Enable */
  TIM_CtrlPWMOutputs(TIM8, ENABLE);
}

有些地方问了下AI,

  • TIM_OSSRState = TIM_OSSRState_Enable
    含义:运行模式下的关闭状态选择(Off-State Selection for Run mode)。
    理解:当主输出使能(MOE)为 1,但某个通道的输出使能(CCxE/CCxNE)为 0 时,该引脚会输出由 OSSR 决定的电平。配置为 Enable 时,非活动通道会被强制输出无效电平(由 OCPOLARITY 决定),从而避免外部电路产生不可控的状态。

  • TIM_OSSIState = TIM_OSSIState_Enable
    含义:空闲模式下的关闭状态选择(Off-State Selection for Idle mode)。
    理解:当主输出使能(MOE)为 0 时(例如刹车触发或定时器未启动),该引脚会输出由 OSSI 决定的电平。配置为 Enable 可确保在空闲或故障状态下,功率器件保持安全的关断状态。

  • TIM_LOCKLevel = TIM_LOCKLevel_1
    含义:锁定级别配置(Lock Level)。
    理解:用于防止软件意外修改关键的定时器配置。配置为 Level_1 时,BDTR 寄存器中的 DTG(死区时间)、BKE(刹车使能)、BKP(刹车极性)和 AOE(自动输出使能)位将被硬件锁定,在定时器运行期间无法被软件修改,提高了系统的安全性。

  • TIM_DeadTime = 11
    含义:死区时间设置(Dead-Time Generator setup)。
    理解:在互补 PWM 输出中,为了防止上下两个 MOS 管由于开关延迟导致同时导通(直通短路),硬件会在电平翻转时强制插入一段“两个管子都不导通”的空白时间。这里的 11 是写入 DTG[7:0] 位的值。实际死区时间需要结合定时器的时钟频率( Tdts)和 DTG 的计算公式来换算得出。

  • TIM_Break = TIM_Break_Enable
    含义:刹车(断路)输入功能使能控制。
    理解:使能硬件级别的紧急刹车功能。一旦外部刹车引脚(BRK)检测到有效信号,定时器会立即强制关闭所有 PWM 输出,这在电机过流或过压保护中是极其重要的安全机制。

  • TIM_BreakPolarity = TIM_BreakPolarity_High
    含义:刹车输入通道极性选择。
    理解:定义外部刹车引脚在什么电平下触发保护。配置为 High 表示当刹车引脚输入高电平时,触发刹车动作,强制关闭 PWM 输出。

  • TIM_AutomaticOutput = TIM_AutomaticOutput_Enable
    含义:自动输出使能(Automatic Output Enable, AOE)。
    理解:当刹车信号消失后,PWM 输出如何恢复。配置为 Enable 时,只要刹车信号撤销,在下一次更新事件(UEV)到来时,主输出使能位(MOE)会被硬件自动重新置 1,PWM 信号自动恢复输出,无需软件重新干预。如果配置为 Disable,则刹车后 PWM 会一直关断,直到软件手动重新开启 MOE 位。

  • TIMx_BDTR寄存器位定义
    看看下面死区发生器怎么定义的,这个死区时间最好还是以实际测量为准.
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

7. 程序输出PWM测试图

显示的PWM占空比和频率和预先设计的基本一致
在这里插入图片描述

  • 死区时间
    代码中我们配置的死区为11, 即11个系统时钟时间,因为DTG的[7:5]为000, 那么插入死区的计算公式为: deadTime/SystemCoreClock, 即(11/SystemCoreClock) ns, 这里SystemCoreClock=168M,那么≈65ns
    和实际有点出入, 大概率是因为逻辑分析仪无法捕捉到这么短的时间.
    在这里插入图片描述
    下面是实际示波器测量时间,每一大格为100ns, 可以看到和计算的65ns吻合.
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值