[英]Converting raw Accelerometer values to 12 bit number
我正在对内置在一个微控制器(TZ1000系列)中的加速度计进行编码。 我正在尝试将数据BLE发送到PC应用程序。 我必须以2个字节发送该数字,并在应用程序端接收它,并将其组合成一个12位数字。 我在将实际的原始加速度计值转换为12位数字时遇到问题。 我正在阅读以下格式。
acc->ReadAcceleration((uint16_t*)buf);
ChannelX[M] = (buf[0].acceleration << 4) & 0xFFF0;
ChannelY[M] = (buf[1].acceleration << 4) & 0xFFF0;
ChannelZ[M] = (buf[2].acceleration << 4) & 0xFFF0;
如果变量的类型和大小如下,
int16_t ChannelX[4] = {0,0,0,0};
int16_t ChannelY[4] = {0,0,0,0};
int16_t ChannelZ[4] = {0,0,0,0};
buf
类型为static ACCEL_ACCELERATION buf[12];
它的结构如下
typedef struct _ACCEL_ACCELERATION {
uint16_t updated : 1;
uint16_t reserved : 3;
int16_t acceleration :12;
} ACCEL_ACCELERATION;
现在,当我将数据转换为两个字节并通过BLE传输时,我遵循以下逻辑。
uart_tx_data[i] = (uint8_t) (ChannelX[j] & 0xFF);
uart_tx_data[i+1] = (uint8_t) ((ChannelX[j]>>12) & 0x0F) ;
uart_tx_data[i+2] = (uint8_t) (ChannelY[j] & 0xFF);
uart_tx_data[i+3] = (uint8_t) ((ChannelY[j]>>12) & 0x0F) ;
uart_tx_data[i+4] = (uint8_t) (ChannelZ[j] & 0xFF);
uart_tx_data[i+5] = (uint8_t) ((ChannelZ[j]>>12) & 0x0F) ;
其中变量的类型为static uint8_t uart_tx_data[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
在接收端,我将其转换为12位数字,如下所示:
X[i]= (num[2] & 0xFF) | ((num[3] & 0x0F) << 12);
其中int[] X= new int[2];
我得到的值是错误的,我通过在加速度计上进行1g测试来检查它。 例如,当其展平时,其数值应接近零。 并且在1g时,应根据我设置的灵敏度给出一个数字(在我的情况下为8G,值为256)。
我使用的逻辑有什么问题吗? 我要求有人帮助我。
先感谢您。
你的班次都没有了。 使用常量查看正在发生的事情。 示例:将0x1234放入结构中(请注意,我假设16bit变量,而不在乎结构中的位字段,这些位字段会稍微改变事情,但不会更改其无效的原因)
ChannelX[M] = (buf[0].acceleration << 4) & 0xFFF0;
这将导致0x2340。 不知道为什么要使最低的四位为零,但让我们继续吧。 然后发送:
uart_tx_data[i] = (uint8_t) (ChannelX[j] & 0xFF);
uart_tx_data[i+1] = (uint8_t) ((ChannelX[j]>>12) & 0x0F) ;
第一部分是0x2340 & 0xff == 0x40
因此您总是从最低位发送四个零。 第二部分将是0x2340 >> 12 == 0x02
因此您在其中缺少整个3部分。
为什么不简单地将acceleration
的值发送而不将四个最低位设为零呢? 这些位字段将使其变成12bit的值。 当发送班次8,而不是12。
ChannelX[M] = buf[0].acceleration;
uart_tx_data[i] = (uint8_t) (ChannelX[j] & 0xFF);
uart_tx_data[i+1] = (uint8_t) ((ChannelX[j]>>8) & 0x0F);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.