磁力计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, ®);
数据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, ®);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关键字,把一个全局函数、另一个类的成员函数或者另一个类整体,声明为授权类的友元友元拥有访问授权类任何非公有成员的特权友元声明可以出现在授权类的公有、私有或者保护等任何区域且不受访问控制限定符的约束友元不是成员…...

前端组件库开发
通常我们会使用很多组件库,有时候我们会去看源码比如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格式三个角度做深度优化;资源优化包括大资源…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...