簡體   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