本文以下文提到传感器说明常用的陀螺加计通用知识点。
Fig.1 ASM330LHB
Fig.2 LSM6DSO32
Fig.3 SMI230-博士
1. 陀螺和加计的原始数据是如何和实际数据对应起来的?
陀螺常用的单位为g,加计常用的单位为度/秒(dps),一般两者的数据寄存器都是16位的,比如陀螺X轴分为OUTX_L_G和OUTX_H_G,加计X轴分为OUTX_L_A和OUTX_H_A最高位为符号位,则输出范围应为(-32767~32767)。
情况1:
如上图Fig.1和Fig.2所示的型号对应的数据手册中单位是以mg/LSB和mdps/LSB,假如陀螺和加计的量程分别选择±1000dps和±16 g,从寄存器中读出的原始数据定义为s16 gyro_raw和s16 acc_raw,则:
gyro_raw = (s16)((OUTX_H_G<<8)+OUTX_L_G) *35/1000(g)(dps)//将mdps转换为dps
acc_raw = (s16)((OUTX_H_A<<8)+OUTX_L_A)*0.488/1000//将mg转换为g
情况2:
如上图Fig.3所示型号对应的数据手册中单位为LSB/g和LSB/bps,同理,假如陀螺和加计的量程分别选择±1000dps和±16 g,从寄存器中读出的原始数据定义为s16 gyro_raw和s16 acc_raw,则:
gyro_raw = (s16)((OUTX_H_G<<8)+OUTX_L_G) /32.77(dps)
acc_raw = (s16)((OUTX_H_A<<8)+OUTX_L_A)/2048(g)
注意这里的2048 LSB/g实际是由32767/16计算的,32.77 LSB/bps是由32767/1000计算的。
2. 读写该类寄存器的通用方式
一般都会支持SPI和IIC通信协议,以LSM6DSO32为例说明读写寄存器的过程,如下:
①配置硬件接口,SPI/IIC驱动接口(下面的时序图以SPI为例说明)
②配置陀螺和加计的量程和数据速率,如图Fig.4和Fig.5中分别向0x10寄存器和0x11寄存器设置陀螺和加计所需量程。此处是向寄存器写数据,故最高位为0(一般都是R/!W,读高写低)
Fig.4 LSM6DSO32-acc控制寄存器
Fig.5 LSM6DSO32-gyro控制寄存器
Fig.6 LSM6DSO32写寄存器时序
③读陀螺加计的原始数据
在数据手册寄存器映射章节,容易看出陀螺和加计的数据寄存器是连续的,故一般选择连续读模式,向SPI总线写要读的寄存器其实地址,此处注意最高位为1(比如从陀螺的X轴开始读数,则直接写0x80|0x22),再直接读出12个字节数据(包含了陀螺加计的原始数据)。
Fig.7LSM6DSO32读寄存器时序
问题1:静止的时候测试会出现野点
修改点:如下图示根据状态寄存器中陀螺加计的数据更新标识来获取有效数据。