TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28335: 关于TBCLKSYNC的疑问

Part Number:TMS320F28335Other Parts Discussed in Thread:CONTROLSUITE

在C2000系列处理中,关于TBCLKSYNC的描述,一般是这样:

也就是说,先将TBCLKSYNC置0

然后配置ePWM单元

配置完成后,再将该位置1,以使各个配置好的ePWM单元同时开始工作。

但是,按照上面的配置顺序进行配置,ePWM单元并不能正常工作。

看了一下controlSUITE或者C2000 ware的C文件,都是在InitPeripheralClocks()这个函数里就把TBCLKSYNC置高了

例程也并不是按照手册中说名的顺序配置TBCLKSYNC位的

请问这是为什么呢?为什么按照手册里的顺序配置TBCLKSYNC,ePWM单元不能正常工作呢?

Green Deng:

这个确实以前没关注过,而且奇怪的是F2837xD的配置确实是按照TRM上的步骤进行的。

EALLOW;CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;EDIS;InitEPwm1Example();InitEPwm2Example();InitEPwm3Example();EALLOW;CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;EDIS;

这个问题我咨询了一下E2E,但是也没有收到有价值的回复,你可以参阅一下,看是否有什么想法:

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1026111/tms320f28335-question-about-tbclksync 

,

user78960159:

您好 感谢您的帮助 我的问题应该是解决了 

首先说明一点,C2000系列各芯片手册中对TBCLKSYNC的描述以及配置ePWM时何时置1何时置0的描述是没有问题的。

问题出现在PWM_INIT_MACRO或BLDCPWM_INIT_MACRO宏函数中。

以PWM_INIT_MACRO为例,该宏函数位于:

以D:\ti\controlSUITE\development_kits\HVMotorCtrl+PfcKit_v2.1中的HVPM_Sensorless_2833x为例,

在时钟使能部分,就已经将TBCLKSYNC置1了

您可以尝试如下操作:如果在时钟使能部分,不将TBCLKSYNC设置为1,在main函数中调用PWM_INIT_MACRO宏函数后再将TBCLKSYNC配置为1,即类似您举例的2837x示例代码,而这也是C2000数据手册中给出的配置顺序,如下所示代码:

// Initialize PWM module pwm1.PeriodMax = SYSTEM_FREQUENCY*1000000*T/2; // Prescaler X1 (T1), ISR period = T x 1 pwm1.HalfPerMax=pwm1.PeriodMax/2; pwm1.Deadband = 2.0*SYSTEM_FREQUENCY; // 120 counts -> 2.0 usec for TBCLK = SYSCLK/1 PWM_INIT_MACRO(1,2,3,pwm1)

EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS;

按照上述操作执行,您将会发现调用PWM_INIT_MACRO后,各ePWM单元的TBPRD数值将会是0,而不会是pwm1.PeriodMax 中设定的数值。

造成上述现象的原因,我认为应该是这样,来看PWM_INIT_MACRO这个宏函数中的以下部分:

对于TBPRD,希望的配置方式是立即写入,不使用TBPRD的shadow寄存器

上图为PWM_INIT_MACRO函数和TBPRD写入相关的部分,代码块1将希望的周期寄存器值写入到对应的TBPRD中,这里需要注意的是,此时的写入操作,是将数值写入到各TBPRD的shadow寄存器中,因为默认情况下,TBPRD的shadow寄存器是使能的:

随后执行的代码块2,又将TBPRD的写入方式改变了,变更为立即写入,因为在PWM_INIT_STATE中配置了TBPRD的写入方式为PRDLD_IMMEDIATE,这将导致在代码块1写入到TBPRD的shadow寄存器中的数值将无法更新到active TBPRD中,从而造成TBPRD写入失败。

至于在调用PWM_INIT_MACRO之前已将TBCLKSYNC 置1,此时再调用PWM_INIT_MACRO能将数值正常写入到TBPRD中,我想可能是因为:

1.TBCLKSYNC 设置为1,All enabled ePWM module clocks are started with the first rising edge of TBCLK aligned

2.此时,TBPRD的默认值是0,TBCTR的默认值也是0

3.此时TBPRD的shadow也是使能的,shadow写入到active的条件为:

the active register will be loaded from the shadow register when the timebasecounter equals zero.

综合以上3点,数值应该是能从shadow写入到active的,不过这可能是一种临界状态。

综上所述,总结如下:

1.如果再配置ePWM单元前,将TBCLKSYNC置1,同步各ePWM单元时钟,而随后的配置中又没有改变各ePWM单元的时钟分频。如HVPM_Sensorless_2833x例程,各ePWM单元使用的就是150MHz的系统时钟,PWM_INIT_MACRO并没有改变TBCTL寄存器的时钟预分频部分,此时的各ePWM单元也都是同步的,应该没有问题

2.PWM_INIT_MACRO中的代码应该有问题,合理的方式应该是首先决定对TBPRD的操作要不要使用shadow方式,随后再对其进行写入操作。也就是应将PWM_INIT_MACRO中的代码块1和代码块2互换,然后再按照数据手册中所说的先将TBCLKSYNC置0,再配置ePEM,最后将TBCLKSYNC置1,就没有问题了。

,

Green Deng:

非常感谢你的分析!

,

user78960159:

您好 还有一个问题请教一下

按照我上面的分析 调整代码后

当调用宏函数配置完PWM单元后,将TBCLKSYNC设置为1

此时从变量窗口观测ePWM1.TBCTR、ePWM2.TBCTR、ePWM3.TBCTR,这三个计数器为什么不是相同的呢?既然已经同步了

,

Green Deng:

你好,三个计算器不同具体是什么情况?

我能想到的不同,1是计数器还没有更新计数值,2是同步有延时导致计数器会有1、2个点的时间差。

,

user78960159:

您好 感谢帮助 我的问题解决了 应该是观察方式的问题

既然ePWM1、ePWM2、ePWM3设置为同步,我想通过观察3个ePWM单元的TBCTR进一步确认一下 也就上面了的问题

在3个ePWM单元设置为同步模式的情况下,并且TBCTL寄存器中的FREE,SOFT设置为Free Run,在变量观察窗口,以持续刷新的模式观测3个ePWM单元的TBCTR,它们会有很大的差值,且不是固定的,这三个计数器并没有因为同步而保持相同的数值。

但是,如果将TBCTL的Free,Soft,设置为00,即Stop after the next time-base counter increment or decrement,并且以手动刷新的方式观测时,3个计数器的数值确实是相同的,每次执行程序单步运行,也是会增加同样的数值。

注意f2833xbmsk.h中的SOFT_STOP_FLAG是0x4000,即设置FreeSoft为01模式,并不是00模式

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28335: 关于TBCLKSYNC的疑问
分享到: 更多 (0)

© 2026 TI中文支持网   网站地图 鲁ICP备2022002796号-1