CPU为TMS320F2808,最近一个项目需要在每个周期单独设置高有效、低有效。计数方式为连续增减计数,产生对称载波,比较寄存器采用SHADOW模式,TBCTR过零时更新。
想用以下的代码实现,一下代码在PWM中断服务程序中
低有效:
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
高有效:
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
但是有个问题AQCTLA的寄存器没有SHADOW模式,设置之后立即生效,而中断服务程序的执行时间只能保证小于PWM周期,在一个周期内更新的时刻是不确定的,即使在中断服务程序开始更新AQCTLA也无法完全做到同步。如果AQCTLA.和CMPA.half.CMPA一样有自己的SHADOW寄存器,可以设置在TBCTR过零更新就可以了。现有的条件下,有没有比较好的解决方案?
Jones Chen:
1. 为什么低有效和高有效的代码是相同的?
2. 你这样配置的话,需要保证,在进入ISR之前,TBCTR没有达到CAU或者CAD,否则就会像你描述的有延迟。
3. 尝试一下AQSFRC
4. 建议您在TBCTR=0时进中断,在中断中配置以上代码,此时TBCTR还没有达到CAU或者CAD,这就能保证每次可以在CAU或者CAD时,起作用。
CPU为TMS320F2808,最近一个项目需要在每个周期单独设置高有效、低有效。计数方式为连续增减计数,产生对称载波,比较寄存器采用SHADOW模式,TBCTR过零时更新。
想用以下的代码实现,一下代码在PWM中断服务程序中
低有效:
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
高有效:
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
但是有个问题AQCTLA的寄存器没有SHADOW模式,设置之后立即生效,而中断服务程序的执行时间只能保证小于PWM周期,在一个周期内更新的时刻是不确定的,即使在中断服务程序开始更新AQCTLA也无法完全做到同步。如果AQCTLA.和CMPA.half.CMPA一样有自己的SHADOW寄存器,可以设置在TBCTR过零更新就可以了。现有的条件下,有没有比较好的解决方案?
Xiao Dong:
回复 Jones Chen:
1. 代码应该是不相同的,后面一个AQ_CLEAR和AQ_SET反一下,但是编辑框太小了,复制完忘记修改过来了。
2. 这个肯定是无法保证的
3. 这个只在spru791上有简单的描述,请问哪个文档有更详细的介绍或者示例代码?
4. 现在就是在TBCTR==0时进中断,但是由于中断延时,真正进入后发现TBCTR已经计数到30或者更多了,有可能达到CAU
最好的方法还是AQCTLA带shadow,现在不是, AQCSFRC是带shadow的,但是现在它的用法我还不是很明确,文档上描述比较少,希望能给一点提示。谢谢
CPU为TMS320F2808,最近一个项目需要在每个周期单独设置高有效、低有效。计数方式为连续增减计数,产生对称载波,比较寄存器采用SHADOW模式,TBCTR过零时更新。
想用以下的代码实现,一下代码在PWM中断服务程序中
低有效:
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
高有效:
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
但是有个问题AQCTLA的寄存器没有SHADOW模式,设置之后立即生效,而中断服务程序的执行时间只能保证小于PWM周期,在一个周期内更新的时刻是不确定的,即使在中断服务程序开始更新AQCTLA也无法完全做到同步。如果AQCTLA.和CMPA.half.CMPA一样有自己的SHADOW寄存器,可以设置在TBCTR过零更新就可以了。现有的条件下,有没有比较好的解决方案?
Jones Chen:
回复 Xiao Dong:
4. 现在就是在TBCTR==0时进中断,但是由于中断延时,真正进入后发现TBCTR已经计数到30或者更多了,有可能达到CAU
恩,这个是关键。
这样就需要另外再启用一个PWM模块,这两个模块之间有一定的相位差,可以用EWPM同步的功能,另启用的那个模块要提前于此模块,进入中断,进行配置。现在已有的这个模块就不要配置了。
CPU为TMS320F2808,最近一个项目需要在每个周期单独设置高有效、低有效。计数方式为连续增减计数,产生对称载波,比较寄存器采用SHADOW模式,TBCTR过零时更新。
想用以下的代码实现,一下代码在PWM中断服务程序中
低有效:
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
高有效:
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
但是有个问题AQCTLA的寄存器没有SHADOW模式,设置之后立即生效,而中断服务程序的执行时间只能保证小于PWM周期,在一个周期内更新的时刻是不确定的,即使在中断服务程序开始更新AQCTLA也无法完全做到同步。如果AQCTLA.和CMPA.half.CMPA一样有自己的SHADOW寄存器,可以设置在TBCTR过零更新就可以了。现有的条件下,有没有比较好的解决方案?
Xiao Dong:
回复 Jones Chen:
这样感觉把简单的问题复杂化了,不过除此之外似乎也没有更好的解决办法。如果AQ相关的寄存器也有SHADOW功能就完全没有这个问题了。
CPU为TMS320F2808,最近一个项目需要在每个周期单独设置高有效、低有效。计数方式为连续增减计数,产生对称载波,比较寄存器采用SHADOW模式,TBCTR过零时更新。
想用以下的代码实现,一下代码在PWM中断服务程序中
低有效:
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
高有效:
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
但是有个问题AQCTLA的寄存器没有SHADOW模式,设置之后立即生效,而中断服务程序的执行时间只能保证小于PWM周期,在一个周期内更新的时刻是不确定的,即使在中断服务程序开始更新AQCTLA也无法完全做到同步。如果AQCTLA.和CMPA.half.CMPA一样有自己的SHADOW寄存器,可以设置在TBCTR过零更新就可以了。现有的条件下,有没有比较好的解决方案?
Jones Chen:
回复 Xiao Dong:
暂时没有更好的解决办法了。因为您的CAU的值比较小,而且是在中断中,要不断的改写输出的状态。