博主最近在调试 lsm6dso,一款集合加速度和陀螺仪的模块,主要运用在手持设备中。
1、前言lsm6dso 是 st 公司的六轴传感器,集成三轴加速度和三轴陀螺仪。
2、传感器特性具有数字 i2c、spi 和 mipi i3c 串口标准输出,组合工作在高性能模式下功耗只要 0.55 ma。满量程加速度范围:±2/±4/±8/±16 g,且角速率范围为 ±125/±250/±500/±1000/±2000 dps。经过配置,lsm6dso 可利用硬件识别出的自由落体事件、6d 方向、单击和双击感应、活动或不活动、唤醒事件,来生成中断信号。smd 封装的超小尺寸和重量使其成为手持便携式应用的理想选择,如智能手机、物联网(iot)连接设备,穿戴,以及需要减小封装尺寸和重量的其他应用,尺寸:2.5 mm x 3 mm x 0.83 mm支持 1.71v to 3.6v 供电。3、参考资料st 对于自己出的传感器,都会提供驱动 demo,放在 github,如下:
https://github.com/stmicroelectronics其中分为不同的平台,有的是仅仅基于 c 语言的平台无关的驱动,有的是基于 stm32,有的是基于 linux,有的是基于 android,一开始学习的时候,建议大家下载平台无关的驱动:
若后续大家想移植到 linux、android ,也可以在这里可以找到工程:
https://github.com/stmicroelectronics/stmems_standard_c_drivershttps://github.com/stmicroelectronics/st-mems-android-linux-drivers-inputhttps://github.com/stmicroelectronics/stmems_linux_iio_drivershttps://github.com/stmicroelectronics/stmems_android_sensor_hal_iiolsm6dso-pid 参考代码:
https://github.com/stmicroelectronics/stmems_standard_c_drivers/tree/master/lsm6dso_stdcarduino、micropython 参考代码:
https://github.com/arduino-libraries/arduino_lsm6dsoxhttps://github.com/micropython-chinese-community/mpy-lib/tree/master/sensor/lsm6dso数据手册下载,其中包含有中文应用手册:
https://www.st.com/zh/mems-and-sensors/lsm6dso.html
4、引脚说明一共 14 个 pin 脚,每个引脚的详细说明可以参考数据手册。 总的来说就是 i2c 和 spi 无法同时使用,因为它们有共用 pin 脚。
5、硬件模式一般用模式 1,模式 2、模式 3、模式 4 比较复杂,可以外接传感器,摄像头等。
6、i2c 读写地址lsm6dso 从机地址是 110101x ,最后一位 x 和一个 pin 的状态有关系。 如果 sdo/sa0 是高,从机地址是 1101011。 如果 sdo/sa0 是低,从机地址是 1101010。
这个方案可以使得一路 i2c bus 挂两个 lsm6dso,同时使用。
加上读写位,总结如下:
传输示意图如下:
7、寄存器该器件有 60+ 个寄存器,主要的几个如下:
1、设备 id
只读,出厂已经固化在硬件里面了,可以通过读写这个寄存器,判断设备是否存在,通讯是否正常,设备的 id 是 0x6c。
2、加速度控制寄存器
这个寄存器可以设置加速度的量程、输出速率等;
3、陀螺仪控制寄存器
这个寄存器可以设置陀螺仪的量程、输出速率等;
4、状态寄存器
通过读取这个寄存器可以判断,传感器是否有新的数据。
5、温度传感器
2个寄存器,输出的是有符号数据。
6、陀螺仪数据传感器
总共 6 个寄存器,分 x、y、z 三轴的高位和低位,这里要注意,输出的是有符号数据。
7、加速度数据传感器
总共 6 个寄存器,分 x、y、z 三轴的高位和低位,这里要注意,输出的是有符号数据。
8、代码博主用的是轮询去读数据,大家也可以配置成中断方式。 另外,博主是直接去各个数据寄存器去读数据,大家也可以配置成去器件 fifo 中读数据。 该器件有 3kbyte 的 fifo,若使用压缩算法,可以达到 9kbyte。
初始化部分:
i2c_init();lsm6dso_check(); u8 lsm6dso_check(void){ u8 temp; temp=lsm6dso_readonebyte(lsm6dso_address,lsm6dso_who_am_i); if(temp==0x6c) return 0; else return 1; }lsm6dso_writeonebyte(lsm6dso_address,lsm6dso_ctrl1_xl,odr_xl_104hz|fs_xl_2g);lsm6dso_writeonebyte(lsm6dso_address,lsm6dso_ctrl2_g,odr_g_104hz|fs_g_250);读数据
while(1){ status=lsm6dso_readonebyte(lsm6dso_address,lsm6dso_status_reg); if(status & tem_data_available) { temp_raw=lsm6dso_readonebyte(lsm6dso_address,lsm6dso_out_temp_l)|(lsm6dso_readonebyte(lsm6dso_address,lsm6dso_out_temp_h)<<8); temp_deg=temp_raw/temp_lsb_per_deg+temp_offset_deg; sprintf((char*)temperature,temperature:%02f,temp_deg); lcd_showstring(30,90,200,16,16,temperature); } if(status & gyr_data_available) { gyr_x_raw = lsm6dso_readonebyte(lsm6dso_address,lsm6dso_outx_l_g)|(lsm6dso_readonebyte(lsm6dso_address,lsm6dso_outx_h_g)<<8); gyr_y_raw = lsm6dso_readonebyte(lsm6dso_address,lsm6dso_outy_l_g)|(lsm6dso_readonebyte(lsm6dso_address,lsm6dso_outy_h_g)<<8); gyr_z_raw = lsm6dso_readonebyte(lsm6dso_address,lsm6dso_outz_l_g)|(lsm6dso_readonebyte(lsm6dso_address,lsm6dso_outz_h_g)<<8); gyr_x = gyr_x_raw*gyr_lsb_250_per; gyr_y = gyr_y_raw*gyr_lsb_250_per; gyr_z = gyr_z_raw*gyr_lsb_250_per; printf(gyro:x:%02f mdps,y:%02f mdps,z:%02f mdps \\r\\n,gyr_x,gyr_y,gyr_z); } if(status & acc_data_available) { acc_x_raw=lsm6dso_readonebyte(lsm6dso_address,lsm6dso_outx_l_a)|(lsm6dso_readonebyte(lsm6dso_address,lsm6dso_outx_h_a)<<8); acc_y_raw=lsm6dso_readonebyte(lsm6dso_address,lsm6dso_outy_l_a)|(lsm6dso_readonebyte(lsm6dso_address,lsm6dso_outy_h_a)<<8); acc_z_raw=lsm6dso_readonebyte(lsm6dso_address,lsm6dso_outz_l_a)|(lsm6dso_readonebyte(lsm6dso_address,lsm6dso_outz_h_a)<<8); acc_x=acc_x_raw*acc_lsb_2g_per; acc_y=acc_y_raw*acc_lsb_2g_per; acc_z=acc_z_raw*acc_lsb_2g_per; printf(acc:x:%02f mg,y:%02f mg,z:%02f mg \\r\\n,acc_x,acc_y,acc_z); }寄存器定义
#define lsm6dso_address 0xd4#define lsm6dso_id 0x6c#define lsm6dso_sdo_crtl 0x02#define lsm6dso_fifo_ctrl1 0x07 #define lsm6dso_fifo_ctrl2 0x08#define lsm6dso_fifo_ctrl3 0x09#define lsm6dso_fifo_ctrl4 0x0a#define lsm6dso_counter_bdr_reg1 0x0b#define lsm6dso_counter_bdr_reg2 0x0c #define lsm6dso_int1_ctrl 0x0d#define lsm6dso_int2_ctrl 0x0e#define lsm6dso_who_am_i 0x0f#define lsm6dso_ctrl1_xl 0x10 //bit[7:4]typedef enum { odr_xl_off = (0<<4), odr_xl_1hz6_low_power_only = (11<<4), odr_xl_12hz5 = (1<<4), odr_xl_26hz = (2<<4), odr_xl_52hz = (3<<4), odr_xl_104hz = (4<<4), odr_xl_208hz = (5<<4), odr_xl_416hz = (6<<4), odr_xl_833hz = (7<<4), odr_xl_1k66hz = (8<<4), odr_xl_3k33hz = (9<<4), odr_xl_6k66hz = (10<<4), } lsm6dso_odr_xl_t; //bit[3:2]typedef enum { fs_xl_2g = (0<<2), fs_xl_4g = (2<<2), fs_xl_8g = (3<<2), fs_xl_16g_spit_ois_iu_fs = (1<<2), /* check xl_fs_mode = ‘0’ in ctrl8_xl (17h) */} lsm6dso_fs_xl_t;#define acc_lsb_2g_per 0.061#define acc_lsb_4g_per 0.122#define acc_lsb_8g_per 0.244#define acc_lsb_16g_per 0.488 #define lsm6dso_ctrl2_g 0x11 //bit[7:4]typedef enum { odr_g_off = (0<<4), odr_g_12hz5 = (1<<4), odr_g_26hz = (2<<4), odr_g_52hz = (3<<4), odr_g_104hz = (4<<4), odr_g_208hz = (5<<4), odr_g_416hz = (6<<4), odr_g_833hz = (7<<4), odr_g_1k66hz = (8<<4), odr_g_3k33hz = (9<<4), odr_g_6k66hz = (10<<4), odr_g_not_available = (11<<4),} lsm6dso_odr_g_t; //bit[3:2]typedef enum { fs_g_250 = (0<<2), fs_g_500 = (1<<2), fs_g_1000 = (2<<2), fs_g_2000 = (3<<2),} lsm6dso_fs_g_t; #define gyr_lsb_250_per 8.75#define gyr_lsb_500_per 17.50#define gyr_lsb_1000_per 35.0#define gyr_lsb_2000_per 70.0 #define lsm6dso_ctrl3_c 0x12#define lsm6dso_ctrl4_c 0x13#define lsm6dso_ctrl5_c 0x14#define lsm6dso_ctrl6_c 0x15#define lsm6dso_ctrl7_g 0x16#define lsm6dso_ctrl8_xl 0x17#define lsm6dso_ctrl9_xl 0x18#define lsm6dso_ctrl10_c 0x19#define lsm6dso_all_int_src 0x1a#define lsm6dso_wake_up_src 0x1b#define lsm6dso_tap_src 0x1c#define lsm6dso_d6d_src 0x1d#define lsm6dso_status_reg 0x1e#define tem_data_available (1<<2)#define gyr_data_available (1<<1)#define acc_data_available (1<<0) #define lsm6dso_out_temp_l 0x20#define lsm6dso_out_temp_h 0x21#define temp_lsb_per_deg 256.0#define temp_offset_deg 25#define lsm6dso_outx_l_g 0x22#define lsm6dso_outx_h_g 0x23#define lsm6dso_outy_l_g 0x24#define lsm6dso_outy_h_g 0x25#define lsm6dso_outz_l_g 0x26#define lsm6dso_outz_h_g 0x27#define lsm6dso_outx_l_a 0x28#define lsm6dso_outx_h_a 0x29#define lsm6dso_outy_l_a 0x2a#define lsm6dso_outy_h_a 0x2b#define lsm6dso_outz_l_a 0x2c#define lsm6dso_outz_h_a 0x2d
新能源汽车电池取消准入限制 外资引进与时俱进
工业机器人2.0:智能制造时代的主力军
五部委联合发文:严禁粗制滥造机器人
全球暗网监控工具TOP 10
5G商用牌照的发放为工业互联网的发展提供了重要网络技术支持
LSM6DSO六轴传感器使用指南
佟吉禄:发挥铁塔公司优势配合电信企业,全力以赴支撑5G网络建设
传感器的发展谁提供了新动能
运行iOS 13.1的多款iPhone无线充电板的充电速度测试
ADI即将推出新型电化学和阻抗测量前端
QNX推出QNX Aviage音效处理套件2.0
人工智能可以替我们打赢疫情狙击战吗
安森美完成收购GT Advanced Technologies
基于RSSI_2M门限的BLE速率自适应算法流程
微软正积极为 Android 发展做贡献
BB2022L是一款基于X波段雷达芯片而设计的微/运动感知模组
MIT实现人造肌肉纤维,仿生机器人成可能
第一本Git命令教程(7.1)-清理之缓存
触摸屏与多台PLC之间无线Ethernet通信
6DNS系统将全面提升我国高校IPv6上网体验