TI中文支持网
TI专业的中文技术问题搜集分享网站

PM_Sensorless中PWM_MACRO程序问题

使用PM_Sensorless例程时遇到一个疑问,PWM_MACRO中一段程序如下:

   Tmp = (int32)p->PeriodMax*(int32)p->MfuncPeriod;           // Q15 = Q0*Q15
        MPeriod = (int16)(Tmp>>16) + (int16)(p->PeriodMax>>1);     // Q0 = (Q15->Q0)/2 + (Q0/2)
        EvaRegs.T1PR = MPeriod; // Compute the compare 1 (Q0) from the PWM 1&2 duty cycle ratio (Q15)
        Tmp = (int32)MPeriod*(int32)p->MfuncC1;                    // Q15 = Q0*Q15
        EvaRegs.CMPR1 = (int16)(Tmp>>16) + (int16)(MPeriod>>1);    // Q0 = (Q15->Q0)/2 + (Q0/2)

中CMPR1比较器值为什么等于MPeriod*MfuncC1/2+MPeriod/2,而不是MPeriod*MfuncC1?

Susan Yang:Tmp = (int32)p->PeriodMax*(int32)p->MfuncPeriod;// Q15 = Q0*Q15

这一句应该是PWM周期PeriodMax乘以其占空比MfuncPeriod(低电平占周期的百分数),从而得到了比较寄存器的值。但它不是真正的比较寄存器的值,因为占空比经过范围变换处理

EvaRegs.CMPR1 = (int16)(Tmp>>16) + (int16)(MPeriod>>1);// Q0 = (Q15->Q0)/2 + (Q0/2)

把Tmp除以2,实现占空比由(-1,1)到(-0.5,0,5)的还原,然后取整(右移15位),将该数从Q15格式转换成Q0格式,然后加上0.5(对应MPeriod>>1)的偏移,把占空比还原到(0,1),此时的结果就是比较寄存器的值。

参考 bbs.eeworld.com.cn/thread-565883-1-1.html

赞(0)
未经允许不得转载:TI中文支持网 » PM_Sensorless中PWM_MACRO程序问题
分享到: 更多 (0)