当前位置: 首页 > news >正文

磁力计LIS2MDL开发(1)----轮询获取磁力计数据

磁力计LIS2MDL开发.1--轮询获取磁力计数据

  • 概述
  • 视频教学
  • 样品申请
  • 源码下载
  • 通信模式
  • 速率
  • 生成STM32CUBEMX
  • 串口配置
  • IIC配置
  • CS设置
  • 串口重定向
  • 参考程序
  • 初始换管脚
  • 获取ID
  • 复位操作
  • BDU设置
  • 设置速率
  • 启用偏移消除
  • 开启温度补偿
  • 设置为连续模式
  • 轮询读取数据
  • 主程序
  • 演示

概述

本文将介绍如何使用 LIS2MDL 传感器来读取数据。主要步骤包括初始化传感器接口、验证设备ID、配置传感器的数据输出率和滤波器,以及通过轮询方式持续读取磁力数据和温度数据。读取到的数据会被转换为适当的单位并通过串行通信输出。
这个传感器常用于多种电子设备中,以提供精确的磁场强度数据,从而用于指南针应用、位置追踪或者动作检测等功能。

最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:615061293 。

在这里插入图片描述

视频教学

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

源码下载

通信模式

对于LIS2MDL,可以使用SPI或者IIC进行通讯。
最小系统图如下所示。
在这里插入图片描述

在CS管脚为1的时候,为IIC模式
在这里插入图片描述

本文使用的板子原理图如下所示。

在这里插入图片描述

速率

该模块支持的速度为普通模式(100k)、快速模式(400k)、快速模式+(1M)、高速模式(3.4M)。
在这里插入图片描述

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32WB55RG。
配置时钟树,配置时钟为32M。

在这里插入图片描述

串口配置

查看原理图,PB6和PB7设置为开发板的串口。

在这里插入图片描述
配置串口。

在这里插入图片描述

IIC配置

在这里插入图片描述

配置IIC为快速模式,速度为400k。
在这里插入图片描述

CS设置

在这里插入图片描述

在这里插入图片描述

串口重定向

打开魔术棒,勾选MicroLIB

在这里插入图片描述

在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END PFP */

参考程序

https://github.com/STMicroelectronics/lis2mdl-pid

初始换管脚

使能CS为高电平,配置为IIC模式。

	printf("123123123\n");/* Initialize mems driver interface */stmdev_ctx_t dev_ctx;dev_ctx.write_reg = platform_write;dev_ctx.read_reg = platform_read;dev_ctx.handle = &SENSOR_BUS;HAL_GPIO_WritePin(LIS2MDL_CS_GPIO_Port, LIS2MDL_CS_Pin, GPIO_PIN_SET);/* Wait sensor boot time */platform_delay(BOOT_TIME);

获取ID

可以向WHO_AM_I (4Fh)获取固定值,判断是否为0x40

在这里插入图片描述
is2mdl_device_id_get为获取函数。

在这里插入图片描述

对应的获取ID驱动程序,如下所示。

  /* Wait sensor boot time */platform_delay(BOOT_TIME);/* Check device ID */lis2mdl_device_id_get(&dev_ctx, &whoamI);printf("LIS2MDL_ID=0x%x,whoamI=0x%x\n",LIS2MDL_ID,whoamI);if (whoamI != LIS2MDL_ID)while (1) {/* manage here device not found */}

复位操作

可以向CFG_REG_A (60h)的SOFT_RST寄存器写入1进行复位。

在这里插入图片描述

lis2mdl_reset_set为重置函数。

在这里插入图片描述

对应的驱动程序,如下所示。

 /* Restore default configuration */lis2mdl_reset_set(&dev_ctx, PROPERTY_ENABLE);do {lis2mdl_reset_get(&dev_ctx, &rst);} while (rst);

BDU设置

