STC8H高级定时器实现PWM移相与动态占空比控制

1. STC8H高级定时器PWM基础配置

STC8H系列单片机内置的高级定时器是电机控制和数字电源设计的利器。我第一次用STC8H做呼吸灯项目时,发现它的PWM分辨率居然能到16位,这意味着你能用65535个梯度来调节LED亮度,比普通单片机的256级精细太多了。

配置PWM模式其实就三个关键寄存器:

  • AUXR:时钟分频控制
  • T2H/T2L:定时器重载值(决定PWM频率)
  • CCAPnH/CCAPnL:比较捕获值(控制占空比)

举个实际例子,要生成10kHz的PWM(系统时钟24MHz):

AUXR |= 0x04; // 定时器2时钟为系统时钟 T2H = 0xFF; // 重载值高字节 T2L = 0xCE; // 重载值低字节(24M/10k=2400-1=0x95F) CCAP0H = CCAP0L = 0x80; // 50%占空比 CCAPM0 = 0x42; // PWM模式使能

实测坑点:STC8H的PWM输出引脚需要额外配置P_SW2寄存器。有次调试半天没波形,最后发现是忘了把PWM功能切换到对应引脚。

2. 两路PWM移相的实现原理

移相控制在LLC谐振电源里特别有用。传统做法是用两路PWM模式,但STC8H有个更聪明的玩法——PWM模式+输出比较模式组合。

2.1 相位差计算核心公式

相位差Δθ与ARR、CCR的关系:

ΔCCR = (ARR × Δθ) / 360°

比如ARR=2000时,要实现45°移相:

ΔCCR = (2000×45)/360 = 250

2.2 输出比较模式的频率同步技巧

输出比较模式默认频率是PWM模式的一半,因为它在每个周期只翻转一次电平。通过动态更新CCR值可以解决这个问题:

  1. 第一次比较值CCR_A触发时,电平翻转并设置下一次比较值CCR_B
  2. 第二次比较值CCR_B触发时,再次翻转并重置为CCR_A
// 中断服务函数示例 void PCA_ISR() interrupt 7 { if(CCF0){ // 通道0中断 CCF0 = 0; CCAP0L = (next_ccr & 0xFF); CCAP0H = (next_ccr >> 8); PWM0 = !PWM0; // 电平翻转 next_ccr = (current_ccr == ccr_a) ? ccr_b : ccr_a; } }

3. 动态占空比调节实战

在智能风扇项目中,我需要实时调整PWM占空比。STC8H的影子寄存器机制帮了大忙——新占空比只在下一个周期生效,避免波形畸变。

3.1 占空比与CCR的映射关系

占空比D的计算:

CCR = ARR × D / 100

但要注意移相时两个通道的CCR关联关系:

  • 通道1(PWM模式):CCR1 = ARR × D
  • 通道2(输出比较模式):CCR2_A = CCR1 + ΔCCR
    CCR2_B = CCR2_A + (ARR × D)

3.2 动态调整代码示例

void update_duty(uint8_t duty) { uint16_t new_ccr = (uint32_t)ARR * duty / 100; CCAP1H = new_ccr >> 8; // 主通道占空比 CCAP1L = new_ccr & 0xFF; // 从通道计算(移相90°) ccr_a = (new_ccr + ARR/4) % ARR; ccr_b = (ccr_a + new_ccr) % ARR; }

避坑指南:更新CCR值时一定要先写CCAPnL再写CCAPnH!我有次先写高字节导致占空比突然跳变,电机直接啸叫。

4. 电机控制中的完整应用案例

去年给直流无刷电机做驱动器时,就用到了这套方法。硬件连接:

  • PWM1(P34):上桥臂驱动
  • PWM2(P11):下桥臂驱动
  • 相位差120°

4.1 关键参数配置

参数说明
PWM频率20kHz超出人耳听觉范围
死区时间500ns硬件死区电路实现
移相角度120°对应CCR差值667(ARR=2000)

4.2 中断服务程序优化

为了降低中断延迟,我做了三点优化:

  1. 使用寄存器操作代替库函数
  2. 关键变量声明为volatile
  3. 中断优先级设为最高
#pragma NOAREGS void PCA_ISR() interrupt 7 { if(CCF1) { CCF1 = 0; CCAP1L = next_ccr & 0xFF; CCAP1H = next_ccr >> 8; P11 = !P11; next_ccr = (CCAP1H<<8 | CCAP1L) == ccr_a ? ccr_b : ccr_a; } }

调试时用逻辑分析仪抓取的波形显示,相位误差稳定在±0.5°以内,完全满足电机控制需求。这套方案后来用在了工业缝纫机的伺服驱动上,客户反馈转速波动小于0.1%。