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