3、时基模块TB详解:时基周期寄存器TBPRD、时基计数器TBCNT、时基时钟分频、相位控制
各位同学,咱们今天来啃时基模块这块硬骨头。
说实话,PWM波形生成的核心,就是时基模块。你想想看,没有时基,哪来的周期?没有周期,哪来的PWM?所以这一节,咱们把TBPRD、TBCNT、时钟分频和相位控制这四个东西彻底讲透。
3.1 时基周期寄存器TBPRD——决定PWM频率的关键
TBPRD,全称Time-Base Period Register。说白了,它就是设定PWM周期的家伙。
我刚开始学C2000的时候,总以为TBPRD直接就是周期值。后来才发现,它其实是计数器的「终点」。什么意思呢?
时基计数器TBCNT从0开始往上数,数到TBPRD的值,就完成一个周期。所以PWM的频率公式是:
PWM频率 = 时基时钟频率 / (TBPRD + 1)
注意那个+1!很多新手在这里翻车。因为计数器是从0开始计数的,所以实际周期长度是TBPRD+1个时钟周期。
举个例子:
假设时基时钟频率是100MHz,你想要20kHz的PWM频率。
那么 TBPRD = 100MHz / 20kHz - 1 = 5000 - 1 = 4999
嗯,就是这么算的。
我的经验:
我在做电机控制项目时,需要精确的20kHz PWM。当时直接用了TBPRD=5000,结果频率偏了。查了半天才发现忘了减1。从那以后,我每次写TBPRD都会在心里默念一遍公式。
3.2 时基计数器TBCNT——PWM的「心跳」
TBCNT,时基计数器。它就是个不断往上数的家伙。
它的工作模式有三种:
- 递增模式(Up):从0数到TBPRD,然后跳回0重新数
- 递减模式(Down):从TBPRD数到0,然后跳回TBPRD重新数
- 增减模式(Up-Down):从0数到TBPRD,再数回0,如此反复
你可能会问:这三种模式有啥区别?
我告诉你,区别大了去了。
递增模式生成的PWM,波形是「左对齐」的。递减模式是「右对齐」的。增减模式呢?它生成的是「中心对齐」的PWM。
注意:
中心对齐PWM的周期计算方式不一样!
在增减模式下,实际周期 = 2 × TBPRD × 时基时钟周期
因为计数器要跑一个来回嘛。
3.3 时基时钟分频——让PWM频率更灵活
有时候,系统时钟太高了,直接用来做PWM,频率会快得离谱。这时候就需要分频。
C2000的时基模块提供了两级分频:
| 分频级 | 寄存器 | 分频系数 | 说明 |
|---|---|---|---|
| 第一级 | TBCTL[CLKDIV] | 1, 2, 4, 8, 16, 32, 64, 128 | 粗调,分频比较大 |
| 第二级 | TBCTL[HSPCLKDIV] | 1, 2, 4, 6, 8, 10, 12, 14 | 细调,分频比较小 |
最终时基时钟频率 = 系统时钟频率 / (CLKDIV × HSPCLKDIV)
举个例子:系统时钟100MHz,CLKDIV=8,HSPCLKDIV=2,那么时基时钟频率 = 100MHz / (8×2) = 6.25MHz。
我的习惯:
我个人习惯先调HSPCLKDIV做细调,再用CLKDIV做粗调。这样能更精确地逼近目标频率。曾经有个项目需要非常精确的50Hz低频PWM,我就是靠这个两级分频搞定的。
3.4 相位控制——让多个PWM协同工作
相位控制,说白了就是让多个PWM通道之间有个固定的时间偏移。
比如你要做三相逆变器,三个PWM之间需要相差120度。这时候相位控制就派上用场了。
相位控制的核心寄存器是TBPHS(Time-Base Phase Register)。
它的工作原理是这样的:
- 每个时基模块都有一个同步输入信号
- 当同步信号到来时,TBCNT会被强制加载TBPHS的值
- 然后从这个值开始计数
这样一来,两个PWM模块之间就有了固定的相位差。
配置示例:
假设TBPRD=5000,你想要90度的相位偏移。
90度对应四分之一个周期,所以TBPHS = 5000 / 4 = 1250
配置代码:
EPwm1Regs.TBCTL.bit.PHSEN = 1; // 使能相位加载
EPwm1Regs.TBPHS.bit.TBPHS = 1250; // 设置相位值
EPwm1Regs.TBCTL.bit.SWFSYNC = 1; // 产生软件同步信号
我曾经踩过的坑:
相位控制一定要记得使能PHSEN位!否则你写了TBPHS也没用。我调试一个三相逆变器时,折腾了半天相位就是不对,最后发现是PHSEN没置1。嗯,这种低级错误,犯过一次就记住了。
3.5 知识体系总览
说了这么多,咱们用一张图来总结一下时基模块的核心逻辑:
这张图把咱们今天讲的内容串起来了。你看,系统时钟进来,经过两级分频,变成时基时钟。时基时钟驱动TBCNT计数器跑起来,TBCNT和TBPRD配合,决定了PWM的周期。而相位控制呢,就是通过同步信号,在特定时刻把TBPHS的值加载到TBCNT里,从而实现相位偏移。
嗯,到这里,时基模块的核心内容就讲完了。你想想看,其实没那么复杂对吧?就是时钟、计数、比较、相位这四个东西。搞懂了它们之间的关系,PWM波形生成就掌握了一半。
最后一个小建议:
我建议你在实际项目中,先用示波器看看TBCNT的波形。很多C2000开发板都有PWM输出引脚,你可以把TBCNT的值映射到PWM引脚上,用示波器观察。亲眼看到计数器在跑,比看寄存器值直观多了。