使用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