磁感应传感器 - 从零开始认识各种传感器【第十二期】

1、什么是磁感应传感器

磁感应传感器又叫做磁力计,是可以测量磁场大小或方向的设备。因为地球本质上是一个巨大的磁铁。磁力计可让您测量空间中某一点的磁场强度以及磁场方向。

图1 磁力计

磁力计已广泛应用于各种应用。它们用于测量地球磁场、地理测量、探测潜艇,以及用于金属/武器探测器等方面。近年来,磁力计已经集成电路化并出现在多种电子产品中。 智能手机中的指南针功能就是由磁力计来实现的。导航功能也会借助磁力计,尤其是在城市中没有良好信号的地方。

2、磁感应传感器是如何工作的

磁感应传感器是通过测量磁场的强度和方向来工作的,它通常包含一个灵敏的磁性元件,当置于磁场中时,磁性元件会受到力的作用,导致它在磁场中发生运动。

图2 磁感应传感器工作原理

指南针就是一种简单类型的磁力计,其磁针根据周围磁场改变方向。磁化针的振荡频率与周围磁场强度的平方根成正比,根据震荡频率,就可以测量出磁场的强度。

在一个具体的导航应用中,地磁场是一个矢量,对于一个固定的地点来说,这个矢量可以被分解为两个与当地水平面平行的分量和一个与当地水平面垂直的分量。如果保持罗盘与和当地的水平面平行,那么罗盘中磁力计的三个轴就对应了这三个分量,从而确定了地面上的对应位置。

图3 罗盘导航工作原理

3、常见的磁感应传感器的种类

目前常用的主要是两种磁力计:磁电阻式磁力计和霍尔效应磁力计。他们采用了不同的测量原理。
磁电阻式磁力计是利用磁电阻效应,即材料的电阻会随着外部磁场的改变而发生变化。其应用包括磁罗盘、旋转位置传感、电流传感等。钻井定向、线位置测量、偏航速率传感器和虚拟实景中的头部轨迹跟踪。
霍尔效应磁力计是测量由于霍尔效应产生的电压,这种磁力计响应速度快,对于快速变化的磁场非常敏感,因此在许多应用中得到广泛应用,如导航系统和电动汽车。

3.1 磁电阻式磁力计

某些金属或半导体在遇到外加磁场时, 电阻值会随着外加磁场的大小发生变化,这种现象叫做磁阻效应。

图4 磁阻效应原理

磁电阻式磁力计的基本结构是由四个磁阻组成的惠斯通电桥,利用惠斯通电桥检测磁阻的变化。电桥中R1/R2/R3/R4 阻值相同都是R,但是R1/R2和R3/R4具有相反的磁化特性。
在没有外界磁场的情况下,电桥的输出为零。当检测到外界磁场的时候,R1/R2阻值增加∆R而R3/R4减少∆R。电桥输出一个微小的电压差∆V,它正比于外界磁场作用下的磁阻变化∆R。这就是磁阻式磁力计的工作原理。

图5 惠斯通电桥

3.2 霍尔效应磁力计

霍尔效应磁力计利用霍尔效应来测量磁感应强度。所谓霍尔效应就是,当有电流垂直于外磁场通过半导体时,载流子发生偏转,垂直于电流和磁场的方向会产生一附加电场,从而在半导体的两端产生电势差,这一现象就是霍尔效应(这个电势差也被称为霍尔电势差)。

图6 霍尔效应原理

霍尔磁力计通过测量霍尔电势差,经过信号放大和滤波器处理后,可以得到磁场的强度和方向信息。

3.3 两种磁感应传感器的比较

图7 磁感应传感器特性比较

这张表格给出了两者的一般性对比,由于测量原理的不同,两种传感器的特性各有不同。通常来说磁阻式磁力计的灵敏度和精度更高;霍尔磁力计的响应速度会更快。使用者可以根据自己的需求选择。

4、磁感应传感器实验演示

我们来演示使用 MCU 读取显示磁感应传感器的数据。实验中使用的是一款常见的三轴磁力计。我们移动磁力进行x,y,z 轴方向的旋转,可以看到屏幕显示的正方体根据检测的数据也出现相应的旋转动作。

图8 树莓派读取磁感应传感器展示

代码如下:

main.py

