This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
在C2000系列处理中,关于TBCLKSYNC的描述,一般是这样:
也就是说,先将TBCLKSYNC置0
然后配置ePWM单元
配置完成后,再将该位置1,以使各个配置好的ePWM单元同时开始工作。
但是,按照上面的配置顺序进行配置,ePWM单元并不能正常工作。
看了一下controlSUITE或者C2000 ware的C文件,都是在InitPeripheralClocks()这个函数里就把TBCLKSYNC置高了
例程也并不是按照手册中说名的顺序配置TBCLKSYNC位的
请问这是为什么呢?为什么按照手册里的顺序配置TBCLKSYNC,ePWM单元不能正常工作呢?
这个确实以前没关注过,而且奇怪的是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
您好 感谢您的帮助 我的问题应该是解决了
首先说明一点,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 timebase
counter 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,就没有问题了。
您好 还有一个问题请教一下
按照我上面的分析 调整代码后
当调用宏函数配置完PWM单元后,将TBCLKSYNC设置为1
此时从变量窗口观测ePWM1.TBCTR、ePWM2.TBCTR、ePWM3.TBCTR,这三个计数器为什么不是相同的呢?既然已经同步了
您好 感谢帮助 我的问题解决了 应该是观察方式的问题
既然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模式