我正在查询 ADXL362数字输出MEMS加速度计的轴数据,该数据作为两个8位寄存器保存在一起,这些寄存器组合在一起给出12位值,我试图弄清楚如何合并这些值。我从来都不擅长按位操作,因此我们将不胜感激。我可以想象是这样的:
number = Z_data_H << 8 | Z_data_L;
number = (number & ~(1<<13)) | (0<<13);
number = (number & ~(1<<14)) | (0<<14);
number = (number & ~(1<<15)) | (0<<15);
number = (number & ~(1<<16)) | (0<<16);
ADXL362 data sheet(第26页)
Z轴数据寄存器
答案 0 :(得分:0)
您只需要做:
signed short number;
number = Z_data_H << 8 | Z_data_L;
左移8位加上您已经使用的低位 弄清楚了正确地组合了两个字节。只需使用适当的数据大小,即可使C代码正确地重新识别12位数字的符号。
请注意,short
不一定指16位值,具体取决于您的编译器和体系结构-因此,您可能希望尝试这样做。
答案 1 :(得分:0)
您的第一行应该是您所需要的:
int16_t number;
number = (Z_data_H << 8) | Z_data_L;
符号扩展位意味着您可以读取该值,就像它是一个16位带符号整数一样。 值绝对不会超出12位整数的范围。重要的是,请保留这些位完整无缺,以便正确处理负值。