import uos
import machine
import st7789 as st7789
from fonts import vga2_8x8 as font1
from fonts import vga1_16x32 as font2
import random
import framebuf
machine.freq(200_000_000 )
#from DMA import DMA
import time
from math import pi,sin,exp,sqrt,floor,cos
import time, array, uctypes, rp_devices as devs
import math
#########################################################
###
w, h = 240, 220
j=0
i=0
x,y=0,0
offset_adc=0
offset_dis=0
x_Value=0
y_Value=0
disp_width = 240
disp_height = 240
############################################################
###
st7789_res = 0
st7789_dc  = 1spi_sck=machine.Pin(2)
spi_tx=machine.Pin(3)
reset=machine.Pin(st7789_res, machine.Pin.OUT)
dc=machine.Pin(st7789_dc, machine.Pin.OUT)###spi0=machine.SPI(0,baudrate=62500000, phase=1, polarity=1,bits = 8 , sck=spi_sck, mosi=spi_tx)
display = st7789.ST7789(spi0, disp_width, disp_width,reset,dc,xstart=0, ystart=0, rotation=3)
display.clear(st7789.BLACK)
#############################################################
dis_h = 150
dis_w = 150dis_buff_0 = array.array('H', (0 for _ in range(dis_h*dis_w*2)))###DMA_CHAN_0 = 0
dma_chan_0 = devs.DMA_CHANS[DMA_CHAN_0]
#dma_0 = devs.DMA_DEVICEdma_chan_0.READ_ADDR_REG = uctypes.addressof(dis_buff_0)
dma_chan_0.WRITE_ADDR_REG = devs.SPI0_SSPDR
dma_chan_0.TRANS_COUNT_REG = len(dis_buff_0)#int(len(dis_buff_0)/2)
dma_chan_0.CTRL_TRIG_REG = 0
dma_chan_0.CTRL_TRIG.BUSY = 0
#print(dma_chan_0.CTRL_TRIG.BUSY)
dma_chan_0.CTRL_TRIG.CHAIN_TO = DMA_CHAN_0
dma_chan_0.CTRL_TRIG.INCR_WRITE = 0
dma_chan_0.CTRL_TRIG.INCR_READ = 1
dma_chan_0.CTRL_TRIG.TREQ_SEL = devs.DREQ_SPI0_TX
# dma_chan_0.CTRL_TRIG.DATA_SIZE = 1#############################################################
I2C_TEST = machine.I2C(0,scl=machine.Pin(21), sda=machine.Pin(20))     #initializing the I2C method for ESP32#BM1422GMVI2C_TEST.writeto_mem(14,0x1B,bytes([152]))
I2C_TEST.writeto_mem(14,0x5C,bytes([0]))
I2C_TEST.writeto_mem(14,0x5D,bytes([0]))
I2C_TEST.writeto_mem(14,0x1C,bytes([12]))
I2C_TEST.writeto_mem(14,0x6C,bytes([45]))
I2C_TEST.writeto_mem(14,0x72,bytes([45]))
I2C_TEST.writeto_mem(14,0x78,bytes([45]))
I2C_TEST.writeto_mem(14,0x1D,bytes([64]))unsigned_x=0
unsigned_y=0
unsigned_z=0
signed_x=0
signed_y=0
signed_z=0
def read_component():global signed_x,signed_y,signed_z,unsigned_x,unsigned_y,unsigned_zunsigned_x = I2C_TEST.readfrom_mem(14, 0x10,2)unsigned_y = I2C_TEST.readfrom_mem(14, 0x12,2)unsigned_z = I2C_TEST.readfrom_mem(14, 0x14,2)signed_x=((unsigned_x[1]<<8)|unsigned_x[0])  - 256-380signed_y=((unsigned_y[1]<<8)|unsigned_y[0])  - 256-170signed_z=((unsigned_z[1]<<8)|unsigned_z[0]) - 230-200
#############################################################
def line( x0, y0, x1, y1, color):"""Draw a single pixel wide line starting at x0, y0 and ending at x1, y1.Args:x0 (int): Start point x coordinatey0 (int): Start point y coordinatex1 (int): End point x coordinatey1 (int): End point y coordinatecolor (int): 565 encoded color"""global dis_buff_0,dis_h,dis_wsteep = abs(y1 - y0) > abs(x1 - x0)if steep:x0, y0 = y0, x0x1, y1 = y1, x1if x0 > x1:x0, x1 = x1, x0y0, y1 = y1, y0dx = x1 - x0dy = abs(y1 - y0)err = dx // 2if y0 < y1:ystep = 1else:ystep = -1while x0 <= x1:if steep:
#             self.pixel(y0, x0, color)dis_buff_0[(y0-1)*dis_h+x0] = colorelse:
#             self.pixel(x0, y0, color)dis_buff_0[(x0-1)*dis_h+y0] = colorerr -= dyif err < 0:y0 += ysteperr += dxx0 += 1cube=[[-40,-40,-40],[-40,40,-40],[40,40,-40],[40,-40,-40],[-40,-40,40],[-40,40,40],[40,40,40],[40,-40,40]]
lineid=[1,2,2,3,3,4,4,1,5,6,6,7,7,8,8,5,8,4,7,3,6,2,5,1]
def matconv(a,matrix):res=[0,0,0]for i in range(0,3):res[i]=matrix[i][0]*a[0]+matrix[i][1]*a[1]+matrix[i][2]*a[2]for i in range(0,3):a[i]=res[i]return adef rotate(obj,x,y,z):x=x/piy=y/piz=z/pirz=[[cos(z),-sin(z),0],[sin(z),cos(z),0],[0,0,1]]ry=[[1,0,0],[0,cos(y),-sin(y)],[0,sin(y),cos(y)]]rx=[[cos(x),0,sin(x)],[0,1,0],[-sin(x),0,cos(x)]]matconv(matconv(matconv(obj,rz),ry),rx)
buff_1=bytearray(24)
buff_2=bytearray(24)
buff_pre_1=bytearray(24)
buff_pre_2=bytearray(24) 
def drawcube(x,y,z):global buff_1,buff_2,buff_pre_1,buff_pre_2,mpu_valuefor i in range (0,24,2):line(buff_pre_1[i],buff_pre_1[i+1],buff_pre_2[i],buff_pre_2[i+1],st7789.BLACK)for i in range(0,8):rotate(cube[i],x,y,z)for i in range(0,24,2):buff_1[i]=int(75+cube[lineid[i]-1][0])buff_1[i+1]=int(75+cube[lineid[i]-1][1])buff_2[i]=int(75+cube[lineid[i+1]-1][0])buff_2[i+1]=int(75+cube[lineid[i+1]-1][1])for i in range (0,24,2):line(buff_1[i],buff_1[i+1],buff_2[i],buff_2[i+1],st7789.BLUE)buff_pre_1 = buff_1buff_pre_2  = buff_2
#############################################################
display.set_window(125,45,150,150)
ROT_X_Y=0
ROT_X_Z=0
ROT_Y_Z=0
BM_X_Y_pre=0
BM_X_Z_pre=0
BM_Y_Z_pre=0
while True:read_component()BM_X_Y=math.atan2(float(signed_y),float(signed_x))*57.3+180BM_X_Z=math.atan2(float(signed_z),float(signed_x))*57.3+180BM_Y_Z=math.atan2(float(signed_z),float(signed_y))*57.3+180if BM_X_Y_pre >300 and BM_X_Y <60 :ROT_X_Y= -360elif BM_X_Y_pre <60 and BM_X_Y >300 :ROT_X_Y= 360else :ROT_X_Y=0if BM_X_Z_pre >300 and BM_X_Z <60 :ROT_X_Z= -360elif BM_X_Z_pre <60 and BM_X_Z >300 :ROT_X_Z= 360else :ROT_X_Z=0if BM_Y_Z_pre >300 and BM_Y_Z <60 :ROT_Y_Z= -360elif BM_Y_Z_pre <60 and BM_Y_Z >300 :ROT_Y_Z= 360else :ROT_Y_Z=0drawcube((BM_X_Y_pre-BM_X_Y+ROT_X_Y)/36,(BM_X_Z_pre-BM_X_Z+ROT_X_Z)/36,(BM_Y_Z_pre-BM_Y_Z+ROT_Y_Z)/36)print((BM_X_Y_pre-BM_X_Y+ROT_X_Y)/36,(BM_X_Z_pre-BM_X_Z+ROT_X_Z)/36,(BM_Y_Z_pre-BM_Y_Z+ROT_Y_Z)/36)BM_X_Y_pre=BM_X_YBM_X_Z_pre=BM_X_ZBM_Y_Z_pre=BM_Y_Zdc.off()display.write(st7789.ST7789_RAMWR, b"" )dma_chan_0.READ_ADDR_REG = uctypes.addressof(dis_buff_0)dc.on()dma_chan_0.CTRL_TRIG.EN = 1while dma_chan_0.CTRL_TRIG.BUSY:passdma_chan_0.CTRL_TRIG.EN = 0

