當(dāng)BLE遇到MEMS,就如同天使有了翅膀。本期從有淺入深的介紹BLE與MEMS的那些事,就從ST的STEVAL-IDB007V1開(kāi)發(fā)板中BLE_SensorDemo例程開(kāi)始。
藍(lán)牙入門(mén)網(wǎng)上資料很多,可參考《藍(lán)牙BLE權(quán)威教程》,或者看看干貨 | BLE開(kāi)發(fā),你要知道這幾件事
開(kāi)發(fā)環(huán)境搭建請(qǐng)參考論壇帖子STEVAL-IDB007V1之透?jìng)餮菔静僮髁鞒毯退柢浖Y源下載(http://bbs.eeworld.com.cn/thread-604229-1-1.html),從開(kāi)始菜單進(jìn)入BlueNRG-1 Navigator可以實(shí)際運(yùn)行各種例程查看效果。
硬件連接:使用ST-Link V2中SWCLK與SWDIO與開(kāi)發(fā)板對(duì)應(yīng)的引腳連接,用來(lái)仿真;供電和串口都通過(guò)USB線纜。
下圖是局部放大圖:
會(huì)發(fā)現(xiàn)陀螺儀的值會(huì)跳變(不同的傾角下跳變的概率不一樣,更新頻率越高,跳變的概率越大),由于陀螺儀在原始的寄存器值上乘以了70,將跳變值除以70后為+255和-255。
經(jīng)過(guò)一系列的摸索,和ST工程師的幫助,終于解決了問(wèn)題,見(jiàn)下圖,那就是將BDU(Block Data Update)位置1,沒(méi)有置1的話,數(shù)據(jù)沒(méi)有準(zhǔn)備好就被讀出來(lái)也是有可能的,這也就是為何更新頻率設(shè)置的越高就會(huì)越容易出現(xiàn)錯(cuò)誤值的原因。
其實(shí)早在2015年在數(shù)據(jù)手冊(cè)中就建議將BDU位置1了,后來(lái)的官方初始化程序中也都將BDU置1了。
下面是不動(dòng)芯片,僅僅將BDU置1后的效果:
因此想要準(zhǔn)確的的獲取的數(shù)據(jù)記得將BDU位置1哦。
更高效的讀取數(shù)據(jù)該傳感器使用的是SPI接口,這點(diǎn)很好,相比于IIC,SPI這是要快太多了,我們可以節(jié)約更多的時(shí)間用來(lái)做其他的事,也有利于節(jié)能,該芯片最高支持10MHz的SPI速度,但是驅(qū)動(dòng)卻寫(xiě)的不是很高效,官方代碼如下:
-
static IMU_6AXES_StatusTypeDef LSM6DS3_G_GetAxes( int32_t *pData )
-
{
-
/*Here we have to add the check if the parameters are valid*/
-
int16_t pDataRaw[3];
-
float sensitivity = 0.0f;
-
if(LSM6DS3_G_GetAxesRaw(pDataRaw) != IMU_6AXES_OK)
-
{
-
return IMU_6AXES_ERROR;
-
}
-
if(LSM6DS3_G_GetSensitivity( &sensitivity ) != IMU_6AXES_OK)
-
{
-
return IMU_6AXES_ERROR;
-
}
-
pData[0] = (int32_t)(pDataRaw[0] * sensitivity);
-
pData[1] = (int32_t)(pDataRaw[1] * sensitivity);
-
pData[2] = (int32_t)(pDataRaw[2] * sensitivity);
-
return IMU_6AXES_OK;
-
static IMU_6AXES_StatusTypeDef LSM6DS3_G_GetAxesRaw( int16_t *pData )
-
{
-
/*Here we have to add the check if the parameters are valid*/
-
uint8_t tempReg[2] = {0, 0};
-
if(LSM6DS3_IO_Read(&tempReg[0], LSM6DS3_XG_MEMS_ADDRESS, LSM6DS3_XG_OUT_X_L_G, 2) != IMU_6AXES_OK)
-
{
-
return IMU_6AXES_ERROR;
-
}
-
pData[0] = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
-
if(LSM6DS3_IO_Read(&tempReg[0], LSM6DS3_XG_MEMS_ADDRESS, LSM6DS3_XG_OUT_Y_L_G, 2) != IMU_6AXES_OK)
-
{
-
return IMU_6AXES_ERROR;
-
}
-
pData[1] = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
-
if(LSM6DS3_IO_Read(&tempReg[0], LSM6DS3_XG_MEMS_ADDRESS, LSM6DS3_XG_OUT_Z_L_G, 2) != IMU_6AXES_OK)
-
{
-
return IMU_6AXES_ERROR;
-
}
-
pData[2] = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
-
return IMU_6AXES_OK;
-
}
每次都是單次讀取(讀兩個(gè)字節(jié))每一軸的數(shù)據(jù),而且還獲取了一次sensitivity(讀一個(gè)字節(jié))。
我們知道SPI要完成一次讀數(shù)據(jù)的操作,本質(zhì)是需要讀寫(xiě)兩次的,第一次將地址寫(xiě)進(jìn)去,然后再將0寫(xiě)入,將數(shù)據(jù)弄出來(lái)。因此驅(qū)動(dòng)如果需要讀取6軸的數(shù)據(jù)一共需要寫(xiě)12次,讀18次SPI。而我認(rèn)為sensitivity是開(kāi)始設(shè)置的,可以不讀,然后6軸的數(shù)據(jù)可以一次全部讀出來(lái),因?yàn)槟J(rèn)SPI地址是會(huì)累加的,
因此程序可以改成如下,然后將陀螺儀值乘以70,加速度計(jì)值乘以0.122
-
void Get_Sensor_RawData(void){
-
Sensor_IO_Read(NULL,LSM6DSL_ACC_GYRO_OUTX_L_G,regValue, 12);
-
for(int i=0;i<6;i++){
-
Sensor_Raw_Data[/size][/font][font=微軟雅黑][size=3] = ( ( ( ( int16_t )m_rx_buf[2*i+2] ) << 8 ) + (int16_t )m_rx_buf[2*i+1] );
-
}
-
}
從0x22地址開(kāi)讀,也就是寫(xiě)1次,讀12次,而且還節(jié)約了SPI的開(kāi)啟和關(guān)閉的耗時(shí),這樣就大大的提高的數(shù)據(jù)獲取的速度,如果可以使用DMA能夠更高效。
因此如果想要更加高效的使用陀螺儀加速度計(jì),記得要連續(xù)的讀取12個(gè)字節(jié)且無(wú)需讀取靈敏度哦。
-
mems
+關(guān)注
關(guān)注
129文章
4143瀏覽量
194086 -
陀螺儀
+關(guān)注
關(guān)注
44文章
846瀏覽量
99954 -
ST
+關(guān)注
關(guān)注
32文章
1176瀏覽量
130446
原文標(biāo)題:干貨 | 當(dāng)BLE遇到MEMS——收服和調(diào)教
文章出處:【微信號(hào):wwzhifudianhua,微信公眾號(hào):MEMS技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
如何選擇合適的芯科科技Wi-Fi開(kāi)發(fā)板
中微愛(ài)芯32位MCU開(kāi)發(fā)板AiP32RV15X介紹

有ARM,NPU,F(xiàn)PGA三種核心的開(kāi)發(fā)板 — 米爾安路飛龍派開(kāi)發(fā)板

【新品】遠(yuǎn)距離圖傳數(shù)傳模塊開(kāi)發(fā)板、藍(lán)牙模塊開(kāi)發(fā)板、無(wú)線模塊開(kāi)發(fā)板

第二章 開(kāi)發(fā)板與芯片介紹 詳解W55MH32芯片及開(kāi)發(fā)板

迅為RK3568開(kāi)發(fā)板驅(qū)動(dòng)指南Linux中通用SPI設(shè)備驅(qū)動(dòng)

瑞芯微主板/開(kāi)發(fā)板Linux系統(tǒng)播放音頻方法,觸覺(jué)智能RK3562開(kāi)發(fā)板演示

正點(diǎn)原子fpga開(kāi)發(fā)板不同型號(hào)
【干貨】有了這份HK32F407ZGT7開(kāi)發(fā)板介紹,1萬(wàn)個(gè)項(xiàng)目輕松拿捏!

【BearPi-Pico H3863星閃開(kāi)發(fā)板體驗(yàn)連載】藍(lán)牙 BLE 透?jìng)鳒y(cè)試
瑞薩開(kāi)發(fā)板?RX-FSOE-REF-KIT功能安全使用介紹(上)

評(píng)論