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.

TMS320F28379D: 在eQEP模块的官方示例文件中,电机速度和位置测量例程中的“eqep_ex2_calculation.c”文件的部分代码的作用

Part Number: TMS320F28379D

您好,我是一名初学者,在学习eQEP模块关于电机位置和转速测量的官方示例文件时,不明白“eqep_ex2_calculation.c”文件中部分代码的作用,我迷惑代码段是:

//
temp = (int32_t)p->thetaRaw * (int32_t)p->mechScaler; // Q0 * Q26 = Q26
temp &= 0x03FFF000;

p->thetaMech = (int16_t)(temp >> 11); // Q26 -> Q15
p->thetaMech &= 0x7FFF;

//
// The following lines calculate p->elec_mech
//
p->thetaElec = p->polePairs * p->thetaMech; // Q0 * Q15 = Q15
p->thetaElec &= 0x7FFF;

//

我想询问:“temp &= 0x03FFF000;” 、 “p->thetaMech &= 0x7FFF;” 和 “p->thetaElec &= 0x7FFF;” 的作用分别是什么?

非常感谢您的帮助!

  • 后两个都好理解,&= 0x7FFF;因为都是转换成Q15的格式,也就是只需要15位,&= 0x7FFF就相当于保留后15bit,前面各位都清零,这样避免计算或移位过程中产生异常,是一种严谨的写法

    第一个&= 0x03FFF000类似,只保留后面26位,前面各位清零,唯一奇怪的是&= 0x03FFF000之后,     后12bit被清零了。这个猜测是精度取舍的原因,按照eqep_ex2_calculation.c例程注释中所写mechScaler=(1/4000)<<26=16777,当thetaRaw最小为1时,也就是最小分辨率为16777=2进制0x4189, 后12bit被清零后为0x4000,相当于牺牲了一部分精度,这个应该也问题不大,0x4000=16384约等于16777,况且后面右移11位,本身源数据的后11bit也会移没。