其余代码文件请点此查看。

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

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

相关文章

Python内存管理:引用计数与垃圾回收

✨ 内容&#xff1a; 在Python中&#xff0c;内存管理是一个重要且常常被忽视的话题。了解Python如何管理内存&#xff0c;不仅能帮助我们编写高效的代码&#xff0c;还能避免潜在的内存泄漏问题。今天&#xff0c;我们将通过一个实际案例&#xff0c;深入探讨Python的内存管理…

RabbitMQ:如何保证消息的可靠性?

RabbitMQ基础 RabbitMQ支持的消息模型 SpringBoot集成RabbitMQ 一、发送者的可靠性 消息从发送者发送消息&#xff0c;到消费者处理消息&#xff0c;需要经过的流程是这样的&#xff1a; 消息从生产者到消费者的每一步都有可能导致消息丢失&#xff1a; 发送消息时丢失&am…

Spring Boot 学习(10)——固基(Idea 配置 git 访问 gitee)

几转眼就过了两个月&#xff0c;其实也没有闲着&#xff0c;学也学了&#xff0c;只是繁杂事多&#xff0c;学的不如以前多&#xff0c;也没有做过笔记了。 以前做开发因条件受限&#xff0c;没有什么 git &#xff0c;也没有 gitee。现在出来混要跟上形势才行&#xff0c;学习…