在很多传感器中,数据通常被存储在输出寄存器中,这些寄存器分为两部分:MSB和LSB。这两部分共同表示一个完整的数据值。例如,在一个加速度计中,MSB和LSB可能共同表示一个加速度的测量值。
连续更新模式(BDU = ‘0’):在默认模式下,输出寄存器的值会持续不断地被更新。这意味着在你读取MSB和LSB的时候,寄存器中的数据可能会因为新的测量数据而更新。这可能导致一个问题:当你读取MSB时,如果寄存器更新了,接下来读取的LSB可能就是新的测量值的一部分,而不是与MSB相对应的值。这样,你得到的就是一个“拼凑”的数据,它可能无法准确代表任何实际的测量时刻。
块数据更新(BDU)模式(BDU = ‘1’):当激活BDU功能时,输出寄存器中的内容不会在读取MSB和LSB之间更新。这就意味着一旦开始读取数据(无论是先读MSB还是LSB),寄存器中的那一组数据就被“锁定”,直到两部分都被读取完毕。这样可以确保你读取的MSB和LSB是同一测量时刻的数据,避免了读取到代表不同采样时刻的数据。
简而言之,BDU位的作用是确保在读取数据时,输出寄存器的内容保持稳定,从而避免读取到拼凑或错误的数据。这对于需要高精度和稳定性的应用尤为重要。
可以向CTRL3 (12h)的BDU寄存器写入1进行开启。

在这里插入图片描述

对应的驱动程序,如下所示。

  /* Enable Block Data Update */lis2mdl_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);

设置速率

速率可以通过CFG_REG_A (60h)的ODR设置速率。

在这里插入图片描述

设置速率可以使用如下函数。

  /* Set Output Data Rate */lis2mdl_data_rate_set(&dev_ctx, LIS2MDL_ODR_10Hz);

启用偏移消除

LIS2MDL 磁力计的配置寄存器(CFG_REG_B)的OFF_CANC - 这个位用于启用或禁用偏移消除。
这意味着每次磁力计准备输出新的测量数据时,它都会自动进行偏移校准,以确保数据的准确性。这通常用于校准传感器,以消除由于传感器偏移或环境因素引起的任何误差。
在这里插入图片描述

  /* Set / Reset sensor mode */lis2mdl_set_rst_mode_set(&dev_ctx, LIS2MDL_SENS_OFF_CANC_EVERY_ODR);

开启温度补偿

开启温度补偿可以通过CFG_REG_A (60h)的COMP_TEMP_EN进行配置。
在这里插入图片描述

  /* Enable temperature compensation */lis2mdl_offset_temp_comp_set(&dev_ctx, PROPERTY_ENABLE);

设置为连续模式

LIS2MDL 磁力计 CFG_REG_A (60h) 配置寄存器的MD1 和 MD0 - 这两个位用于选择设备的工作模式。
00 - 连续模式,设备连续进行测量并将结果放在数据寄存器中。
01 - 单次模式,设备进行单次测量,然后返回到空闲模式。
10 和 11 - 空闲模式,设备被置于空闲模式,但I2C和SPI接口仍然激活
在这里插入图片描述

  /* Set device in continuous mode */lis2mdl_operating_mode_set(&dev_ctx, LIS2MDL_CONTINUOUS_MODE);

轮询读取数据

对于数据是否准备好,可以查看STATUS_REG (67h)的Zyxda位,判断是否有新数据到达。
在这里插入图片描述

    uint8_t reg;/* Read output only if new value is available */lis2mdl_mag_data_ready_get(&dev_ctx, &reg);

数据OUTX_L_REG(68h)-OUTZ_H_REG(6Dh)获取。

在这里插入图片描述

      /* Read magnetic field data */memset(data_raw_magnetic, 0x00, 3 * sizeof(int16_t));lis2mdl_magnetic_raw_get(&dev_ctx, data_raw_magnetic);magnetic_mG[0] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[0]);magnetic_mG[1] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[1]);magnetic_mG[2] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[2]);

