繁体   English   中英

将原始加速度计值转换为12位数字

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM