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.

F28M35x中断周期较长的问题



我现在使用ePWM模块产生SPWM波,程序中使用了中断服务子程序,经过测试发现中断周期的时间较长,也即中断服务子程序中的计数比较寄存器器CMPA值更新较慢影响PWM的精度。

请问1、如何才能缩短中断周期呢或是不使用中断来较快更新计数比较器CMPA的值呢???

         2、当计数器的值与CMPA值相等时是否即可产生中断并去执行中断服务子程序还是要计数到TBPRD的值时才可产生中断去执行中断程序呢???

期待朋友们的解答,谢谢!

  • hongyue,

    你用PWM的周期去产生中断,中断的周期就被PWM的周期给限定了。你可以使用一个timer2中断来更新PWM,或是一个没有使用的PWM模块,更高频率的PWM,让它产生中断,然后更新你需要输出的其他PWM模块的比较寄存器。

    另外,中断产生可以是计数器等于0, 等于period值,CMPA == Period, CMPB == Period,都可以。一般是在计数器等于0或周期值的时候产生中断。

    Eric

  • Eric Ma,

    谢谢您的答复!对于何时产生中断还不是很明白,比如说我设置CMPA=200;TBPRD=1000时,是不是说当计数器的值加到200时是不会触发中断的,而只有当计数器的值等于TBPRD的值的时候才会触发中断并去执行中断服务程序呢?还有就是芯片管脚电平的翻转是何时产生的呢,是在计数器的值等于CMPA的值时还是等于TBPRD的值时呢?

  • hongyue,

    F28M35 c28子系统的ePWM模块有一个ETSEL寄存器,可以设置在什么时候产生中断。

    如果你设置为100,则在计数器等于CMPA的时候就产生中断触发信号。

    至于PWM的电平反正,看AQCTLA寄存器,

    可以设置在几种情况下进行动作,置高,置低,翻转等,触发事件跟产生中断的触发事件是一样的,比如计数器等于0, CMPA等。

    Eric 

  • 谢谢Eric,我还有问题需要请教一下就是手册中关于shadowmode与immediatemode两者之间的区别或是优缺点还不是很清楚,还麻烦Eric讲解一下,谢谢!

     

     

  • hongyue,

    immediate mode, 顾名思义,就是当你改变比较寄存器或周期寄存器时,下一个TBCLK就马上载入该值。如果只有这种模式的话,那么当我们在使用PWM模块的时候,下个PWM周期的CMP的值如果要更新,比如在TB 计数器等于0的时候,马上进入中断,然后计算出该周期的比较寄存器的值,马上赋给它,然后在该PWM周期生效。当有可能你计算出CMP的值的时候,计数器已经过了那个点了,所以该CMP的值就变成是接下来的PWM周期的值了。

    而如果使用shadow模式的话,你可以在前一个PWM周期就把CMP的值计算好,然后在TB counter等于0的时候赋给它。

    大部分情况下都是用到shadow模式。

    Eric

  • 非常感谢Eric,若现在我使用shadow模式,计数模式设置为up-down计数模式,那我如果想每个周期产生一次中断的话就只能设置CTR=0或TBPRD对吗?这样每个周期CMP的值会更新一次,由于在每个周期都会产生两次比较,因此每个周期GPIO管脚可以动作两次。

    还有就是LOADMODE和中断的产生是同时发生的,比如说CTR=0那一刻即产生中断并去执行ISR,也可以将shadow寄存器的值加载到active寄存器中。

  • hongyue,

    你所说的都对。但有一点需要强调的是,中断可以在很多种事件产生,counter的值与CMPA,CMPB的值相等的时候,也可以产生中断。另外,up-down mode是会在每个周期比较两次,GPIO管教可以设置动作或不动作。

    Eric

  • 非常感谢Eric!