设为首页 加入收藏
你目前位置: 首页 学术研究 物联网应用 正文
更多>>
  • 学术报告

物联网应用

LSM6DS3(六轴传感器)STM32驱动及6D功能实现

该六轴传感器支持I2C/SPI通信。在读取该六轴传感器寄存器时,采用I2C通信(这里把CS引脚拉高,拉低为SPI)。INT1和

INT2是模块的外部中断引脚。可以通过其生成中断信号来通知可以接收数据,也可以通过读取其中相对应功能的寄存器来判断是否

可以接收数据。

写好模拟I2C驱动后,测试与模块的通信是否成功。该模块写地址(LSM6DS3_ADDR_WR==0xD6),读地址(LSM6DS3_ADDR_RD==0xD7)。模块(LSM6DS3_WHO_AM_I==0x0F),读该寄存器值为0x69,则通信成功。

驱动代码如下(以下的寄存器名称可以在数据手册中找到对应地址):

void Lsm6d3s_Init(void){		while(Lsm6d3s_ReadByte(LSM6D3S_WHO_AM_I)!=0x69);//		加速度计52HZ(倾斜角检测功能工作在26HZ,因此加速度计ODR必须设置为>=26hz),2g量程。//		Lsm6d3s_WriteByte(CTRL1_XL,0x20);//		使能加速度计x,y,z轴//		Lsm6d3s_WriteByte(CTRL9_XL,0x38);//		陀螺仪电平触发,加速度计高性能失能//		Lsm6d3s_WriteByte(CTRL6_C,0x40|0x10);//		陀螺仪高性能失能//		Lsm6d3s_WriteByte(CTRL7_G,0x80);//		加速度计INT2引脚失能,陀螺仪数据INT2使能//		Lsm6d3s_WriteByte(INT2_CTRL,0x03);//				//陀螺仪12.5hz  2000dps		Lsm6d3s_WriteByte(CTRL2_G,0x1C);		//使能陀螺仪x,y,z轴		Lsm6d3s_WriteByte(CTRL10_C,0x38);				//WAKE_UP INTERRUPT Configuration		Lsm6d3s_WriteByte(CTRL1_XL,0x60);		Lsm6d3s_WriteByte(TAP_CFG,0x90);		Lsm6d3s_WriteByte(WAKE_UP_DUR,0x00);		Lsm6d3s_WriteByte(WAKE_UP_THS,0x02);		Lsm6d3s_WriteByte(MD1_CFG,0x20);		//6D Orientation Configuration		Lsm6d3s_WriteByte(TAP_THS_6D,0x40);		Lsm6d3s_WriteByte(CTRL8_XL,0x01);	}

我在测试中,是读取的寄存器的相对应位来判断有效数据生成。如读取加速度计有效数据时:

		if((Lsm6d3s_ReadByte(STATUS_REG)&0x01)!=0)		{			Lsm6d3s_ReadData(OUTX_L_XL,&(lsm_ori_data.acc_x_l),6);			lsm_fin_data.acc_x = (lsm_ori_data.acc_x_h<<8)|(lsm_ori_data.acc_x_l);			lsm_fin_data.acc_y = (lsm_ori_data.acc_y_h<<8|(lsm_ori_data.acc_y_l));			lsm_fin_data.acc_z = (lsm_ori_data.acc_z_h<<8|(lsm_ori_data.acc_z_l));		    printf("加速度x=%d,y=%d,z=%d\r\n",lsm_fin_data.acc_x,lsm_fin_data.acc_y,lsm_fin_data.acc_z);		}

读取陀螺仪有效数据时:

if((Lsm6d3s_ReadByte(STATUS_REG)&0x02)!=0)		{			Lsm6d3s_ReadData(OUTX_L_G,&(lsm_ori_data.gryo_x_l),6);			lsm_fin_data.gryo_x = (lsm_ori_data.gryo_x_h<<8)|(lsm_ori_data.gryo_x_l);			lsm_fin_data.gryo_y = (lsm_ori_data.gryo_y_h<<8)|(lsm_ori_data.gryo_y_l);			lsm_fin_data.gryo_z = (lsm_ori_data.gryo_z_h<<8)|(lsm_ori_data.gryo_z_l);			printf("陀螺仪x=%d,y=%d,z=%d\r\n\r\n",lsm_fin_data.gryo_x,lsm_fin_data.gryo_y,lsm_fin_data.gryo_z);		}

该六轴传感器的唤醒功能是测试加速度当大于设置的阈值时,就会生成一个唤醒中断信号。这个已经在LSM6DS3_Init()函数中初始化到INT1引脚上去了。在测试时,移动该模块,可以捕捉到中断信号来判断。这里是STM32的PA6引脚与INT1引脚相连。PA6初始化为低输入模式,当读到有高电平时,说明模块的INT1上出现了一次中断信号。

if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==1)		{			printf("Interrupt1\r\n");		}

最后,测试了该模块的6D方向检测功能,在数据手册中解释的是很详细的。

orientation = Lsm6d3s_ReadByte(D6D_SRC);printf("orientation=%x\r\n",orientation);

根据测试,发现不同的6个面会在D6D_SRC寄存器读取到不同的6个值。这样,就可以用来判断方向了。