一、定义
1.1 PWM :
脉冲宽度调制模式可以生成一个信号,该信号频率由 TIMx_ARR 寄存器值决定,其占空比则由TIMx_CCRx 寄存器值决定。通过配置定时器和PWM通道的参数,用户可以精确地控制PWM信号的频率、分辨率、占空比等,实现对外围设备如电机、LED灯等的精准控制。STM32PWM还支持多种高级功能,如死区时间控制、相位补偿、互补输出等,进一步提升PWM信号的稳定性和效率。
1.2 时基单元
计数器寄存器 (TIMx_CNT):记录当前的时间数值
预分频器寄存器 (TIMx_PSC):调整定时器计数器的时钟频率。
自动重载寄存器 (TIMx_ARR):当计数器达到溢出条件(向下计数时的下溢条件)并当TIMx_CR1寄存器中的UDIS位等于’0’时,产生更新事件。更新事件也可以由软件产生。
捕获/比较寄存器(TIMx_CCRx):能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)。
1.3 PWM模式
根据 TIMx_CR1 寄存器中的 CMS 位状态,定时器能够产生边沿对齐模式或中心对齐模式的 PWM 信号。
PWM 边沿对齐模式:位 6:5 CMS[1:0]:中心对齐模式选择 (Center-aligned mode selection)
00:边沿对齐模式。计数器根据方向位 (DIR) 递增计数或递减计数。
01:中心对齐模式 1。计数器交替进行递增计数和递减计数。仅当计数器递减计数时,配置
为输出的通道(TIMx_CCMRx 寄存器中的 CxS=00)的输出比较中断标志才置 1。
10:中心对齐模式 2。计数器交替进行递增计数和递减计数。仅当计数器递增计数时,配置
为输出的通道(TIMx_CCMRx 寄存器中的 CxS=00)的输出比较中断标志才置 1。
11:中心对齐模式 3。计数器交替进行递增计数和递减计数。当计数器递增计数或递减计数
时,配置为输出的通道(TIMx_CCMRx 寄存器中的 CxS=00)的输出比较中断标志都会置 1。
先判断CNT和CRR的关系,再看程序中 sConfigOC.OCPolarity 输出极性是什么高低电平有效。
1.4 死区时间计算
高级控制定时器可以输出两路互补信号,并管理输出的关断与接通瞬间。这段时间通常称为死区,用户必须根据与输出相连接的器件及其特性(电平转换器的固有延迟、开关器件产生的延迟…)来调整死区时间:
位 7:0 DTG[7:0]:配置死区发生器 (Dead-time generator setup)
此位域定义插入到互补输出之间的死区持续时间。DT 与该持续时间相对应。
DTG[7:5]=0xx => DT=DTG[7:0]x tdtg,其中 tdtg=tDTS。
DTG[7:5]=10x => DT=(64+DTG[5:0])xtdtg,其中 Tdtg=2xtDTS。
DTG[7:5]=110 => DT=(32+DTG[4:0])xtdtg,其中 Tdtg=8xtDTS。
DTG[7:5]=111 => DT=(32+DTG[4:0])xtdtg,其中 Tdtg=16xtDTS
死区DTG最大配置为FF(1111 1111):以0x54为例,CKD一分频
0x54 = 01010100
[7:5] = 010符合DT=DTG[7:0]xtdtg
DTG[7:0] = 84(01010100)
tdtg = tDTS = 1/168MHZ
DT = 84 X 1/168MHZ = 500ns
二、中心对称模式互补输出+中断功能
2.1 配置
在stm32cubemx左侧找到Timers:选中TIM1
Clock Soure配置为内部时钟:nternal Clock
PWM的互补输出要占用TIM1的三个通道:
通道1选择PWM Generation CH1 CH1N(CH1为PWM的输出通道,CH1N为PWM互补输出的通道)。
通道2选择PWM Generation CH2 CH2N(CH2为PWM的输出通道,CH2N为PWM互补输出的通道)。
通道3选择PWM Generation CH3 CH3N(CH3为PWM的输出通道,CH3N为PWM互补输出的通道)。
开启刹车功能
PSC:41
模式:中心对齐模式 1
ARR:125(中心对齐模式配置时ARR不用-1)
自动重装载:使能
BRK State:刹车使能
BRK Polaryity:刹车有效电平
死区时间:0X54
CH1:PWM1模式 CRR:25 占空比:20%
CH2:PWM1模式 CRR:50 占空比:40%
CH3:PWM1模式 CRR:75 占空比:60%
Tout = (ARR+1)X(PSC+1)/Ft = 160Mhz/(42x125) = 32KMhz
由于配置的是中心模式,上升+下降计数所以周期需要除以2:32/2=16KMhz
Tout是定时器溢出时间(PWM周期)、Ft是定时器的时钟源频率、ARR是自动重装载寄存器的值、PSC是预分频器寄存器的值
2.2 代码
tim.c:进入中断,
GPIO进行引脚电平反转,i++
#include "tim.h"
TIM_HandleTypeDef htim1;
uint8_t i = 0;
void MX_TIM1_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {
0};
TIM_MasterConfigTypeDef sMasterConfig = {
0};
TIM_OC_InitTypeDef sConfigOC = {
0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {
0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 41; //分频值
htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1; //计数模式
htim1.Init.Period = 125; //自动重载值
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //分频因子,死区用
htim1.Init.RepetitionCounter = 0; //重复计数值
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; //自动重载值,预重载
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1; //工作模式
sConfigOC.Pulse = 25; //比较值
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; //有效电平(H\L)
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; //互补通道,设置一样会相反
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; //关闭快速模式
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; //设置空闲电平
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;//设置互补通道空闲电平
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}