0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

有浅入深的介绍BLE与MEMS中的开发板设计

MEMS技术 来源:互联网 作者:佚名 2018-03-31 08:44 次阅读

当BLE遇到MEMS,就如同天使有了翅膀。本期从有浅入深的介绍BLE与MEMS的那些事,就从ST的STEVAL-IDB007V1开发板中BLE_SensorDemo例程开始。

蓝牙入门网上资料很多,可参考《蓝牙BLE权威教程》,或者看看干货 | BLE开发,你要知道这几件事

开发环境搭建请参考论坛帖子STEVAL-IDB007V1之透传演示操作流程和所需软件资源下载(http://bbs.eeworld.com.cn/thread-604229-1-1.html),从开始菜单进入BlueNRG-1 Navigator可以实际运行各种例程查看效果。

硬件连接:使用ST-Link V2中SWCLK与SWDIO与开发板对应的引脚连接,用来仿真供电和串口都通过USB线缆。

下图是局部放大图:

会发现陀螺仪的值会跳变(不同的倾角下跳变的概率不一样,更新频率越高,跳变的概率越大),由于陀螺仪在原始的寄存器值上乘以了70,将跳变值除以70后为+255和-255。

经过一系列的摸索,和ST工程师的帮助,终于解决了问题,见下图,那就是将BDU(Block Data Update)位置1,没有置1的话,数据没有准备好就被读出来也是有可能的,这也就是为何更新频率设置的越高就会越容易出现错误值的原因。

其实早在2015年在数据手册中就建议将BDU位置1了,后来的官方初始化程序中也都将BDU置1了。

下面是不动芯片,仅仅将BDU置1后的效果:

因此想要准确的的获取的数据记得将BDU位置1哦。

更高效的读取数据传感器使用的是SPI接口,这点很好,相比于IIC,SPI这是要快太多了,我们可以节约更多的时间用来做其他的事,也有利于节能,该芯片最高支持10MHz的SPI速度,但是驱动却写的不是很高效,官方代码如下:

  1. static IMU_6AXES_StatusTypeDef LSM6DS3_G_GetAxes( int32_t *pData )

  2. {

  3. /*Here we have to add the check if the parameters are valid*/

  4. int16_t pDataRaw[3];

  5. float sensitivity = 0.0f;

  6. if(LSM6DS3_G_GetAxesRaw(pDataRaw) != IMU_6AXES_OK)

  7. {

  8. return IMU_6AXES_ERROR;

  9. }

  10. if(LSM6DS3_G_GetSensitivity( &sensitivity ) != IMU_6AXES_OK)

  11. {

  12. return IMU_6AXES_ERROR;

  13. }

  14. pData[0] = (int32_t)(pDataRaw[0] * sensitivity);

  15. pData[1] = (int32_t)(pDataRaw[1] * sensitivity);

  16. pData[2] = (int32_t)(pDataRaw[2] * sensitivity);

  17. return IMU_6AXES_OK;

  1. static IMU_6AXES_StatusTypeDef LSM6DS3_G_GetAxesRaw( int16_t *pData )

  2. {

  3. /*Here we have to add the check if the parameters are valid*/

  4. uint8_t tempReg[2] = {0, 0};

  5. if(LSM6DS3_IO_Read(&tempReg[0], LSM6DS3_XG_MEMS_ADDRESS, LSM6DS3_XG_OUT_X_L_G, 2) != IMU_6AXES_OK)

  6. {

  7. return IMU_6AXES_ERROR;

  8. }

  9. pData[0] = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);

  10. if(LSM6DS3_IO_Read(&tempReg[0], LSM6DS3_XG_MEMS_ADDRESS, LSM6DS3_XG_OUT_Y_L_G, 2) != IMU_6AXES_OK)

  11. {

  12. return IMU_6AXES_ERROR;

  13. }

  14. pData[1] = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);

  15. if(LSM6DS3_IO_Read(&tempReg[0], LSM6DS3_XG_MEMS_ADDRESS, LSM6DS3_XG_OUT_Z_L_G, 2) != IMU_6AXES_OK)

  16. {

  17. return IMU_6AXES_ERROR;

  18. }

  19. pData[2] = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);

  20. return IMU_6AXES_OK;

  21. }

每次都是单次读取(读两个字节)每一轴的数据,而且还获取了一次sensitivity(读一个字节)。

我们知道SPI要完成一次读数据的操作,本质是需要读写两次的,第一次将地址写进去,然后再将0写入,将数据弄出来。因此驱动如果需要读取6轴的数据一共需要写12次,读18次SPI。而我认为sensitivity是开始设置的,可以不读,然后6轴的数据可以一次全部读出来,因为默认SPI地址是会累加的,

因此程序可以改成如下,然后将陀螺仪值乘以70,加速度计值乘以0.122

  1. void Get_Sensor_RawData(void){

  2. Sensor_IO_Read(NULL,LSM6DSL_ACC_GYRO_OUTX_L_G,regValue, 12);

  3. for(int i=0;i<6;i++){

  4. 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] );

  5. }

  6. }

从0x22地址开读,也就是写1次,读12次,而且还节约了SPI的开启和关闭的耗时,这样就大大的提高的数据获取的速度,如果可以使用DMA能够更高效。

因此如果想要更加高效的使用陀螺仪加速度计,记得要连续的读取12个字节且无需读取灵敏度哦。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mems
    +关注

    关注

    129

    文章

    3885

    浏览量

    190210
  • 陀螺仪
    +关注

    关注

    44

    文章

    776

    浏览量

    98471
  • ST
    ST
    +关注

    关注

    32

    文章

    1126

    浏览量

    128774

