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.

[参考译文] TMS320F2.8377万D:HRPWM理解手动转换

Guru**** 2587365 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/657334/tms320f28377d-hrpwm-understanding-manual-conversion

部件号:TMS320F2.8377万D

您好,

我正在尝试在F2.8337万D中实施HRPWM功能。 为了了解这一点,我尝试比较自动转换模式结果和手动转换结果,但结果似乎不同。 为什么CMPA和CMPAHR寄存器启用或不启用自动转换模式的结果不同? 我尝试了TI的示例(HRPWM_Duty_SFO_V8.c),也得到了以下不同的结果:

DutyFine = 0x5737

EPwm1Regs.TBPRD = 9

MEP_ScaleFactor = 64 (由SFO计算)

启用自动转换模式后,我将获得:  

EPwm1Regs.CMPA.bit.CMPA=0x6

EPwm1Regs.CMPA.bit.CMPAHR=0x2100

 启用手动模式后,我将获得:  

EPwm1Regs.CMPA.bit.CMPA=0x6

EPwm1Regs.CMPA.bit.CMPAHR=0x0800

对于手动转换, 我看到TI用于F2.8379万D (HRPWM_Duty_SFO_V8.c)的示例:

备注:
**如果启用了自动转换,则执行以下步骤
在硬件中自动执行,可以跳过
//加上偏移和舍入
CMPAHR_REG_Val += 0x0080;

但是,在下面的TI代码中,我看不到这种偏移和舍入。 实际上,在技术参考手册中,它也不会出现,因此我不知道它是否是示例中的错误。

代码:

#IF (AUTOCONVERT)
CMPAHR_REG_VAL = temp<1;//转换为Q16
CMPBRH_REG_VAL = temp<1;//转换为Q16
#else
CMPAHR_REG_VAL =(temp*MEP_ScaleFactor)+(0x0080<7)>15; CMP_PVL_REG_PVREG_=<8=<MPHR_MPHR=<8<MPREG_MPHR_MPREG_PVREG_<7=<MPHR_MPREG_MPHR_MPREG_<7=8





因此,是否需要为偏移和舍入添加0x0080? 为什么两种模式的结果不同?
谢谢!

Maite

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Maite:

    我认为0x80相当于0.5 TRM左移8位中所要求的+TRM舍入因子。  在手册代码中,我们将介绍这些步骤

    0x80

    (0x80 << 7)

    (0x80 << 7)>> 15.

    ((0x80 << 7)>> 15)<< 8.

    这将解析回写入寄存器的所需最终偏移值0x80。

    我不知道为什么两个过程的值都不相同。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Devin,

    你可能是对的。 问题(或疑问)在于,在TI的示例中,他们似乎执行了两次(根据评论),但在代码中,他们只执行我之前发布的内容。

    我在此附上评论:

     **如果启用了自动转换,则执行以下步骤
                  在硬件中自动执行,可以跳过
               //这将从获取MEP计数(以数字表示)
               // 0,1,... MEP_Scalefactor。
               // 0x0080 (Q8中的0.5)通过向左移动7在Q15中转换为0.5。
               //此值添加到分数占空*MEP_SF产品中以进行圆整
               //产品的小数部分,如果是,则为下一个整数
               //小数部分0.5。
               //
               //由于这是Q15,所以再次出现
               //通过移动转换为Q0:
               CMPAHR_REG_VAL =(temp*MEP_ScaleFactor+(0x0080<7)>>15;

               **如果启用了自动转换,则执行以下步骤
                  在硬件中自动执行,可以跳过
               //现在,较低的8位包含MEP计数。
               //因为MEP计数需要位于的上8位
               // 16位CMPHR寄存器,向左移动8。
               CMPAHR_REG_VAL = CMPAHR_REG_VAL <8;

               **如果启用了自动转换,则执行以下步骤
                  在硬件中自动执行,可以跳过
               //加上偏移和舍入
               CMPAHR_REG_Val += 0x0080;


    另一方面,我认为,执行自动转换模式和手动模式的CMPHR寄存器值之间的差异是正常的。 根据技术参考手册,在自动模式下,硬件使用MEP_ScaleFactor将CMPHR中的值转换为PWM输出上的缩放微边delyay ...因此我认为不可能比较两个CMPHR值,我们应该比较PWM输出。

    非常感谢!

    Maite

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Maite:

    我们正在努力确认这些评论确实需要更新。 然后,我们最终将向SW发布更新,以协调备注,文档和实际程序。