主程序

 /* USER CODE BEGIN 2 */printf("123123123\n");/* Initialize mems driver interface */stmdev_ctx_t dev_ctx;dev_ctx.write_reg = platform_write;dev_ctx.read_reg = platform_read;dev_ctx.handle = &SENSOR_BUS;HAL_GPIO_WritePin(LIS2MDL_CS_GPIO_Port, LIS2MDL_CS_Pin, GPIO_PIN_SET);/* Wait sensor boot time */platform_delay(BOOT_TIME);/* Check device ID */lis2mdl_device_id_get(&dev_ctx, &whoamI);printf("LIS2MDL_ID=0x%x,whoamI=0x%x\n",LIS2MDL_ID,whoamI);if (whoamI != LIS2MDL_ID)while (1) {/* manage here device not found */}/* Restore default configuration */lis2mdl_reset_set(&dev_ctx, PROPERTY_ENABLE);do {lis2mdl_reset_get(&dev_ctx, &rst);} while (rst);/* Enable Block Data Update */lis2mdl_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);/* Set Output Data Rate */lis2mdl_data_rate_set(&dev_ctx, LIS2MDL_ODR_10Hz);/* Set / Reset sensor mode */lis2mdl_set_rst_mode_set(&dev_ctx, LIS2MDL_SENS_OFF_CANC_EVERY_ODR);/* Enable temperature compensation */lis2mdl_offset_temp_comp_set(&dev_ctx, PROPERTY_ENABLE);/* Set device in continuous mode */lis2mdl_operating_mode_set(&dev_ctx, LIS2MDL_CONTINUOUS_MODE);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){uint8_t reg;/* Read output only if new value is available */lis2mdl_mag_data_ready_get(&dev_ctx, &reg);if (reg) {/* Read magnetic field data */memset(data_raw_magnetic, 0x00, 3 * sizeof(int16_t));lis2mdl_magnetic_raw_get(&dev_ctx, data_raw_magnetic);magnetic_mG[0] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[0]);magnetic_mG[1] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[1]);magnetic_mG[2] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[2]);printf("Magnetic field [mG]:%4.2f\t%4.2f\t%4.2f\r\n",magnetic_mG[0], magnetic_mG[1], magnetic_mG[2]);/* Read temperature data */memset(&data_raw_temperature, 0x00, sizeof(int16_t));lis2mdl_temperature_raw_get(&dev_ctx, &data_raw_temperature);temperature_degC = lis2mdl_from_lsb_to_celsius(data_raw_temperature);printf("Temperature [degC]:%6.2f\r\n",temperature_degC); }		HAL_Delay(10);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}      

演示

在这里插入图片描述

相关文章:

磁力计LIS2MDL开发(1)----轮询获取磁力计数据

磁力计LIS2MDL开发.1--轮询获取磁力计数据 概述视频教学样品申请源码下载通信模式速率生成STM32CUBEMX串口配置IIC配置CS设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置设置速率启用偏移消除开启温度补偿设置为连续模式轮询读取数据主程序演示 概述 本文将介绍如何使…...

C++学习笔记—— C++内存管理方式:new和delete操作符进行动态内存管理

系列文章目录 http://t.csdnimg.cn/d0MZH 目录 系列文章目录http://t.csdnimg.cn/d0MZH 比喻和理解a.比喻C语言开空间C开空间 b.理解a、C语言的内存管理的缺点1、开发效率低(信息传递繁琐)2、可读性低(信息展示混乱)3、稳定性差&…...

8、操作符重载

友元 可以通过friend关键字,把一个全局函数、另一个类的成员函数或者另一个类整体,声明为授权类的友元友元拥有访问授权类任何非公有成员的特权友元声明可以出现在授权类的公有、私有或者保护等任何区域且不受访问控制限定符的约束友元不是成员&#xf…...

前端组件库开发

通常我们会使用很多组件库,有时候我们会去看源码比如element,antd,然后发现多少是按需导出,和vue.use全局注册,依赖于框架的拓展。 组件库的开发依赖框架的版本和node的版本,这个是需要说明的,然…...

自定义日志打印功能--C++

一、介绍 日志是计算机程序中用于记录运行时事件和状态的重要工具。通过记录关键信息和错误情况,日志可以帮助程序开发人员和维护人员追踪程序的执行过程,排查问题和改进性能。 在软件开发中,日志通常记录如下类型的信息: 事件信…...

gitlab注册无中国区电话验证问题

众所周知gitlab对中国区不友好,无法直接注册,页面无法选择86的手机号进行验证码发送。 Google上众多的方案是修改dom,而且时间大约是21年以前。 修改dom,对于现在的VUE、React框架来说是没有用的,所以不用尝试。 直接看…...

【JAVA基础题目练习】----第二天

JAVA基础题目练习 1. 键盘录入数据,比较大小2. 代码重构(简化代码,少做判断)3. 键盘录入月份的值,输出对应的季节4. 获取三个数据中的最大值使用IF语句5. 用switch语句实现键盘录入月份,输出对应的季节6. 求…...

node.js和npm的安装与环境配置(2023最新版)

目录 安装node.js测试是否安装成功测试npm环境配置更改环境变量新建系统变量 安装node.js 1、进入官网下载:node.js官网 我选择的是windows64位的,你可以根据自己的实际情况选择对应的版本。 2、下载完成,安装。 打开安装程序 接受协议 选…...

