只有高级定时器 TIM1 才带互补通道(CHx / CHxN);
必须同时使能主通道和互补通道的 GPIO 复用,并在 TIM1_BDTR 寄存器里打开主输出使能(MOE);
如果驱动半桥/全桥,还要在 BDTR 里写死区时间 DTG[7:0]。
下面给出最小步骤和寄存器写法(48 MHz 时钟、20 kHz 载波、1 µs 死区为例)。
一、管脚选择(任意封装都存在的 TIM1 互补对)
表格
复制
功能 复用 AF 推荐引脚* 说明
TIM1_CH1 AF2 PA8 主 PWM
TIM1_CH1N AF2 PB13 互补 PWM
若封装没有 PB13,可换 CH2/CH3 的互补对,详见数据手册表 3-2。
二、寄存器配置流程(库函数/裸寄存器均可)
开时钟
RCC->APBENR2 |= RCC_APBENR2_TIM1EN; // TIM1 时钟
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN;
GPIO 复用
// PA8 = TIM1_CH1
GPIOA->MODER &= ~(3UL<<16); // 清除
GPIOA->MODER |= (2UL<<16); // AF
GPIOA->AFR[1] |= (2UL<<0); // AF2
// PB13 = TIM1_CH1N
GPIOB->MODER &= ~(3UL<<26);
GPIOB->MODER |= (2UL<<26);
GPIOB->AFR[1] |= (2UL<<20); // AF2
时基(20 kHz)
TIM1->PSC = 47; // 48 MHz / (47+1) = 1 MHz
TIM1->ARR = 49; // 1 MHz / 50 = 20 kHz
PWM 模式
TIM1->CCMR1 &= ~TIM_CCMR1_OC1M;
TIM1->CCMR1 |= (6UL<<4); // PWM1 模式
TIM1->CCER |= TIM_CCER_CC1E // 主输出使能
| TIM_CCER_CC1NE; // 互补输出使能
TIM1->CCR1 = 25; // 50 % 占空比
死区与主输出
TIM1->BDTR |= (100<<0) // DTG=100 → 1 µs @1 MHz 计数
| TIM_BDTR_MOE; // 主输出使能
启动
TIM1->CR1 |= TIM_CR1_CEN;
三、运行结果
PA8 与 PB13 同时输出 20 kHz、占空比 50 %、相位完全互补的两路 PWM,两路上升/下降沿之间自动插入 1 µs 死区时间,可直接驱动半桥高/低边 MOS 或 IGBT。
四、注意事项
若用不到“刹车”功能,把 TIM1_BKIN(PB12)配置为普通 GPIO 即可;
若需要中心对齐模式,把 CR1 的 CMS 位置 1;
互补通道只在高级定时器 TIM1 存在,通用定时器 TIM2~TIM5 无 CHxN 输出,无法实现硬件互补
|