在嵌入式电源控制领域,移相全桥拓扑因其高效率、低EMI特性成为中高功率DCDC转换器的首选方案。而STM32F103凭借其丰富的高级定时器资源,成为实现数字控制的主流选择。本文将彻底抛开HAL/LL库的抽象层,带您直击寄存器操作本质,构建一套完整的移相全桥PWM生成系统。
移相全桥的核心在于两组桥臂的相位差控制。在STM32F103中,TIM1和TIM8这两个高级定时器恰好提供了我们所需的互补输出和主从联动功能。与库函数方案不同,寄存器级操作让我们能够精确控制每一个时钟周期。
关键硬件配置要点:
定时器联动关系如下图所示:
| 主定时器(TIM1) | 从定时器(TIM8) |
|---|---|
| 产生基准PWM波形 | 接收触发信号复位计数 |
| OC1REF作为TRGO输出 | 配置为复位从模式 |
| 控制移相角度 | 保持固定占空比 |
直接操作寄存器时,每个bit的设置都直接影响硬件行为。以下是TIM1初始化的关键步骤:
c复制// 时钟使能配置
RCC->APB2ENR |= 1<<11; // TIM1时钟使能
RCC->APB2ENR |= 1<<2 | 1<<3; // GPIOA和GPIOB时钟
// GPIO配置为复用推挽输出
GPIOA->CRH = (GPIOA->CRH & 0xFFFFFF0F) | 0x000000B0; // PA9
GPIOB->CRH = (GPIOB->CRH & 0xF0FFFFFF) | 0x0B000000; // PB14
// 定时器核心参数
TIM1->ARR = arr; // 设置自动重装载值
TIM1->PSC = 0; // 无预分频
// PWM模式配置
TIM1->CCMR1 |= 6<<12 | 1<<11; // PWM模式1 + 预装载使能
TIM1->CCER |= 1<<4 | 1<<6; // 开启OC2和OC2N输出
// 主模式触发配置
TIM1->CR2 |= 4<<4; // MMS=100, OC1REF作为TRGO
TIM8的关键在于正确设置从模式,使其能够响应TIM1的触发信号:
c复制// 时钟和GPIO使能
RCC->APB2ENR |= 1<<13; // TIM8时钟
RCC->APB2ENR |= 1<<3 | 1<<4; // GPIOB和GPIOC
// 从模式配置
TIM8->SMCR |= 1<<7 | 4<<0; // SMS=100(复位模式)
TIM8->SMCR &= ~(7<<4); // TS=000(ITR0内部连接)
// 死区时间设置
TIM8->BDTR = 90<<0 | 1<<15; // 死区=90个时钟周期
移相角度通过调整TIM1的CCR1值实现。当CCR1从0变化到ARR/2时,移相角度从0°到180°线性变化:
c复制void set_phase_shift(uint16_t angle_deg) {
// 将角度转换为CCR值
uint16_t ccr = (TIM1->ARR * angle_deg) / 360;
TIM1->CCR1 = ccr; // 动态调整移相角度
// 必须手动触发更新事件
TIM1->EGR |= 1<<0;
}
实际调试中发现的问题:
寄存器级开发的优势在于可以精确控制每个硬件行为,但也带来了更大的调试挑战。以下是一些实用技巧:
波形异常排查表:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无输出 | 时钟未使能 | 检查RCC相关寄存器 |
| 互补信号同相 | 死区未启用 | 配置BDTR寄存器 |
| 移相不准 | 触发信号未同步 | 检查SMCR配置 |
| 波形畸变 | 预装载未启用 | 设置CCMR中的OCxPE位 |
使用逻辑分析仪抓取的实际信号解码示例:
text复制TIM1_CH1: _|‾|_|‾|_|‾|_|‾
TIM8_CH2: _|‾|__|‾|__|‾
↑移相点(由CCR1决定)
在电源控制这种实时性要求高的场景,寄存器操作相比库函数有明显的性能优势:
c复制// 只使能必要的更新中断
TIM1->DIER = 1<<0;
NVIC_SetPriority(TIM1_UP_IRQn, 0);
c复制// 无感切换ARR值
TIM1->CR1 &= ~(1<<0); // 先停止计数器
TIM1->ARR = new_value;
TIM1->EGR |= 1<<0; // 手动产生更新事件
TIM1->CR1 |= 1<<0; // 重新启动
c复制// 紧急情况下直接操作BDRT寄存器
TIM1->BDTR &= ~(1<<15); // 立即关闭所有输出
经过实际测试,寄存器级操作相比HAL库可减少约40%的指令周期,这对于高频开关电源控制至关重要。在100kHz开关频率下,使用寄存器方案可留出足够的余量进行实时算法运算。