ke14--10章-1数据库JDBC介绍

注册数据库(两种方式),获取连接,通过Connection对象获取Statement对象,使用Statement执行SQL语句。操作ResultSet结果集 ,回收数据库资源. 需要语句: 1Class.forName("DriverName");2Connection conn DriverManager.getConnection(String url, String user, String…...

【IC验证】perl脚本——分析前/后仿用例回归情况

目录 1 脚本名称 2 脚本使用说明 3 nocare_list文件示例 4 脚本执行方法 5 postsim_result.log文件示例 6 脚本代码 1 脚本名称 post_analysis 2 脚本使用说明 help:打印脚本说明信息 命令:post_analysis help 前/后仿结束后,首先填…...

Ansible适合的场景是什么?

Ansible将编排与配置管理、供应和应用程序部署结合并统一在一个易于使用的平台上。Ansible的一些主要场景包括: 配置管理:集中配置文件管理和部署是Ansible的一个常见场景。 应用程序部署:当使用Ansible定义应用程序,并使用Ansible Tower管…...

Flink 读写 HBase 总结

前言 总结 Flink 读写 HBase 版本 Flink 1.15.4HBase 2.0.2Hudi 0.13.0官方文档 https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/docs/connectors/table/hbase/ Jar包 https://repo1.maven.org/maven2/org/apache/flink/flink-sql-connector-hbase-2.2/1…...

记录一次chatGPT人机协同实战辅助科研——根据词库自动进行情感分析

有一个Excel中的一列,读取文本判断文本包含积极情感词.txt和消极情感词.txt的个数,分别生成两列统计数据 请将 ‘your_file.xlsx’ 替换为你的Excel文件名,Your Text Column’替换为包含文本的列名。 这个程序首先读取了积极和消极情感词&…...

Java_LinkedList链表详解

目录 前言 ArrayList的缺陷 链表 链表的概念及结构 链表的种类 1.单向或双向 2.带头或不带头 3.循环或不循环 LinkedList的使用 什么是LinkedList LinkedList的使用 LinkedList的构造 LinkedList的其他常用方法介绍 LinkedList的遍历 ArrayList和LinkedList的…...

MacOS 12 开放指定端口 指定ip访问

MacOS 12 开放指定端口 指定ip访问 在 macOS 上开放一个端口,并指定只能特定的 IP 访问,你可以使用 macOS 内置的 pfctl(Packet Filter)工具来实现。 以下是一些基本的步骤: 1、 编辑 pf 配置文件: 打开 /…...

LeedCode刷题---滑动窗口问题

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、长度最小的子数组 题目链接:长度最小的子数组 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。…...

leetcode24. 两两交换链表中的节点

题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,3,4] 输出&#…...

TCP传输层详解(计算机网络复习)

介绍:TCP/IP包含了一系列的协议,也叫TCP/IP协议族,简称TCP/IP。该协议族提供了点对点的连接机制,并将传输数据帧的封装、寻址、传输、路由以及接收方式都予以标准化 TCP/IP的分层模型 在讲TCP/IP协议之前,首先介绍一…...

【LuatOS】简单案例网页点灯

材料 硬件:合宙ESP32C3简约版,BH1750光照度模块,0.96寸OLED(4P_IIC),杜邦线若干 接线: ESP32C3.GND — OLED.GND — BH1750.GND ESP32C3.3.3V — OLED.VCC — BH1750.VCC ESP32C3.GPIO5 — OLED.SCL — BH1750.SCL E…...

百度APP iOS端包体积50M优化实践(七)编译器优化

一. 前言 百度APP iOS端包体积优化系列文章的前六篇重点介绍了包体积优化整体方案、图片优化、资源优化、代码优化、无用类优化、HEIC图片优化实践和无用方法清理,图片优化是从无用图片、Asset Catalog和HEIC格式三个角度做深度优化;资源优化包括大资源…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

数据链路层的主要功能是什么

数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

PH热榜 | 2025-06-08

1. Thiings 标语&#xff1a;一套超过1900个免费AI生成的3D图标集合 介绍&#xff1a;Thiings是一个不断扩展的免费AI生成3D图标库&#xff0c;目前已有超过1900个图标。你可以按照主题浏览&#xff0c;生成自己的图标&#xff0c;或者下载整个图标集。所有图标都可以在个人或…...