QMC5883L的驱动
简介
本篇文章的代码已经上传到了github上面,开源代码
作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。
参考资料
QMC5883L磁场传感器驱动
QMC5883L磁力计介绍(硬件+软件)(附STM32程序~~~)
移植
这个具体的文件在路径Core/Src/Hardware/Magnetic/QMC5883下面,里面也有对应的说明文件
更改底层通信
你需要更改下面的这些函数, 也就是常规的底层通信,替换成你的IIC驱动函数。这里我使用的是软件IIC,具体的文件在Core/Src/Conmunication/IIC_moni路径下,这个路径下面还有具体的说明和使用文件
uint8_t QMC5883L_ReadOneReg(uint8_t RegAddr, uint8_t *pData){
uint8_t ret = 0;
#if QMC_HARD==1//硬件I2C#else//软件I2C
ret = iic[QMC5883_IIC].ReadReg(QMC5883_IIC, (QMC5883L_CHIPID << 1 | 0), (RegAddr), pData, 1);
#endif
return ret;
}uint8_t QMC5883L_ReadMultReg(uint8_t RegAddr, uint8_t RegNum, uint8_t DataBuff[]){
uint8_t ret = 0;
#if QMC_HARD==1//硬件I2C#else//软件I2C
ret = iic[QMC5883_IIC].ReadReg(QMC5883_IIC, (QMC5883L_CHIPID << 1 | 0), RegAddr, DataBuff, RegNum);
#endif
return ret;
}uint8_t QMC5883L_WriteOneReg(uint8_t RegAddr,uint8_t data){
uint8_t ret = 0;
#if QMC_HARD==1//硬件I2C#else//软件I2C
ret = iic[QMC5883_IIC].WriteReg(QMC5883_IIC, (QMC5883L_CHIPID << 1 | 0), RegAddr, &data, 1);
#endif
return ret;
}
更改初始化函数
因为我是用的软件IIC所以iic_attach需要重新指定引脚和下标QMC5883_IIC
uint8_t QMC5883L_init(void){
#if QMC_HARD==1//硬件I2C#else//软件I2Ciic_attach(QMC5883_IIC,QMC5883L_I2C_SCL_Port,QMC5883L_I2C_SCL_Pin,QMC5883L_I2C_SDA_Port,QMC5883L_I2C_SDA_Pin,QMC_HARD);
#endifu8 tempreg;if(QMC5883L_ReadOneReg(QMC5883L_CHIPID, &tempreg) == FALSE){printf("QMC5883L初始化失败,读取芯片ID失败\r\n");return FALSE;}if(tempreg != QMC5883L_ID){printf("QMC5883L初始化失败,无效的ID:0x%X\r\n", tempreg);return FALSE;}printf("QMC5883L初始化成功,ID:0x%X\r\n", tempreg);QMC5883L_WriteOneReg(QMC5883L_CONTROL2_REG, 0X80); //复位,要延时一定时间delay_ms(100);QMC5883L_WriteOneReg(QMC5883L_SET_RESET_PERIOD, 0X01); //复位后必须写入0x01,否则温度为0,磁场数据也不对QMC5883L_SetMode(QMC5883L_MODE_CONTINUOUS, QMC5883L_ODR_50HZ, QMC5883L_RNG_2G, QMC5883L_OSR_64);//设置工作模式return 1;
}
同时你也可以替换QMC5883L_SetMode的参数替换各种不同的控制模式,具体定义在qmc5883.h中, 而对于这些模式分别有什么作用,具体看芯片手册的最后几页,都有详细的说明,我也上传到了我的仓库当中
//QMC5883L工作模式
typedef enum
{QMC5883L_MODE_STANDBY = 0x00, //待机模式QMC5883L_MODE_CONTINUOUS = 0x01, //连续工作模式
}QMC5883L_MODE;//QMC5883L输出速率
typedef enum
{QMC5883L_ODR_10HZ = 0x00, //10HzQMC5883L_ODR_50HZ = 0x01, //50HzQMC5883L_ODR_100HZ = 0x02, //100HzQMC5883L_ODR_200HZ = 0x03, //200Hz
}QMC5883L_ODR;//QMC5883L测量范围
typedef enum
{QMC5883L_RNG_2G = 0x00, //2GQMC5883L_RNG_8G = 0x01, //8G
}QMC5883L_RNG;//QMC5883L过采样
typedef enum
{QMC5883L_OSR_512 = 0x00, //512QMC5883L_OSR_256 = 0x01, //256QMC5883L_OSR_128 = 0x02, //128QMC5883L_OSR_64 = 0x03, //64
}QMC5883L_OSR;
使用
后续就不用太纠结了,可以直接使用我声明在qmc5883.c文件下的一个结构体变量qmc5883
QMC5883L_HANDLE qmc5883 = {0,0,0,QMC5883L_init,QMC5883_GetData,QMC5883L_GetTemper
};
在路劲Core/Src/Hardware/use.c下有使用示例:
只需要三个函数 init(), getYaw(), getTemp()即可获取全部的参数
// todo QMC5883
#include "Magnetic/QMC5883/qmc5883.h"
void use_qmc5883(void){qmc5883.init();for(;;){printf("qmc:%d, %d\r\n", qmc5883.getYaw(), qmc5883.getTemp());HAL_Delay(10);}
}
不过还有具体的计算函数,我并没有对原始的数据进行滤波,仅仅是根据原始数据求了一个反三角函数而已,但是即便如此采集的数据依然不错,数据范围为 [0, 360],0和360度的边界会直接跳变int16_t QMC5883_GetData(void){
int16_t QMC5883_GetData(void){int16_t X, Y,Z;QMC5883L_GetMagneticData(&X, &Y, &Z);qmc5883.yaw = (atan2(Y,X) * (180 / 3.14159265) + 180);return qmc5883.yaw;
}
相关文章:
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...