1619|0

248

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【ST B-L475E-IOT01A1蓝牙Wi-Fi开发板】3-读取lis3mdl三轴磁力传感器数据判断方向 [复制链接]

本帖最后由 qiao--- 于 2024-3-12 16:26 编辑

1.查看原理图查看引脚

开发一个新的模块时,第一步是看该传感器挂载哪个片上外设上,他的引脚是什么,如下图

 

  从上图可以看到这个传感器挂载在I2C2上,引脚为PB10和PB11,接下来我们就可以用cubemx来进行配置了。

 

2.用cubemx配置I2C2的引脚

 

然后配置I2C需要的一些参数,我这里采用默认的就行。

 

3.移植LIS3MDLTR传感器的驱动

我在网上找了一些这个传感器的启动,本次就教大家如何去移植这个驱动

 

上面是我在网上找的驱动,我们直接把drvier下面的驱动添加到我们的工程里面,并新建一个应用文件

 

驱动代码是使用面向对象的编程实现的,所以移植起来非常方便。

我们在应用里面只用复制他的example示例代码做修改。

 

 

4.LIS3MDLTR传感器应用代码修改

我们将他的应用代码复制到我们的文件夹下面,然后实现他设备的结构体

 

这些代码是需要我们完成的,就是I2C的读取和发送函数,库文件已经帮我们实现好了,代码如下所示:

static int32_t platform_write(void *handle, uint8_t Reg, uint8_t *Bufp,
                              uint16_t len)
{
   HAL_I2C_Mem_Write(handle, LIS3MDL_I2C_ADD_H, Reg,
                      I2C_MEMADD_SIZE_8BIT, Bufp, len, 1000);
  return 0;
}

static int32_t platform_read(void *handle, uint8_t Reg, uint8_t *Bufp,
                             uint16_t len)
{
  HAL_I2C_Mem_Read(handle, LIS3MDL_I2C_ADD_H, Reg,
                      I2C_MEMADD_SIZE_8BIT, Bufp, len, 1000);
	return 0;
}

/*
 *  Function to print messages
 */
void tx_com( uint8_t *tx_buffer, uint16_t len )
{
  HAL_UART_Transmit( &huart1, tx_buffer, len, 1000 );
}

这样读取他的三轴磁力的代码就写完了,我们打开串口看看输出的事实我们需要的

 

输出正确,温度输出也在正常的范围内。

 

5.用LIS3MDLTR传感器做方向判断

用三轴磁力计可以判断方向的,我这里就以简单的东西南北方向的判断举例。我是先算出他的方向角,进而用他的方向角来判断方向,这里我们只需要取y方向的磁力和x方向的磁力的atan2值来算方向角就可以了,代码如下所示

float heading = atan2(magnetic_mG[0], magnetic_mG[0]);
heading = heading < 0 ? (heading + 2 * PI) : heading;
heading = heading * 180 / PI;

然后进行判断

char direction[3];
if ((heading >= 337.5 && heading <= 360) || (heading >= 0 && heading < 22.5)) {
	sprintf(direction,"N");
} else if (heading >= 22.5 && heading < 67.5) {
	sprintf(direction,"NE");
} else if (heading >= 67.5 && heading < 112.5) {
	sprintf(direction,"E");
} else if (heading >= 112.5 && heading < 157.5) {
	sprintf(direction,"SE");
} else if (heading >= 157.5 && heading < 202.5) {
	sprintf(direction,"S");
} else if (heading >= 202.5 && heading < 247.5) {
	sprintf(direction,"SW");
} else if (heading >= 247.5 && heading < 292.5) {
	sprintf(direction,"W");
} else if (heading >= 292.5 && heading < 337.5) {
	sprintf(direction,"NW");
}
printf("the direction is %s\r\n",direction);

 

6.验证

我们打开串口助手看看方向正确与否,下面是我将板子放着不动输出的数据,可以看到后面数据是稳定的。方向是西南方

 

 

总结:通过本期测评,我读出了板载的LIS3MDLTR三轴磁力传感器,并可以读出对于开发板而言的方向。

 

stm32L475_lis3mdl.7z (8.16 MB, 下载次数: 6)

 

此帖出自无线连接论坛
点赞 关注(1)
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表