地磁传感器(学习笔记下)

咱们接着学习笔记上来学习哈,首先,我们编写读取方位角程序,配置好传感器以后,我们就可以读取磁力值了,我们先定义一个结构体类型,用来存放磁力值以及方位角值。这个结构体,放到qmc5883l.h文件中

typedef struct{int16_t mag_x; //放xyz方向的磁力值int16_t mag_y;int16_t mag_z;float   azimuth; //最后的azimuth方位角
}t_sQMC5883L;

这个结构体中用到了int16_t,需要包含stdint.h头文件

#include <stdint.h>

接下来,写读取地磁传感器值的函数,放到qmc5883l.c文件中

void qmc5883l_read_xyz(t_sQMC5883L *p) //该函数接受一个指向 t_sQMC5883L 结构体的指针 p,用于存储读取的磁场数据
{uint8_t status, data_ready=0; //status: 用于存储从传感器读取的状态寄存器值,data_ready: 用于标记数据是否准备好int16_t mag_reg[3]; //mag_reg[3]: 用于存储从传感器读取的磁场数据(X、Y、Z轴)qmc5883L_register_read(QMC5883L_STATUS, &status, 1); // 读状态寄存器 qmc5883L_register_read(QMC5883L_STATUS, &status, 1): 读取QMC5883L传感器的状态寄存器,并将结果存储在 status 变量中if (status & 0x01) //if (status & 0x01): 检查状态寄存器的最低位(0x01)是否为1,表示数据是否准备好。如果数据准备好,将 data_ready 设置为1{data_ready = 1; }if (data_ready == 1) //if (data_ready == 1): 如果数据准备好,执行以下操作{data_ready = 0; //data_ready = 0: 重置 data_ready 标志qmc5883L_register_read(QMC5883L_XOUT_L, (uint8_t *)mag_reg, 6); //qmc5883L_register_read(QMC5883L_XOUT_L, (uint8_t *)mag_reg, 6): 读取QMC5883L传感器的X、Y、Z轴数据寄存器,并将结果存储在 mag_reg 数组中;//(uint8_t *)mag_reg: 将 mag_reg 数组转换为 uint8_t 指针,用于存储读取的数据;QMC5883L_XOUT_L: X轴数据的低字节寄存器地址 ;6: 读取的数据长度(6字节,每个轴2字节)p->mag_x = mag_reg[0]; // 将读取的X轴数据存储在结构体 p 的 mag_x 成员中p->mag_y = mag_reg[1]; //将读取的Y轴数据存储在结构体 p 的 mag_y 成员中p->mag_z = mag_reg[2]; //将读取的Z轴数据存储在结构体 p 的 mag_z 成员中}
}

函数中,先读取状态寄存器,看看磁力值是否可读,然后再读。读到后的值,最终传入t_sQMC5883L定义的结构体,注意一下这里面的mag_reg数据变量,定义的时候是16位的3个元素,在读寄存器的时候,强制为8位指针变量,读6个字节。这里,大家可以看一下寄存器定义,磁力值寄存器有6个,每个值都是由低字节寄存器和高字节寄存器组成。然后我们再写一个计算方位角的函数,使用磁力值计算方位角,最简单的方式,只需要一个公式。我们把这个函数放到qmc5883l.c文件中

void qmc5883l_fetch_azimuth(t_sQMC5883L *p)
{qmc5883l_read_xyz(p);p->azimuth = (float)atan2(p->mag_y, p->mag_x) * 180.0 / 3.1415926 + 180.0;
}

这个函数里面用到了atan2函数,需要包含头文件math.h文件

#include <math.h>

我们把这个计算方位角的函数在qmc5883l.h文件中进行声明

extern void qmc5883l_fetch_azimuth(t_sQMC5883L *p);

然后我们在app_main函数中调用它

void app_main(void)
{ESP_ERROR_CHECK(i2c_master_init());ESP_LOGI(TAG, "I2C initialized successfully");qmc5883l_init();while (1){vTaskDelay(1000 / portTICK_PERIOD_MS);qmc5883l_fetch_azimuth(&QMC5883L);ESP_LOGI(TAG, "azimuth = %.1f", QMC5883L.azimuth);}
}

