在 C 中将两个 8 位寄存器读入 ADXL362 的 12 位值
Reading two 8 bit registers into 12 bit value of an ADXL362 in C
我正在查询 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轴数据寄存器
您只需要做:
signed short number;
number = Z_data_H << 8 | Z_data_L;
左移8位结合你已经有的低位
已经弄清楚正确组合了 2 个字节。只需使用适当的数据大小即可让 C 代码正确识别 12 位数字的符号。
请注意,short
不一定指 16 位值,具体取决于您的编译器和体系结构 - 因此,您可能想尝试这样做。
你的第一行应该是你需要的:
int16_t number;
number = (Z_data_H << 8) | Z_data_L;
符号扩展位意味着您可以像读取 16 位带符号整数一样读取该值。 value 永远不会超出 12 位整数的范围。为了正确处理负值,请务必保持这些位不变。
我正在查询 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轴数据寄存器
您只需要做:
signed short number;
number = Z_data_H << 8 | Z_data_L;
左移8位结合你已经有的低位 已经弄清楚正确组合了 2 个字节。只需使用适当的数据大小即可让 C 代码正确识别 12 位数字的符号。
请注意,short
不一定指 16 位值,具体取决于您的编译器和体系结构 - 因此,您可能想尝试这样做。
你的第一行应该是你需要的:
int16_t number;
number = (Z_data_H << 8) | Z_data_L;
符号扩展位意味着您可以像读取 16 位带符号整数一样读取该值。 value 永远不会超出 12 位整数的范围。为了正确处理负值,请务必保持这些位不变。