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.

TMS320F28379D: 关于如何动态修改PWM的周期寄存器,实现变频控制

Part Number: TMS320F28379D
Other Parts Discussed in Thread: C2000WARE

最近开发中,需要实现动态调整PWM的频率,也就是需要动态去修改周期寄存器的数据

但是在中断中,每隔100次来动态配置一次周期寄存器,使用EPWM_setTimeBasePeriod(EPWM6_BASE, PWM_PERIOD)来设置的

但在配置后读取pwm寄存器组的周期寄存器数据,还是显示最开始初始化配置的数值,也就是动态设置周期寄存器是没有起到作用的

想请问是为什么呢?

另外,还想请教下,pwm初始化过程中,到哪一步就开始输出pwm波形了呢,如果初始化配置到某一步就突然开始输出pwm波形,而没有一个开始发波的使能位之类的操作,那如何能保证刚开始的pwm波是规划中的呢?

  • 但在配置后读取pwm寄存器组的周期寄存器数据,还是显示最开始初始化配置的数值,也就是动态设置周期寄存器是没有起到作用的

    具体是在什么时候读取的?

    另外,还想请教下,pwm初始化过程中,到哪一步就开始输出pwm波形了呢,如果初始化配置到某一步就突然开始输出pwm波形,而没有一个开始发波的使能位之类的操作,那如何能保证刚开始的pwm波是规划中的呢?

    是这样实现的:

    SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    
    /*此处配置EPWM*/
    
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

    配置前关闭EPWM模块的外设时钟;配置完成后再使能,然后就开始了计数。

  • 感谢回复!

    在程序中是按照上面这种方式来动态修改的。

    这个中断是10kHz,因此每进入4000次也就是0.4s动态修改一次周期寄存器的数值,将其设置为LLC_PWMPeriod_Dynamic(是一个不断改变的数值)

    然后程序在调试运行过程中,从EPWMRegs里的TBPRD里读取的数据始终没有变化,数据还是在最开始初始化的时候那个数值。

  • 你这些代码是在while(1)中的后台程序还是在ISR中的前台程序?

    Fullscreen
    1
    2
    3
    4
    5
    SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    /*EPWM*/
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    关闭及使能EPWM外设时钟的操作仅仅是在初始化的时候需要这么做。程序运行时需要更改PWM参数的时候,比如在中断程序中更改周期,直接操作相应的寄存器即可。

  • 您好:

    这部分代码是在PWM的中断ISR中执行的

    想在中断中动态地改变PWM频率

    试过在这里不加入时钟操作,直接对PWM的周期寄存器进行配置,但好像写不进去,读取了周期寄存器的数值是没有跟随设定变化。

  • 直接操作相应的寄存器即可吗?比如我要修改周期寄存器呢?

    目前的情况是不管在前台 isr 还是后台设置周期寄存器,都没有起到作用,未能修改周期寄存器的数值。是否还需要配合其他命令来实现呢?是否有可以参考的例程?

  • C:\ti\c2000\C2000Ware_4_03_00_00\device_support\f2837xd\examples\cpu1\epwm_up_aq\cpu01

    看一下这个例程,里面有动态升级比较值,可以参考一下。

    所有的例程都在这两个路径之下:

    driverlib版:C:\ti\c2000\C2000Ware_4_03_00_00\driverlib\f2837xd\examples\cpu1\epwm

    位域编程版:C:\ti\c2000\C2000Ware_4_03_00_00\device_support\f2837xd\examples\cpu1

    除了我上面提到的第一个路径中的例程,在后面两个路径中还有别的例程也涉及到动态升级周期值或比较值等参数,你可以自己探索一下。

  • C:\ti\c2000\C2000Ware_4_03_00_00\device_support\f2837xd\examples\cpu1\epwm_up_aq\cpu01

    上面这个例程里,是在ISR中动态修改了比较寄存器的数据,这个是没问题的

    我是想要动态修改周期寄存器的数据,这个有相关的例程吗?

    我把同路径下pwm的配置都看了,有一个是动态配置死区时间的

    看写法,也是直接对该寄存器进行配置就行了

    但我在写的时候,使用下面的写法

    实测也是无法有效配置

    还是说这种动态配置周期寄存器的必须要用HRPWM模式?

  • TBPRD周期寄存器直接修改就可以了。

    还是说这种动态配置周期寄存器的必须要用HRPWM模式?

    没这种说法。

  • 那仅需要上面这个配置命令就可以了吗?

    实测是没有起到修改周期寄存器的作用

  • 是的。等我回来之后我具体调一下

  • epwm_ex13_up_aq.zip

    你看下我的这个程序,基于 C:\ti\c2000\C2000Ware_4_03_00_00\driverlib\f2837xd\examples\cpu1\epwm-->epwm_ex13_up_aq 改的。

    我将EPWM1的中断关掉,在EPWM2的中断中修改EPWM1的TB值,在2000、4000之间翻转。

  • 感谢回复!

    我看程序里也只是使用了EPWM_setTimeBasePeriod(myEPWM1_BASE, 4000),这样就可以动态修改周期寄存器吗?

    目前手边没有控制板卡,没办法测试

    但我也是使用了EPWM_setTimeBasePeriod这个命令配置的,咋就没起到作用呢?好奇怪

  • 我看程序里也只是使用了EPWM_setTimeBasePeriod(myEPWM1_BASE, 4000),这样就可以动态修改周期寄存器吗?

    是的。

    也请注意一下TBPRD的装载方式,是直接装载还是通过影子寄存器装载;当通过影子寄存器装载的时候,是在CTR=0、CTR=PRD还是别的地方装载,如果计数器因为一些原因,没有达到这些地方,就不会装载。

  • 好的,谢谢

    在测试的时候也有注意到加载方式,配置的是计数器过零加载的影子寄存器模式,还是未能起到加载的效果