STM32 pwm 死区时间计算
时间: 2023-11-30 21:04:01 浏览: 247
在STM32的PWM输出中,死区时间是指在两个PWM通道之间的禁止输出时间。 死区时间的计算公式如下:
死区时间 = (TIMx_ARR + 1) * TIMx_CKD_DIV / TIMx_CLOCK - (TIMx_CCRy + 1)
其中,TIMx_ARR是定时器的自动重装载寄存器,TIMx_CKD_DIV是时钟分频系数,TIMx_CLOCK是定时器的时钟频率,TIMx_CCRy是PWM通道的比较寄存器。
例如,如果使用TIM2定时器,时钟频率为72MHz,PWM频率为20kHz,占空比为50%,死区时间为200ns,则可以使用以下代码进行计算:
```c
uint16_t arr = 3599; // 自动重装载值
uint16_t psc = 0; // 时钟分频系数
uint16_t pwm_freq = 20000; // PWM频率
uint16_t dead_time = 200; // 死区时间
uint16_t tim_clock = SystemCoreClock / (psc + 1); // 计算定时器时钟频率
uint16_t ccr_value = (arr + 1) / 2; // 计算PWM通道比较寄存器值,即占空比为50%时的值
uint16_t dead_value = (tim_clock * dead_time) / 1000000000; // 计算死区时间对应的计数器值
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = ccr_value;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
TIM_MasterConfigTypeDef sMasterConfig;
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
htim2.Instance = TIM2;
htim2.Init.Prescaler = psc;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = arr;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
HAL_TIM_MspPostInit(&htim2);
HAL_TIM_Base_Start(&htim2);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
__HAL_TIM_SET_DEADTIME(&htim2, dead_value);
```
在这个例子中,我们使用了TIM2定时器,时钟频率为72MHz,时钟分频系数为0。由于ARR是3600,所以计数器将在20kHz的PWM频率下计数。我们计算了占空比为50%时的PWM通道比较寄存器值,然后计算了200ns的死区时间对应的计数器值,并将其设置为TIM2的死区时间。
阅读全文