掌握VR全景技术,需要具备哪些条件?

VR全景技术自从进入市场以来&#xff0c;就在各个行业领域尝试落地运用&#xff0c;包括但不限于广告宣传、学校教育、医疗、工业、农业等领域。随着5G 技术的不断普及&#xff0c;VR全景技术也逐渐被应用到日常生活中的各个方面&#xff0c;从地产中介到车企销售&#xff0c;从…

【数据结构】探索排序的奥秘

若有不懂地方&#xff0c;可查阅我之前文章哦&#xff01; 个人主页&#xff1a;小八哥向前冲~_csdn博客 所属专栏&#xff1a;数据结构_专栏 目录 排序的概念 几种排序方法介绍 冒泡排序 选择排序 插入排序 堆排序 向上调整建堆排序 向下调整建堆排序 希尔排序 快速…

快乐数-快慢指针法

题目描述&#xff1a; 个人题解&#xff1a; 通过反复调用 getNext(n) 得到的链是一个隐式的链表。隐式意味着我们没有实际的链表节点和指针&#xff0c;但数据仍然形成链表结构。起始数字是链表的头 “节点”&#xff0c;链中的所有其他数字都是节点。next 指针是通过调用 ge…

使用两种不同的方法估计几何布朗运动随机过程的参数

使用两种不同的方法估计几何布朗运动随机过程的参数 文章目录 一、说明二. 随机过程三、马尔可夫过程3.1. 维纳进程3.2. 广义维纳过程3.3. 伊藤进程 四、几何布朗运动 &#xff08;GBM&#xff09;五、用于估计GBM工艺参数的MLE方法5.1. 最大似然估计如何工作&#xff1f;5.2、…

2024全国青少年信息素养大赛图形化编程复赛真题大全

2024年全国青少年信息素养大赛图形化编程复赛全国结束了&#xff0c;经过了3次各个赛区&#xff08;7月6日、13日、20日&#xff09;图形化编程小低组、小高组整体来看&#xff0c;真题出的都比较有水平&#xff0c;2024年全国青少年信息素养大赛总决赛将在2024年8月16日~20日在…

MySQL面试篇章——MySQL索引

文章目录 MySQL 索引索引分类索引创建和删除索引的执行过程explain 查看执行计划explain 结果字段分析 索引的底层实现原理B-树B树哈希索引 聚集和非聚集索引MyISAM&#xff08;\*.MYD&#xff0c;*.MYI&#xff09;主键索引辅助索引&#xff08;二级索引&#xff09; InnoDB&a…

