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

当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速度,但是驱动却写的不是很高效,官方代码如下:
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;
}
每次都是单次读取(读两个字节)每一轴的数据,而且还获取了一次sensitivity(读一个字节)。
我们知道spi要完成一次读数据的操作,本质是需要读写两次的,第一次将地址写进去,然后再将0写入,将数据弄出来。因此驱动如果需要读取6轴的数据一共需要写12次,读18次spi。而我认为sensitivity是开始设置的,可以不读,然后6轴的数据可以一次全部读出来,因为默认spi地址是会累加的,
因此程序可以改成如下,然后将陀螺仪值乘以70,加速度计值乘以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地址开读,也就是写1次,读12次,而且还节约了spi的开启和关闭的耗时,这样就大大的提高的数据获取的速度,如果可以使用dma能够更高效。
因此如果想要更加高效的使用陀螺仪加速度计,记得要连续的读取12个字节且无需读取灵敏度哦。

索尼已经正式发布了其Wena系列智能手环的改进版
智锐CAN-BUS智能门禁管理系统方案
集成电路的代换与检测方法
采用32位ARM处理器实现现场数据采集器的设计方案
LifeSmart云起户外摄像头轻松面对各种家用安防场景
有浅入深的介绍BLE与MEMS中的开发板设计
动态元件的初始储能在电路中产生的零输入响应中有什么分量?
魔改CPU技术有什么优缺点
工业相机解决方案:低功耗16位数模转换芯片+负压线性稳压器YSO690PR
加密货币正在为替代支付系统,未来五年将有10亿人使用加密货币
小米8透明探索版上手 优势很突出抢到就是赚到
万物皆可插充电线的时代,电池也发生了大变化
通过Intouch组态软件通过OPC功能读取SMART PLC数据
模拟IC厂商晶源微开启上市辅导
物联网扮演着什么样的角色?
一文详解Avnet Zynq 7Z007SMiniZed开发方案
什么是DDS?初识CP AUTOSAR平台下的DDS规范
Aston 过程质谱应用于 EUV 极紫外光源卤化锡原位定量
新能源产业将面临的问题以及未来发展趋势
基于ICR技术的FPGA配置电路硬件设计及其工作原理