在主函数中,qmc5883l初始化以后,每间隔1秒钟计算1次方位角值,然后通过串口发送到终端。

这里面把读取到的值给了QMC5883这个结构体变量,需要在主函数前面定义一下

t_sQMC5883L QMC5883L;

函数里面用到了freeRTOS的延时函数,需要在main.c文件的最前面包含相关头文件

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从GPT定制到Turbo升级再到Assistants API,未来AI世界,你准备好了吗?

引言 在OpenAI DevDay发布会上&#xff0c;OpenAI再次震撼整个人工智能行业&#xff0c;为AI领域带来了重大的更新。CEO Sam Altman宣布推出了定制版本的ChatGPT&#xff0c;这意味着用户现在可以根据自己的需求打造个性化的GPT&#xff0c;并分享至GPT Store。这一消息对于受…

神经架构搜索:自动化设计神经网络的方法

在人工智能&#xff08;AI&#xff09;和深度学习&#xff08;Deep Learning&#xff09;快速发展的背景下&#xff0c;神经网络架构的设计已成为一个日益复杂而关键的任务。传统上&#xff0c;研究人员和工程师需要通过经验和反复试验来手动设计神经网络&#xff0c;耗费大量时…

【MySQL】日志

1. 日志基本了解 常见的MySQL Server日志类型&#xff0c;以及记录的日志信息&#xff08;场景通俗理解&#xff09; 错误日志 记录的主要信息由服务器关闭、启动、崩溃事件&#xff1b;MySQL运行过程中出现的错误、警告和严重事件以及与权限、配置相关的问题使用场景 诊断MyS…

【Linux】【xmake】安装 + C/C++常用项目配置

文章目录 0. 环境准备1. 子命令create - 快速创建项目build - 构建程序config - 配置编译需要的参数show - 查看当前工程基本信息update - 程序自更新 2. C/C 项目常用配置2.1 项目目标类型2.2 添加宏定义2.3 头文件路径和链接库配置2.4 设置语言标准2.5 设置编译优化2.6 添加源…

光伏MPPT追踪的仿真设计

利用Simulink可实现如下功能&#xff1a;改变光照时有MPPT追踪并低电压穿越的能力。 MPPT控制器的全称为“最大功率点跟踪”&#xff08;Maximum Power Point Tracking&#xff09;太阳能控制器&#xff0c;检测主回路直流电压及输出电流&#xff0c;计算出太阳能阵列的输出功…

5.15 加载内核映像文件(1)

首先是 连接脚本与 实际的内核映像大小的关系&#xff1a; 关于ELF 格式的了解&#xff1a; 如何通过 ELF 头&#xff0c; 找到各个段。 网上的关于elf 的截图&#xff1a; 那么 segment 与 section 有什么区别呢&#xff1f; 也就是说&#xff0c; section值得是 单个C文件的…

021、深入解析前端请求拦截器

目录 深入解析前端请求拦截器&#xff1a; 1. 引言 2. 核心实现与基础概念 2.1 基础拦截器实现 2.2 响应拦截器配置 3. 实际应用场景 3.1 完整的用户认证系统 3.2 文件上传系统 3.3 API请求缓存系统 3.4 请求重试机制 3.5 国际化处理 4. 性能优化实践 4.1 请求合并…

VisionPro - 高级 - 保存模式以备后用 - 中心圆的查找配置

前言: 在基础篇, VisionPro Basic - 01- 有关应用和作业-CSDN博客 我们提到了应用和作业的保存,那么这些都是vpp的保存格式。 我们知道,在模式工具的配置中,如果我们做好了很多的调试,最后配置好参数后,也有一个保存模式的选项。我们在保存的时候,一定要添加前缀或…

GIT使用list

清空当前commit区 方法 1&#xff1a;软重置到初始状态 如果希望保留文件内容&#xff0c;但清空所有 commit 历史&#xff0c;可以使用以下命令&#xff1a; git reset --soft $(git rev-list --max-parents0 HEAD)解释&#xff1a; --soft 表示重置 commit 历史&#xff…

【机器学习】任务九:卷积神经网络(基于 Cifar-10 数据集的彩色图像识别分类、基于 CNN 的手写数字识别的实验)