原文标题:干货 | 当BLE遇到MEMS——收服和调教

文章出处:【微信号:wwzhifudianhua,微信公众号:MEMS技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【BearPi-Pico H3863星闪开发板体验连载】蓝牙 BLE 透传测试

    蓝牙 BLE 透传测试 小熊派 Pico-H3863 开发板支持 BLE 1MHz/2MHz 频宽、BLE4.0/4.1/4.2/5.0/5.1/5.2 协议、
    发表于 10-04 11:57

    51开发板芯片资料

    51开发板芯片资料
    发表于 09-18 09:29 1次下载

    瑞萨开发板​RX-FSOE-REF-KIT功能安全使用介绍(上)

    本文基于瑞萨官方开发板RX-FSOE-REF-KIT,介绍EtherCAT通讯的功能安全应用开发以及实现过程所需的开发环境。
    的头像 发表于 08-20 15:25 408次阅读
    瑞萨<b class='flag-5'>开发板</b>​RX-FSOE-REF-KIT功能安全使用<b class='flag-5'>介绍</b>(上)

    EFR32MG24开发板介绍及IDE使用

    EFR32MG24开发板介绍及IDE使用
    的头像 发表于 08-10 10:47 575次阅读
    EFR32MG24<b class='flag-5'>开发板</b><b class='flag-5'>介绍</b>及IDE使用

    多个esp32开发板如何组成ble mesh网络,是否可以自动组网呢?

    关于example下的ble_mesh样例ble_mesh_node 1.多个esp32开发板如何组成mesh网络,是否可以自动组网? 2、在组成mesh的情况下,各个esp32如何和应用程序进行接口,如api和回调? 3、节点
    发表于 06-24 07:53

    使用esp-idf-v5.0.1 example的esp_ble_mesh例程遇到的疑问求解

    本人使用esp-idf-v5.0.1 example的esp_ble_mesh例程,共使用6个ESP-WROVER-KIT开发板。在4个开发板上烧写onoff_client例程,在1
    发表于 06-12 07:25

    鸿蒙OpenHarmony南向:【Hi3861开发板介绍

    Hi3861开发板是一片大约2cm*5cm大小的开发板,是一款高度集成的2.4GHz WLAN SoC芯片,集成IEEE 802.11b/g/n基带和RF(Radio Frequency)电路。支持,并配套提供开放、易用的开发
    的头像 发表于 05-06 17:19 923次阅读
    鸿蒙OpenHarmony南向:【Hi3861<b class='flag-5'>开发板</b><b class='flag-5'>介绍</b>】

    OpenHarmony鸿蒙南向开发案例:【智能猫眼(基于Hi3518开发板)】

    基于Hi3518开发板,使用开源OpenHarmony开发的RTSP协议流媒体应用。达到将Hi3518开发板摄像头获取的数据通过RTSP协议传输到手机并显示 。
    的头像 发表于 04-22 15:46 1860次阅读
    OpenHarmony鸿蒙南向<b class='flag-5'>开发</b>案例:【智能猫眼(基于Hi3518<b class='flag-5'>开发板</b>)】

    OpenHarmony鸿蒙南向开发案例:【智能猫眼(基于3516开发板)】

    基于Hi3516开发板,使用开源OpenHarmony开发的RTSP协议流媒体应用。达到将Hi3516开发板摄像头获取的数据通过RTSP协议传输到手机并显示 。
    的头像 发表于 04-19 22:01 527次阅读
    OpenHarmony鸿蒙南向<b class='flag-5'>开发</b>案例:【智能猫眼(基于3516<b class='flag-5'>开发板</b>)】

    fpga开发板是什么?fpga开发板哪些?

    FPGA开发板是一种基于FPGA(现场可编程门阵列)技术的开发平台,它允许工程师通过编程来定义和配置FPGA芯片上的逻辑电路,以实现各种数字电路和逻辑功能。FPGA开发板通常包括FPGA芯片、时钟模块、电源模块、输入输出接口等组
    的头像 发表于 03-14 18:20 1733次阅读

    fpga开发板使用教程

    FPGA开发板的使用教程主要包括以下几个关键步骤。
    的头像 发表于 03-14 15:50 925次阅读

    fpga开发板与linux开发板区别

    FPGA开发板与Linux开发板是两种不同的硬件开发平台,各自具有不同的特点和应用场景。在以下的文章,我将详细介绍FPGA
    的头像 发表于 02-01 17:09 2005次阅读

    51单片机开发板的主要功能 51单片机开发板能做什么

    51单片机开发板是一种基于8051系列单片机芯片的开发板,具有丰富的功能和广泛的应用。下面将详细介绍51单片机开发板的主要功能以及能够实现的各种应用。 一、基本功能: 通用输入输出:5
    的头像 发表于 01-23 15:52 3295次阅读

    51单片机开发板原理图介绍

    电子发烧友网站提供《51单片机开发板原理图介绍.pdf》资料免费下载
    发表于 12-18 09:12 4次下载

    小安派-Cam-D开发板哪些新亮点

    这次升级迭代了AiPi-Cam-D,来看看这款开发板哪些新亮点?
    的头像 发表于 12-03 10:01 458次阅读
    小安派-Cam-D<b class='flag-5'>开发板</b><b class='flag-5'>有</b>哪些新亮点