CCS下通过编码器读取电机位置速度,求解释C语言&=语法及相关代码
C语言
&=按位与赋值语法解释 基础语法说明
variable_name &= 0xFFF是C语言的复合位运算赋值语句,等价于:
variable_name = variable_name & 0xFFF;
其中&是按位与运算符,运算规则为两个操作数的二进制对应位同时为1时,结果对应位才为1,否则为0。和固定十六进制值做按位与的作用通常是位掩码裁剪:保留十六进制值对应为1的二进制位,把对应为0的位全部清零,快速实现数值范围限制、有效位提取的需求。
比如示例中的0xFFF对应12位二进制全1,执行操作后变量仅保留低12位的数值,其余高位全部清零。
电机编码器代码场景的具体解释
你提供的Q格式转角计算代码如下:
// 以下代码用于计算机械转角 // p->thetaMech ≈ QPOSCNT / mechScaler (当前计数 / 单圈总计数) // 其中mechScaler = 4000 计数/圈 temp = (int32_t)p->thetaRaw * (int32_t)p->mechScaler; // Q0格式 * Q26格式 = Q26格式 temp &= 0x03FFF000; p->thetaMech = (int16_t)(temp >> 11); // Q26格式右移11位转换为Q15格式 p->thetaMech &= 0x7FFF;
两处&=操作的作用分别为:
temp &= 0x03FFF000:0x03FFF000对应的二进制是第12位到第25位全1,其余位为0。该操作会保留Q26格式乘积结果中对应单圈转角的有效位段,清零超出单圈范围的高位和不需要的低位,避免无效数值干扰后续计算,适配4000线编码器的计数范围。p->thetaMech &= 0x7FFF:0x7FFF对应二进制低15位全1、最高位为0。Q15格式的正数值范围为00x7FFF,该操作会清零最高位的符号位,保证输出的机械转角为正的有效值,符合01圈的转角取值要求。
在电机控制这种高实时性需求的场景中,使用位运算做范围裁剪比取模、条件判断的运算速度快很多,非常适配CCS开发DSP/MCU的嵌入式实时控制场景。
内容的提问来源于stack exchange,提问作者Slowburn
相关产品推荐
相关产品推荐