PRC gRPC 框架

概述 RPC主要目的在于让开发者&#xff0c;能够方便的调用远程服务器上的服务&#xff0c;而不需要关注底层的网络通信细节。其是一种进程间通信技术&#xff0c;允许程序在不同计算机上执行代码。 RPC技术主要用于分布式系统、微服务架构以及需要进行跨网络调用服务的应用中…

项目实战二 HIS项目

目标&#xff1a; 项目的操作流程&#xff1a; 开发体系 前端开发&#xff1a;负责页面的编写 HTML CSS JavaScript 后端开发&#xff1a;看不到 摸不着的功能 常用开发语言 PHP JAVA Python 框架 &#xff1a; 半成品 做好的功能模块 版本控制 Git 分布式版本控…

鼠标连点器:是什么?如何用?鼠标自动点击器好用吗?说明书详细版(国内外6款电脑鼠标连点器分享)值得收藏!

知识科普1&#xff1a;鼠标连点器是什么&#xff1f; ⭕答&#xff1a;鼠标连点器&#xff0c;又称为鼠标点击器或自动点击器&#xff0c;是一种能够模拟鼠标点击操作的计算机软件。 鼠标连点器可以根据用户设定的参数&#xff0c;自动进行连续的鼠标点击操作&#xff0c;从而…

SQL labs-SQL注入(三)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 引言&#xff1a; 盲注简述&#xff1a;是在没有回显得情况下采用的注入方式&#xff0c;分为布尔盲注和时间盲注。 布尔盲注&#xff1a;布尔仅有两种形式&#xff0c;ture&#…

【LLM】-05-提示工程-部署Langchain-Chat

目录 1、软硬件要求 1.1、软件要求 1.2、硬件要求 1.3、个人配置参考 2、创建cuda环境 3、下载源码及模型 4、配置文件修改 5、初始化知识库 5.1、训练自己的知识库 6、启动 7、API接口调用 7.1、使用openai 参考官方wiki&#xff0c;本文以Ubuntu20.04_x64&#xf…

微信小程序数组绑定使用案例(二)

一、数组事件绑定&#xff0c;事件传递数据 1.wxml <text>姓名&#xff1a;{{name}} </text> <block wx:for"{{list}}"><button bind:tap"nameClick2" data-name"{{item}}">修改:{{item}}</button> </block&…

想学习Python爬虫的宝子们可以看过来,从基础开始看这一篇文章就够了!

1. 预备知识 学习者需要预先掌握Python的数字类型、字符串类型、分支、循环、函数、列表类型、字典类型、文件和第三方库使用等概念和编程方法。 2. Python爬虫基本流程 a. 发送请求 使用http库向目标站点发起请求&#xff0c;即发送一个Request&#xff0c;Request包含&am…

单调栈(随缘复习到了,顺手刷了)

也是不知道为什么突然又复习到单调栈了&#xff0c;所以顺手刷了三道题&#xff0c;总结一下 P6503 [COCI2010-2011#3] DIFERENCIJA 思路&#xff1a;这题是要求每个子区间里面的最大值和最小值的差&#xff0c;我们一开始想的必然是纯暴力呀&#xff0c;但是一看这数据&#…

自动驾驶系列—智能巡航辅助功能中的车道变换功能介绍

自动驾驶系列—智能巡航辅助功能中的车道中央保持功能介绍 自动驾驶系列—智能巡航辅助功能中的车道变换功能介绍 自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍 自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍 文章目录 1. 背景介绍2. 功能定义3. 功能原理4. 传感…

MySQL聚合函数(DQL)

先看一下我的表内容和数据&#xff0c;再做接下来的例子和讲解 1.聚合函数的基本语法 SELECT 聚合函数&#xff08;表中的某个字段&#xff09;FROM 表名; 2. 常见的聚合函数 举例 1.统计该企业的数量 select count(idcard) from emp; 2.统计该企业员工的平均年龄 select…

SpringBoot缓存注解使用

背景 除了 RedisTemplate 外&#xff0c; 自Spring3.1开始&#xff0c;Spring自带了对缓存的支持。我们可以直接使用Spring缓存技术将某些数据放入本机的缓存中&#xff1b;Spring缓存技术也可以搭配其他缓存中间件(如Redis等)进行使用&#xff0c;将某些数据写入到缓存中间件…