1.卷积神经网络 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种专门用于处理数据网格结构&#xff08;如图像、视频等&#xff09;的深度学习模型&#xff0c;在计算机视觉任务中被广泛应用&#xff0c;如图像分类、目标检测、图像分割等。以下…

[手机Linux PostmarketOS]七, Linux使用selenium爬虫

一&#xff0c;selenium安装 # 用pip 安装 selenium pip3 install selenium --break-system-packages 二&#xff0c;安装浏览器Chrome Alpine Linux 环境中没有google Chrome&#xff0c; 使用 Chromium 浏览器作为 Chrome 的替代品&#xff0c;Chromium 是 Chrome 的开源版本…

在GeoTools中的Shapefile属性表读取效率之Shp与Dbf对比

目录 前言 一、POI测试数据简介 1、选用的POI数据 2、关于数据的属性数据 二、属性数据读取的两种方式实现 1、基于DbaseFileReader的读取 2、基于SimpleFeatureSource的读取 三、实际运行对比 1、内存和CPU占用情况 2、运行耗时情况 四、总结 前言 众所周知&#x…

Unity3D 开发技巧

视频教程&#xff1a; Unity3D 开发技巧分享&#xff0c;你可能不知道的小知识 Unity中文课堂教程地址&#xff1a; Unity3D开发-你可能不知道的知识 | Unity 中文课堂 Start 函数可以用协程 默认协同函数 Start 可将 void 改为IEnumerator 作为协程启动 using System.Colle…

多层感知机的从零实现与softmax的从零实现(真·0000零基础)

今天再读zh.d2l书&#xff08;4.2. 多层感知机的从零开始实现 — 动手学深度学习 2.0.0 documentation&#xff09;&#xff0c; 看了关于多层感知机的从零实现与softmax的从零实现 目录 mlp从零实现&#xff0c; 点击“paddle”的代码 点击“torch”的代码 训练 参数解…

DataSophon集成ApacheImpala的过程

注意: 本次安装操作系统环境为Anolis8.9(Centos7和Centos8应该也一样) DataSophon版本为DDP-1.2.1 整合的安装包我放网盘了: 通过网盘分享的文件&#xff1a;impala-4.4.1.tar.gz等2个文件 链接: https://pan.baidu.com/s/18KfkO_BEFa5gVcc16I-Yew?pwdza4k 提取码: za4k 1…

C#与C++交互开发系列(十二):托管和非托管内存管理策略

前言 在进行C#与C互操作开发时&#xff0c;内存管理是一个非常重要的环节。由于C#采用托管内存管理&#xff08;由垃圾回收机制GC控制&#xff09;&#xff0c;而C则使用手动内存管理&#xff08;需要开发者负责分配和释放内存&#xff09;&#xff0c;因此跨语言调用时&#…

光耦的应用

什么是光耦 光耦是一种实现信号隔离的元器件&#xff0c;通常用于各部分电路之间&#xff0c;使其不互相受到影响。 工作原理 光耦是由一个发光二极管和一个光敏三极管封装而成的。其使用原理为&#xff1a; 当发光二极管有信号输入时&#xff0c;则会被点亮&#xff0c;此时…

PHP-FPM 性能配置优化

4 核 8 G 服务器大约可以开启 500 个 PHP-FPM&#xff0c;极限吞吐量在 580 qps &#xff08;Query Per Second 每秒查询数&#xff09;左右。 Nginx php-fpm 是怎么工作的&#xff1f; php-fpm 全称是 PHP FastCGI Process Manager 的简称&#xff0c;从名字可得知&#xff…

基于SSM的“众优”大学生家教平台的设计与实现

前言 对于当今社会的人们来说&#xff0c;互联网技术是必不可少的&#xff0c;随着经济和技术的不断发展&#xff0c;计算机已经深入到各个领域。“众优”大学生家教平台将人们的时间需求与计算机技术结合起来&#xff0c;架起一座桥梁&#xff0c;使用在线查看“众优”大学生…

设计模式讲解

设计原则 单一职责原则 > 一个对象应该只包含单一的职责&#xff0c;并且该职责被完整地封装在一个类中 > //一个人类 public class People {/*** 人类会编程*/public void coding(){System.out.println("int mian() {");System.out.println(" print…