gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:51:27 29 4
gpt4 key购买 nike

我正在编写一个内置于其中一个微 Controller (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 放入结构中(注意,我假设 16 位变量,并且不关心结构中的位字段,这些位字段会稍微改变一些内容,但不关心它不起作用的原因)

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 部分。

为什么不简单地获取加速度的值并将其发送而不将四个最低位设为零呢?位字段将使其成为 12 位值。当发送 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);

关于将原始加速度计值转换为 12 位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48313989/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com