基于HMC5883的电子罗盘设计
使用HMC5883L-3轴数字罗盘传感器计算航向角
使用HMC5883L -3轴数字罗盘传感器计算航向角——中北大学:马政贵图1 HMC5883L 的电路图HMC5883L -3轴数字罗盘采用IIC 总线接口,内含12位AD 转换器,能在8Ga 的磁场中实现5mGa 的分辨率。
1. HMC5883L 的初始化:HMC5883L 的磁场默认测量范围为 1.3Ga ,由于地磁场强度大约是0.5-0.6Ga ,故使用默认的量程即可,此外还需进行采样平均数、数据输出速率、测量模式的初始化配置即可。
/******************************************************************************* 功能:对HMC5883L 进行初始化参数:无返回值:无*******************************************************************************/ void HMC5883_Init(void){HMC_GPIO_Config(); //GPIO 配置HMC_I2C_Write(0x00,0x78); //(配置寄存器A )采样平均数8;数据输出速率75Hz ;正常测量配置模式 HMC_I2C_Write(0x02,0x00); //(模式寄存器)连续测量模式}备注:void HMC_I2C_Write(u8 address,u8 data)为寄存器写入函数,第一个参数address ±±为要写入的寄存器地址,第二个参数data 为要写入寄存器的值。
2. HMC5883L 自测:HMC5883L -3轴数字罗盘内含自测模式。
HMC_I2C_Write(0x00,0x79); //(配置寄存器A )采样平均数8;数据输出速率75Hz ;正偏压自测模式 HMC_I2C_Write(0x02,0x01); //(模式寄存器)单一测量模式通过将配置寄存器A 的最低位(MS1和MS0)从00更改为01,然后再配置为单一测量模式,即可进入自测模式。
电子罗盘角度校准
关于电子罗盘HMC5883L的角度校准简介:本文档介绍如何处理电子罗盘(hmc5883l)的角度偏差问题,运用matlab 的拟合曲线功能,从而精确找到偏差值关键词:HMC5883L,matlab,角度校准,电子罗盘由于需要做一个带有指南针的智能小车,所以选用了HMC5883L这个传感器。
本想着直接把数据读出来,然后经过公式:jiaodu=atan2((float)(y),(float)(x)) * (180 / 3.14159265) + 180;就ok了。
可没想到,当转动罗盘一周时,角度是非线性变化的;这可就头疼了……所以迅速查阅相关资料,查找原因。
果不其然,这种现象产生是必然的。
具体原因这里就不解释了,这里主要说的就是怎么解决这个问题。
网上也有好多解决的方法,我也是参考其中的一种步骤:1、将芯片水平放置,不断旋转芯片得到一组xy轴数据2、使用matlab拟合椭圆,得到中心坐标(xc,yc)半长轴a 半短轴b3、在程序中校准想,x,y:x =x –xcy =y –ycy =y*(b/a)若椭圆是竖着的y =y*(a/b)若椭圆是横着的具体实现方法:1、把读出的原始数据经过电脑串口,100ms传输一次就行,传输给串口助手;x y两个一组(组数越多越好!),然后匀速水平转动罗盘,大概转动两周(慢速)。
最后保存好数据。
2、打开matlab,新建一个m文件,把下列代码拷贝到该文件中,然后把传来的数据copy到代码的x=[……]中:%==============================程序开始============================clear; clc; close all;% 设椭圆一般方程F=@(p,x)p(1)*x(:,1).^2+p(2)*x(:,1).*x(:,2)+p(3)*x(:,2).^2+p(4)*x(:,1)+p(5)*x(:,2)+p(6);% 离散数据点x=[-00105 -00060-00106 -00060-00107 -00061-00107 -00062-00108 -00060-00107 -00059-00108 -00059......];%把数据拷贝到这里,说明:第一列是x轴读数;第二列是y轴读数。
三维磁阻式电子罗盘的设计与实现
A 3- ax e s magn e t O r e s i s t i V e e l e c t r on i c co m pa s s i n t h i s pa pe r whi ch c on s i s t s o f 3 D m a gn e t O r e s i s t i v e s e n s or HM C58 83 1 ,
3-a x es e l e ct r i ca l c ompas s a r e hi gh ac cu r a c y an d s t abl e o pe r a t i on .
K e y wo r d s : 3 - a x e s ma g n e t O r e s i s l i V e e l e c t r o n i c c o mp a s s , h e a d i n g a n g l e , e r r o r , e l l i p s e f i t t i n g
3 D a c c e l e r a t i o n s e n s o r AD X L 3 4 5 B a n d MCU L P C1 1 1 4 F B D4 8 f o r me a s u r i n g h e a d i n g a n g l e , p i t c h a n d r o l l a n g l e i n t h e p a r t o f t h e h a r d wa r e . S o u r c e s c a u s i n g e r r o r s a r e a n a l y z e d i n t h i s p a p e r , t h e n e l l i p s e f i t t i n g e r r o r c o mp e n s a t i o n me t h o d i s p r o — p o s e d f o r a v o i d i n g e r r o r t h a t a f e c t i n g me a s u r e me n t a c c u r a c y o f e l e c t r o n i c c o mp a s s i n t h e s o f t wa r e , c h a r a c t e r i s t i c s o f t h e
hmc5883l工作原理(一)
hmc5883l工作原理(一)HMC5883L工作原理概述HMC5883L是一款采用磁电阻原理测量磁场的数字式三轴磁力计,可测量X、Y、Z轴的磁场强度。
它广泛应用于电子罗盘、导航、定位等领域。
磁电阻原理磁电阻效应是指材料在磁场中具有电阻率的变化现象,其本质是材料内部磁矩的定向受到外部磁场的影响。
当外部磁场方向与材料内部磁矩方向相同时,电阻率最小,反之则最大。
利用磁电阻效应可以实现磁场测量。
HMC5883L结构HMC5883L内部由磁电阻元件、前置放大器、AD转换器、数字信号处理器等组成。
其结构示意图如下:•磁电阻元件:负责测量外部磁场的大小和方向;•前置放大器:将测量结果进行放大;•AD转换器:将模拟信号转换为数字信号;•数字信号处理器:处理并输出数字信号。
工作原理HMC5883L三个轴的磁场强度受物体周围磁场的影响,导致其磁电阻元件产生电阻值变化。
该变化信号通过前置放大器,被转换成模拟电压信号,并被送入AD转换器转换成数字信号。
数字信号处理器将这些数字信号处理后,输出计算得出的三轴磁场数据。
结束语本文简单介绍了HMC5883L的工作原理,以及使用磁电阻原理测量磁场的基本原理。
HMC5883L在实际应用中,可以根据需要对不同轴的磁场进行测量和调整,是一款功能强大的磁力计。
使用注意事项使用HMC5883L时,需要注意以下事项:•HMC5883L对磁场干扰较为敏感,应注意周围环境中的磁场干扰;•HMC5883L在工作时,应注意温度和外部电磁干扰对其测量结果的影响;•HMC5883L输出的磁场数据需要校准,以提高其精度和准确性。
总结HMC5883L是一款广泛使用的数字式三轴磁力计,采用磁电阻原理测量磁场,可应用于电子罗盘、导航和定位等领域。
了解HMC5883L的工作原理和注意事项,有助于更好地应用和使用该设备。
电子罗盘应用电路设计与调试
内置自检功能 低电压工作(2.16-3.6V)和超低功耗(100uA) 内置驱动电路 I2C数字接口 无引线封装结构 磁场范围广(+/-8Oe) 有相应软件及算法支持 最大输出频率可达160Hz
SCL VDD NC S1
3 设计过程
HMC5883L简介
霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯 片,应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率HMC118X系 列磁阻传感器,并附带霍尼韦尔专利的集成电路包括放大器、自动消磁驱动器、偏差校 准、能使罗盘精度控制在1°~2°的12位模数转换器。
(2)电路调试 1. 使用+5V电源接入HMC5883L电子罗盘模块的J4接口,使用20P排线将 HMC5883L电子罗盘模块J2接口和智能显示终端的J2接口相连接起来,确认 无误之后,给模块上电,模块电路如图13.2所示。 2. 通过按键K1或K2选中电子罗盘实验,点击按键K5进入电子罗盘实验,可 以观察到智能显示终端上显示当前方向角。 3. 缓慢转动模块,观察智能显示终端上方向角的变化。
1. 任务描述 2. 器材准备 3. 设计过程 4. 电路调试
课程内容 Course Contents
1. 任务描述 2. 器材准备 3. 设计过程 4. 电路调试
1 任务描述任务描述 Nhomakorabea• 具体任务 1)掌握HMC5883L磁传感器结构及工作原理。 2)掌握电子罗盘应用电路的制作与调试方法。
• 任务要求 用HMC5883L测量当前方位角,并在智能显示终端上显示出来。
HMC5883L 采用霍尼韦尔各向异性磁阻(AMR)技术,这些各向异性传感器具有在轴向 高灵敏度和线性高精度的特点。传感器带有的对于正交轴低敏感度的固相结构能用于测 量地球磁场的方向和大小,其测量范围从毫高斯到 8 高斯(gauss)。
小型多旋翼无人机三轴电子罗盘设计与误差分析校准
小型多旋翼无人机三轴电子罗盘设计与误差分析校准1. 引言- 研究背景与意义- 本文的研究目的和内容2. 多旋翼无人机三轴电子罗盘设计- 电子罗盘原理- 三轴电子罗盘设计- 硬件选型和电路设计3. 误差分析与校准- 罗盘误差类型及原因分析- 罗盘校准方法介绍- 校准实验设计和实验结果分析4. 算法实现与测试- 姿态解算算法- 航向角解算算法- 算法测试方法和结果分析5. 结论与展望- 本文研究的主要成果和贡献- 在未来的发展和应用前景- 对改进和优化的建议和展望第1章:引言随着全球定位系统(GPS)的不断发展和普及,无人飞行器(UAV)技术也得到了快速发展。
多旋翼无人机作为一种轻型、灵活、易操控的无人机,逐渐成为了广大航模爱好者、科研工作者和商业应用者的心头好。
作为一种航空器,多旋翼无人机需要对其航向进行准确测量和控制,以便实现精准操控和自主导航等功能。
而电子罗盘作为一种精度较高的传感器,被广泛应用于航空领域中。
本文基于多旋翼无人机平台,研究了三轴电子罗盘的设计和误差校准方法,并对其航向角解算算法进行了实现和测试。
本研究的目的是提高多旋翼无人机的航向角测量精度,以满足其高精度定位和导航等应用需求。
本文的研究内容主要包括三个方面:(1)电子罗盘的设计和选型,包括硬件选型和电路设计等;(2)误差分析和校准方法的实验;(3)航向角解算算法的实现和测试。
通过这些方面的研究,本文将为多旋翼无人机的导航和控制等方面提供有益的参考和指导。
本文的结构按照如下方式组织。
第2章将详细介绍电子罗盘的原理和设计,包括其硬件选型和电路设计等方面的内容。
第3章将分析电子罗盘的误差类型及其原因,并介绍罗盘校准的方法。
第4章将讨论航向角解算算法的实现和测试方法。
第5章将回顾本文的主要研究成果和贡献,并对未来的发展和应用前景进行展望。
第2章:多旋翼无人机三轴电子罗盘设计2.1 电子罗盘原理电子罗盘是一种基于地球磁场原理的传感器,主要用于航空、船舶等领域中航向角的测量。
hmc5883l三轴电子罗盘传感器连接arduino
hmc5883l三轴电子罗盘传感器连接arduinoHMC5883L器件简介(1)器件介绍名称:HMC5883L电子指南针罗盘模块(三轴磁场传感器)型号:GY-271(2)主要技术参数使用芯片:HMCL5883L供电电源:3-5V通信方式:IIC通信协议测试范围:±1.3-8高斯(3)工作原理传统罗盘用一根被磁化的磁针来感应地球磁场,地球磁场与磁针之间的磁力时磁针转动,直至磁针的两端分别指向地球的磁南极与磁北极。
电子罗盘也一样,只不过把磁针换成了磁阻传感器,然后将感受到的地磁信息转换为数字信号输出给用户使用。
(4)产品应用领域手机、笔记本电脑、消费类电子、汽车导航系统和个人导航系统等。
(5)器件尺寸图hmc5883l三轴电子罗盘传感器连接arduino连接方法:只要连接VCC,GND,SDA,SCL四条线。
ArduinoGND-》HMC5883LGNDArduino3.3V-》HMC5883LVCCArduinoA4(SDA)-》HMC5883LSDAArduinoA5(SCL)-》HMC5883LSCL (注意,接线是A4,A5,不是D4,D5)程序编写:1、下载HMC5883L库文件。
下载地址:http://soft2.wmzhe/download/AnsifaArduino/HMC5883L.zip2、解压HMC5883L库文件到arduino文件夹:arduino-0022\libraries下面。
3、编写以下程序,下载下面测试程序到arduino:#include《Wire.h》#include《HMC5883L.h》HMC5883Lcompass;voidsetup(){。
hmc5883l三轴电子罗盘传感器连接arduino
hmc5883l三轴电子罗盘传感器连接arduinohmc5883l三轴电子罗盘传感器连接arduinoHMC5883L器件简介(1)器件介绍名称:HMC5883L电子指南针罗盘模块(三轴磁场传感器)型号:GY-271(2)主要技术参数使用芯片:HMCL5883L供电电源:3-5V通信方式:IIC通信协议测试范围:±1.3-8高斯(3)工作原理传统罗盘用一根被磁化的磁针来感应地球磁场,地球磁场与磁针之间的磁力时磁针转动,直至磁针的两端分别指向地球的磁南极与磁北极。
电子罗盘也一样,只不过把磁针换成了磁阻传感器,然后将感受到的地磁信息转换为数字信号输出给用户使用。
(4)产品应用领域手机、笔记本电脑、消费类电子、汽车导航系统和个人导航系统等。
(5)器件尺寸图hmc5883l三轴电子罗盘传感器连接arduino连接方法:只要连接VCC,GND,SDA,SCL四条线。
ArduinoGND-》HMC5883LGNDArduino3.3V-》HMC5883LVCCArduinoA4(SDA)-》HMC5883LSDAArduinoA5(SCL)-》HMC5883LSCL (注意,接线是A4,A5,不是D4,D5)程序编写:1、下载HMC5883L库文件。
下载地址:http://soft2.wmzhe/download/AnsifaArduino/HMC5883L.zip2、解压HMC5883L库文件到arduino文件夹:arduino-0022\libraries下面。
3、编写以下程序,下载下面测试程序到arduino:#include《Wire.h》#include《HMC5883L.h》HMC5883Lcompass;voidsetup(){。
数字式电子罗盘毕业设计
毕业设计说明书数字式电子罗盘设计学生姓名:孔垂礼学号: ********** 学院:计算机与控制工程专业:电气工程及其自动化指导教师:***2015 年 06 月数字式电子罗盘设计摘要数字式电子罗盘具有很多优点,例如:体积比较小、启动非常迅速、功率损耗较低、制造成本低廉等,当今社会测控技术对测向传感器提出了非常高的要求;为了提高数字罗盘的测量精度,特意设计了一种基于HMC5883L三轴磁阻传感器[1]的数字电子罗盘;在分析相关类似产品的基础上,特别强调对电源、器件选型、信号调理电路、软件设计等方面进行了分析研究,设计出了数字罗盘并且研制了试验的样机;为验证设计效果,在双轴陀螺测试转台上进行了测试,试验结果初步验证了该设计方案的可行性;论文的研究工作可以为研究和改良数字式磁罗盘的测量准确度提供可靠的资料.关键词:地磁场,数字罗盘,HMC5883L三轴磁阻传感器,重力加速度计Here is the translation of your chinese paper’s titleAbstractDigital electronic compass, has small volume, quick start, low power consumption, and low cost, the modern measurement and control technology puts forward higher requirements on sensor of direction finding; In order to improve the precision of the digital compass, we design a HMC5883L triaxial magnetic resistance sensor based digital electronic compass; On the basis of the analysis of related products, focuses on the power supply, device selection, signal conditioning circuit and software design are analyzed in aspects of research, design the digital compass and test prototype was developed; To verify the design effect, on the two-axis gyro testing table was tested, experimental results verify the feasibility of the design scheme of; Thesis research work could be used to research and provide reference for improving the measuring accuracy of digital magnetic compass.Key words : Earth's magnetic field, digital compass, HMC5883L three-axis magnetic resistance sensor, the gravity accelerometer目录摘要 (2)Abstract (3)目录...........................................................................................................................................错误!未定义书签。
3轴数字罗盘IC HMC5883L介绍
3轴数字罗盘IC HMC5883L介绍3轴数字罗盘IC HMC5883L简介霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域。
HMC5883L 包括最先进的高分辨率HMC118X 系列磁阻传感器,并附带霍尼韦尔专利的集成电路包括放大器、自动消磁驱动器、偏差校准、能使罗盘精度控制在1°~2°的12 位模数转换器.简易的I2C 系列总线接口。
HMC5883L 是采用无铅表面封装技术,带有16 引脚,尺寸为3.0X3.0X0.9mm。
HMC5883L 的所应用领域有手机、笔记本电脑、消费类电子、汽车导航系统和个人导航系统。
3轴数字罗盘IC HMC5883L特点1、三轴磁阻传感器和ASIC 都被封装在3.0×3.0×0.9mm LCC 表面装配中。
2、12-bit ADC 与低干扰AMR 传感器,能在±8 高斯的磁场中实现5 毫高斯分辨率。
3、内置自检功能。
4、低电压工作(2.16-3.6V) 和超低功耗(100uA)。
5、内置驱动电路。
6、I2C 数字接口。
7、无引线封装结构。
8、磁场范围广(+/-8Oe)。
9、有相应软件及算法支持。
10、最大输出频率可达160Hz。
3轴数字罗盘IC HMC5883L优点1、是体积小高集成产品。
只需添加一个微处理器接口,外加两个外部SMT 电容。
专为大批量、成本敏感的OEM 生产而设计,易于装配并与高速SMT 装配件兼容。
2、能让罗盘航向精度精确到1°~2°。
3、产品组装后能进行低成本功能性测试。
4、适用于电池供电的应用场合。
5、带置位/复位和偏置驱动器用于消磁、自测和偏移补偿。
6、适用于消费类电子设备应用中通用双线串行数据接口。
7、符合RoHS 标准。
8、传感器能在强磁场环境中罗盘航向精度达到1°~2°。
9、可获得罗盘航向、硬磁、软磁以及自动校准库。
HMC5883导航系统
智能小车小范围导航系统李学林严小波摘要:我们的作品是以实现无线下载PC机已有的地图来完成特定的路线为目的,以完成规定地方数据的采集。
我们是以罗盘指南针来解决精确定位角度的问题。
然后测其速度,便能知道小车当前的行驶状况。
在我们的上位机程序中,以虚拟北的方式来完成对地图的描绘。
这样的方式形成了与地球北方形成了对应,绘图1°的精确度形象而现实的反应了地面的360个方向。
而下位机的导航系统与运算系统形成了与上位机的360个方向的对应。
这样形成了对地面基本全部方位的对应。
虽然由于小车机械特性造成了不能实现在1°的范围转动,但是基本上能实现对路线的绘制。
关键字:HMC5883 虚拟北大量数据传输上位机绘图导航系统Xuelinli XiaoboyanAbstract: we work with wireless download PC existing map to accomplish a specific route for the purpose to complete the specified place data collection. We took a compass a compass to solve the precise positioning Angle. Then measured the speed, can know car driving conditions current. In our PC program, the way to virtual north to finish on the map describe. This way and has formed the earth northern formed correspondence, drawing 1 ° precision image and realistic reaction to the ground 360 direction. And the lower level computer navigation system and computing system formed and superordination machine in the direction of the 360 corresponding. This forms a basic on the ground all orientation of the correspondence. Although the car mechanical properties caused cannot achieve the range in 1 ° turns, but basically can realize the rendering of route.一、背景鉴于各个领域对智能化系统的需求在不断的上升,在很多危险的领域更是不用说。
指南针罗盘方向角的计算方法
测量设备臂的方向角实现方案:MPU6050(6轴陀螺仪芯片)+HMC5883(三轴磁阻传感器)电子罗盘测向原理磁罗盘通过测量地磁场水平方向分量确定磁北极方向并推算出其他的方向。
当罗盘水平放置时,传感器坐标系的X、Y轴在水平面内,X轴位前进方向,Y轴垂直于X轴向右,Z 轴沿重力方向向下,从磁北方向沿顺时针到X轴的夹角即为方位角α。
但是实际应用中,电子罗盘并不是总处于水平位置,需要根据加速度传感器测出俯仰角和滚转角,通过坐标变换,将磁传感器测得的磁场强度分量折算到水平方向,在计算方位角。
俯仰角φ为罗盘纵轴Y与水平面之间的夹角,滚转角θ为罗盘Z轴与过X轴的铅垂面之间的夹角。
当罗盘不水平时测得的加速度g在罗盘三轴方向的分量分别为A x、A y、A z,则根据坐标关系可求得俯仰角和滚转角为:备注:MPU6050输出的数据端口为16位,当量程为±2g时,测量精度是16384LSB/g,加速度传感器输出得到的数据需要除以16384得到真正的加速度值。
16384*2=32768,32768*2=65536=2^16,MPU6050的ADC是16位的,所以不管测量范围多大,最终的输出范围都不会超过65535,所以测量范围越大,精度就越低。
假设磁阻传感器在测得罗盘坐标轴方向磁场分量分别为H x、H y、H z,则由坐标关系换算可得磁水平方向分量:利用三角函数关系可以得到方位角α:由于地磁北极与地理南北极存在磁偏角,要准确的得到南北极方向必须进行磁偏角矫正,即加上或减去当地的磁偏角得出前进方向与真正的地理北极夹角即真北方位角A,当所在地的磁偏角β已知时,真北方位角A=α+β。
HMC5883相关性能参数列表造成磁传感器的主要因素有:传感器误差和其它磁材料干扰等。
经查转换成方位角的精度为1°~2°。
各地磁偏角:漠河11°00'齐齐哈尔9°54'哈尔滨9°39'长春8°53'满洲里8°40'沈阳7°44'旅大6°35'北京5°50'天津5°30'济南5°01'呼和浩特4°36'徐州4°27'上海4°26'太原4°11'包头4°03'南京4°00'合肥3°52'郑州3°50'杭州3°50'许昌3°40'九江3°03'武汉2°54'南昌2°48'银川2°35'台北2°32'西安2°29'长沙2°14'赣州2°01'衡阳1°56'厦门1°50'兰州1°44'重庆1°34'遵义1°26'西宁1°22'桂林1°22'贵阳1°17'成都1°16'广州1°09'柳州1°08'东沙群岛1°05'昆明1°00'南宁0°50'湛江0°44'凭祥0°39'海口0°29'拉萨0°21'珠穆朗玛0°19'西沙群岛0°10'曾母暗沙0°24'(东)南沙群岛0°35'(东)乌鲁木齐2°44'(东)。
HMC5883
我有用过该产品,对于校准的含义其实很简单;就相当于把5883L的基准线转换到你所设备上的环境(Sensor所贴片的产品);目前我所见比较多的是,硬磁;修正offset的值方式如下(以X轴说明为例):第一步:是用需校准的sample平放,这样sensor会在各个轴采集到一个max 和min把其这定义为Xmax(1)和Xmin(1),其它轴类似;同时将该数据作为初始化的值;第二步:进行360degree旋转,会得到另外的Xmax(2)和Xmin(2);然后将Xmax(1)和Xmax(2)进行比较,从而选择Xmax=Xmax(1)(while the Xmax (1)>Xmax(2)),Xmin也进行同样的比较;Last:then the Xoffset:Xoffset=(Xmax(1)+Xmin(1))/2;该模块主要是考虑校正设备本身磁场的干扰,从而使测量数据更为准确。
当然这只是对于要求精度不高的情况下进行设置的;但对于高精度的话,Honeywell 应该也会给你提供一些计算方式的,这你可以询问你买产品的地方,希望上述能对你有所帮助。
2010-11-02,18:27:38资料邮件回复引用回复↑↑↓↓编辑删除【5楼】nuli 积分:23派别:等级:------ 来自:非常感谢楼主的解答!修正offset的值方式如下(以X轴说明为例):“第一步:是用需校准的sample平放,这样sensor会在各个轴采集到一个max 和min 把其这定义为Xmax(1)和Xmin(1)”是把X Y Z每个轴的max和min定义为Xmax(1)和Xmin(1)吗?是否每个轴都要旋转360度,然后将得到的MAX和MIN平均,然后实际测量时得到的值减去这个偏置?另外平放时,各轴不是只输出一个值吗,如何得到一个max 和min ?楼主是否可以发个校准部分的程序例子上来,比较容易理解。
2010-11-03,17: 04:47资料邮件回复引用回复↑↑↓↓编辑删除【6楼】回复【5楼】nuli积分:37派别:等级:------ 来自:从你所问的问题上来看,可能你还没了解Offset的计算方式,Offset其实就是一个补偿校准值,而对于补偿校准值的得出,就是通过我上一个贴所说的步骤来进行计算的;如果你能对每个轴都旋转360度的话,效果更好;而你提高的Max和Min,不是平均后的值,如果平均后那就不存在Max和Min一说,这两个值,是实际你在旋转过程中传感器所采集的数据,通过这样你就可以大概的计算出offset的值(这动作是在calibration时做),在得到offset的值后,后面你所测量的数据就用实际测量的减去offset,那才是你所测量环境的比较准确的磁场值.你可以通过设定5883L和你的MCU,“单一测量模式”确实只采集一个数据,但是“连续测量模式”就可以进行多个数据的采集,因此在calibration的时候,Honeywell datasheet上有进行说明,使用“连续测量模式”进行校准;希望上述能对你有所帮助。
3轴电子罗盘HM5883应用
1.原理图2.程序[1] 头文件1/****************************************Copyright (c)************************************************** **** ****--------------File Info-------------------------------------------------------------------------------** File name: 24C02.h** Descriptions: 24C02 操作函数库****------------------------------------------------------------------------------------------------------** Created by: A VRman** Created date: 2010-10-29** V ersion: 1.0** Descriptions: The original version****------------------------------------------------------------------------------------------------------** Modified by:** Modified date:** V ersion:** Descriptions:********************************************************************************************************/ #ifndef __HMC5883L_H#define __HMC5883L_H/* Includes ------------------------------------------------------------------*/#include "stm32f10x_lib.h"#include "GrobalV ariable.h"/* Private define ------------------------------------------------------------*/#define A T24C01A /* 24C01A,I2C时序和往后的24C02一样*///#define A T24C01 /* 24C01,I2C的时序和普通的有点不同*/#define ADDR_24LC02 0xA0#define I2C_P AGESIZE 4 /* 24C01/01A页缓冲是4个*//* Private function prototypes -----------------------------------------------*/void I2C_Configuration(void);u8 I2C_Read(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num);u8 I2C_Write(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num);///void HMC5883L_test(void);void Axia3AngInit(void) ;void Detect3AxiaAng(void);#endif/********************************************************************************************************* END FILE*********************************************************************************************************/ [2] 头文件2/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************* File Name : stm32f10x_i2c.h* Author : MCD Application T eam* V ersion : V2.0.1* Date : 06/13/2008* Description : This file contains all the functions prototypes for the* I2C firmware library.********************************************************************************* THE PRESENT FIRMW ARE WHICH IS FOR GUIDANCE ONL Y AIMS A T PROVIDING CUSTOMERS* WITH CODING INFORMA TION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SA VE TIME.* AS A RESUL T, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE* CONTENT OF SUCH FIRMW ARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING* INFORMA TION CONT AINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.*******************************************************************************//* Define to prevent recursive inclusion -------------------------------------*/#ifndef __STM32F10x_I2C_H#define __STM32F10x_I2C_H/* Includes ------------------------------------------------------------------*/#include "stm32f10x_map.h"/* Exported types ------------------------------------------------------------*//* I2C Init structure definition */typedef struct{u16 I2C_Mode;u16 I2C_DutyCycle;u16 I2C_OwnAddress1;u16 I2C_Ack;u16 I2C_AcknowledgedAddress;u32 I2C_ClockSpeed;}I2C_InitTypeDef;/* Exported constants --------------------------------------------------------*/#define IS_I2C_ALL_PERIPH(PERIPH) (((*(u32*)&(PERIPH)) == I2C1_BASE) || \((*(u32*)&(PERIPH)) == I2C2_BASE))/* I2C modes */#define I2C_Mode_I2C ((u16)0x0000)#define I2C_Mode_SMBusDevice ((u16)0x0002)#define I2C_Mode_SMBusHost ((u16)0x000A)#define IS_I2C_MODE(MODE) (((MODE) == I2C_Mode_I2C) || \((MODE) == I2C_Mode_SMBusDevice) || \((MODE) == I2C_Mode_SMBusHost))/* I2C duty cycle in fast mode */#define I2C_DutyCycle_16_9 ((u16)0x4000)#define I2C_DutyCycle_2 ((u16)0xBFFF)#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DutyCycle_16_9) || \((CYCLE) == I2C_DutyCycle_2))/* I2C cknowledgementy */#define I2C_Ack_Enable ((u16)0x0400)#define I2C_Ack_Disable ((u16)0x0000)#define IS_I2C_ACK_ST A TE(ST A TE) (((ST A TE) == I2C_Ack_Enable) || \((ST A TE) == I2C_Ack_Disable))/* I2C transfer direction */#define I2C_Direction_Transmitter ((u8)0x00)#define I2C_Direction_Receiver ((u8)0x01)#define IS_I2C_DIRECTION(DIRECTION) (((DIRECTION) == I2C_Direction_Transmitter) || \((DIRECTION) == I2C_Direction_Receiver))/* I2C acknowledged address defines */#define I2C_AcknowledgedAddress_7bit ((u16)0x4000)#define I2C_AcknowledgedAddress_10bit ((u16)0xC000)#define IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) (((ADDRESS) == I2C_AcknowledgedAddress_7bit) || \((ADDRESS) == I2C_AcknowledgedAddress_10bit))/* I2C registers */#define I2C_Register_CR1 ((u8)0x00)#define I2C_Register_CR2 ((u8)0x04)#define I2C_Register_OAR1 ((u8)0x08)#define I2C_Register_OAR2 ((u8)0x0C)#define I2C_Register_DR ((u8)0x10)#define I2C_Register_SR1 ((u8)0x14)#define I2C_Register_SR2 ((u8)0x18)#define I2C_Register_CCR ((u8)0x1C)#define I2C_Register_TRISE ((u8)0x20)#define IS_I2C_REGISTER(REGISTER) (((REGISTER) == I2C_Register_CR1) || \((REGISTER) == I2C_Register_CR2) || \((REGISTER) == I2C_Register_OAR1) || \((REGISTER) == I2C_Register_OAR2) || \((REGISTER) == I2C_Register_DR) || \((REGISTER) == I2C_Register_SR1) || \((REGISTER) == I2C_Register_SR2) || \((REGISTER) == I2C_Register_CCR) || \((REGISTER) == I2C_Register_TRISE))/* I2C SMBus alert pin level */#define I2C_SMBusAlert_Low ((u16)0x2000)#define I2C_SMBusAlert_High ((u16)0xDFFF)#define IS_I2C_SMBUS_ALERT(ALERT) (((ALERT) == I2C_SMBusAlert_Low) || \((ALERT) == I2C_SMBusAlert_High))/* I2C PEC position */#define I2C_PECPosition_Next ((u16)0x0800)#define I2C_PECPosition_Current ((u16)0xF7FF)#define IS_I2C_PEC_POSITION(POSITION) (((POSITION) == I2C_PECPosition_Next) || \((POSITION) == I2C_PECPosition_Current))/* I2C interrupts definition */#define I2C_IT_BUF ((u16)0x0400)#define I2C_IT_EVT ((u16)0x0200)#define I2C_IT_ERR ((u16)0x0100)#define IS_I2C_CONFIG_IT(IT) ((((IT) & (u16)0xF8FF) == 0x00) && ((IT) != 0x00))/* I2C interrupts definition */#define I2C_IT_SMBALERT ((u32)0x10008000)#define I2C_IT_TIMEOUT ((u32)0x10004000)#define I2C_IT_PECERR ((u32)0x10001000)#define I2C_IT_OVR ((u32)0x10000800)#define I2C_IT_AF ((u32)0x10000400)#define I2C_IT_ARLO ((u32)0x10000200)#define I2C_IT_BERR ((u32)0x10000100)#define I2C_IT_TXE ((u32)0x00000080)#define I2C_IT_RXNE ((u32)0x00000040)#define I2C_IT_STOPF ((u32)0x60000010)#define I2C_IT_ADD10 ((u32)0x20000008)#define I2C_IT_BTF ((u32)0x60000004)#define I2C_IT_ADDR ((u32)0xA0000002)#define I2C_IT_SB ((u32)0x20000001)#define IS_I2C_CLEAR_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_STOPF) || \((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB))#define IS_I2C_GET_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_TXE) || \((IT) == I2C_IT_RXNE) || ((IT) == I2C_IT_STOPF) || \((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB))/* I2C flags definition */#define I2C_FLAG_DUALF ((u32)0x00800000)#define I2C_FLAG_SMBHOST ((u32)0x00400000)#define I2C_FLAG_SMBDEF AUL T ((u32)0x00200000)#define I2C_FLAG_GENCALL ((u32)0x00100000)#define I2C_FLAG_TRA ((u32)0x00040000)#define I2C_FLAG_BUSY ((u32)0x00020000)#define I2C_FLAG_MSL ((u32)0x00010000)#define I2C_FLAG_SMBALERT ((u32)0x10008000)#define I2C_FLAG_TIMEOUT ((u32)0x10004000)#define I2C_FLAG_PECERR ((u32)0x10001000)#define I2C_FLAG_OVR ((u32)0x10000800)#define I2C_FLAG_AF ((u32)0x10000400)#define I2C_FLAG_ARLO ((u32)0x10000200)#define I2C_FLAG_BERR ((u32)0x10000100)#define I2C_FLAG_TXE ((u32)0x00000080)#define I2C_FLAG_RXNE ((u32)0x00000040)#define I2C_FLAG_STOPF ((u32)0x60000010)#define I2C_FLAG_ADD10 ((u32)0x20000008)#define I2C_FLAG_BTF ((u32)0x60000004)#define I2C_FLAG_ADDR ((u32)0xA0000002)#define I2C_FLAG_SB ((u32)0x20000001)#define IS_I2C_CLEAR_FLAG(FLAG) (((FLAG) == I2C_FLAG_SMBALERT) || ((FLAG) == I2C_FLAG_TIMEOUT) || \((FLAG) == I2C_FLAG_PECERR) || ((FLAG) == I2C_FLAG_OVR) || \((FLAG) == I2C_FLAG_AF) || ((FLAG) == I2C_FLAG_ARLO) || \((FLAG) == I2C_FLAG_BERR) || ((FLAG) == I2C_FLAG_STOPF) || \((FLAG) == I2C_FLAG_ADD10) || ((FLAG) == I2C_FLAG_BTF) || \((FLAG) == I2C_FLAG_ADDR) || ((FLAG) == I2C_FLAG_SB))#define IS_I2C_GET_FLAG(FLAG) (((FLAG) == I2C_FLAG_DUALF) || ((FLAG) == I2C_FLAG_SMBHOST) || \((FLAG) == I2C_FLAG_SMBDEF AUL T) || ((FLAG) == I2C_FLAG_GENCALL) || \((FLAG) == I2C_FLAG_TRA) || ((FLAG) == I2C_FLAG_BUSY) || \((FLAG) == I2C_FLAG_MSL) || ((FLAG) == I2C_FLAG_SMBALERT) || \((FLAG) == I2C_FLAG_TIMEOUT) || ((FLAG) == I2C_FLAG_PECERR) || \((FLAG) == I2C_FLAG_OVR) || ((FLAG) == I2C_FLAG_AF) || \((FLAG) == I2C_FLAG_ARLO) || ((FLAG) == I2C_FLAG_BERR) || \((FLAG) == I2C_FLAG_TXE) || ((FLAG) == I2C_FLAG_RXNE) || \((FLAG) == I2C_FLAG_STOPF) || ((FLAG) == I2C_FLAG_ADD10) || \((FLAG) == I2C_FLAG_BTF) || ((FLAG) == I2C_FLAG_ADDR) || \((FLAG) == I2C_FLAG_SB))/* I2C Events *//* EV1 */#define I2C_EVENT_SLA VE_TRANSMITTER_ADDRESS_MA TCHED ((u32)0x00060082) /* TRA, BUSY, TXE and ADDR flags */#define I2C_EVENT_SLA VE_RECEIVER_ADDRESS_MA TCHED ((u32)0x00020002) /* BUSY and ADDR flags */#define I2C_EVENT_SLA VE_TRANSMITTER_SECONDADDRESS_MA TCHED ((u32)0x00860080) /* DUALF, TRA, BUSY and TXE flags */#define I2C_EVENT_SLA VE_RECEIVER_SECONDADDRESS_MA TCHED ((u32)0x00820000) /* DUALF and BUSY flags */#define I2C_EVENT_SLA VE_GENERALCALLADDRESS_MA TCHED ((u32)0x00120000) /* GENCALL and BUSY flags *//* EV2 */#define I2C_EVENT_SLA VE_BYTE_RECEIVED ((u32)0x00020040) /* BUSY and RXNE flags *//* EV3 */#define I2C_EVENT_SLA VE_BYTE_TRANSMITTED ((u32)0x00060084) /* TRA, BUSY, TXE and BTF flags *//* EV4 */#define I2C_EVENT_SLA VE_STOP_DETECTED ((u32)0x00000010) /* STOPF flag *//* EV5 */#define I2C_EVENT_MASTER_MODE_SELECT ((u32)0x00030001) /* BUSY, MSL and SB flag *//* EV6 */#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((u32)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((u32)0x00030002) /* BUSY, MSL and ADDR flags *//* EV7 */#define I2C_EVENT_MASTER_BYTE_RECEIVED ((u32)0x00030040) /* BUSY, MSL and RXNE flags *//* EV8 */#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((u32)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags *//* EV9 */#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((u32)0x00030008) /* BUSY, MSL and ADD10 flags *//* EV3_2 */#define I2C_EVENT_SLA VE_ACK_F AILURE ((u32)0x00000400) /* AF flag */#define IS_I2C_EVENT(EVENT) (((EVENT) == I2C_EVENT_SLA VE_TRANSMITTER_ADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_RECEIVER_ADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_TRANSMITTER_SECONDADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_RECEIVER_SECONDADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_GENERALCALLADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_BYTE_RECEIVED) || \((EVENT) == (I2C_EVENT_SLA VE_BYTE_RECEIVED | I2C_FLAG_DUALF)) || \((EVENT) == (I2C_EVENT_SLA VE_BYTE_RECEIVED | I2C_FLAG_GENCALL)) || \((EVENT) == I2C_EVENT_SLA VE_BYTE_TRANSMITTED) || \((EVENT) == (I2C_EVENT_SLA VE_BYTE_TRANSMITTED | I2C_FLAG_DUALF)) || \((EVENT) == (I2C_EVENT_SLA VE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL)) || \((EVENT) == I2C_EVENT_SLA VE_STOP_DETECTED) || \((EVENT) == I2C_EVENT_MASTER_MODE_SELECT) || \((EVENT) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) || \((EVENT) == I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) || \((EVENT) == I2C_EVENT_MASTER_BYTE_RECEIVED) || \((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTED) || \((EVENT) == I2C_EVENT_MASTER_MODE_ADDRESS10) || \((EVENT) == I2C_EVENT_SLA VE_ACK_F AILURE))/* I2C own address1 -----------------------------------------------------------*/#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x3FF)/* I2C clock speed ------------------------------------------------------------*/#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) >= 0x1) && ((SPEED) <= 400000))/* Exported macro ------------------------------------------------------------*//* Exported functions ------------------------------------------------------- */void I2C_DeInit(I2C_TypeDef* I2Cx);void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct);void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct);void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_GenerateST ART(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_GenerateSTOP(I2C_T ypeDef* I2Cx, FunctionalState NewState);void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, u8 Address);void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_ITConfig(I2C_TypeDef* I2Cx, u16 I2C_IT, FunctionalState NewState);void I2C_SendData(I2C_TypeDef* I2Cx, u8 Data);u8 I2C_ReceiveData(I2C_TypeDef* I2Cx);void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, u8 Address, u8 I2C_Direction);u16 I2C_ReadRegister(I2C_TypeDef* I2Cx, u8 I2C_Register);void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, u16 I2C_SMBusAlert);void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, u16 I2C_PECPosition);void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState);u8 I2C_GetPEC(I2C_TypeDef* I2Cx);void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, u16 I2C_DutyCycle);u32 I2C_GetLastEvent(I2C_TypeDef* I2Cx);ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, u32 I2C_EVENT);FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, u32 I2C_FLAG);void I2C_ClearFlag(I2C_TypeDef* I2Cx, u32 I2C_FLAG);ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, u32 I2C_IT);void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, u32 I2C_IT);#endif /*__STM32F10x_I2C_H *//******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/[3] 源文件1/****************************************Copyright (c)****************************************************** ****--------------File Info-------------------------------------------------------------------------------** File name: 24C02.c** Descriptions: 24C02 操作函数库****------------------------------------------------------------------------------------------------------** Created by: A VRman** Created date: 2010-10-29** V ersion: 1.0** Descriptions: The original version****------------------------------------------------------------------------------------------------------** Modified by:** Modified date:** V ersion:** Descriptions:********************************************************************************************************//* Includes ------------------------------------------------------------------*/#include "HMC5883L.h"#include "Grobalfunction.h"/******************************************************************************** Function Name : I2C_Configuration* Description : EEPROM管脚配置* Input : None* Output : None* Return : None* Attention : None*******************************************************************************/void I2C_Configuration(void){I2C_InitTypeDef I2C_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);/* Configure I2C1 pins: PB6->SCL and PB7->SDA */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;///6,7->8,9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_Init(GPIOB, &GPIO_InitStructure);I2C_DeInit(I2C1);I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 = 0x30;I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100K速度*/I2C_Cmd(I2C1, ENABLE);I2C_Init(I2C1, &I2C_InitStructure);/*允许1字节1应答模式*/I2C_AcknowledgeConfig(I2C1, ENABLE);}/******************************************************************************* * Function Name : I2C_delay* Description : 延迟时间* Input : None* Output : None* Return : None* Attention : None*******************************************************************************/ static void I2C_delay(u16 cnt){while(cnt--);}/******************************************************************************* * Function Name : I2C_AcknowledgePolling* Description : 等待获取I2C总线控制权判断忙状态* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* Output : None* Return : None* Attention : None*******************************************************************************/ static void I2C_AcknowledgePolling(I2C_TypeDef *I2Cx,u8 I2C_Addr){vu16 SR1_Tmp;do{I2C_GenerateST ART(I2Cx, ENABLE); /*起始位*//*读SR1*/SR1_Tmp = I2C_ReadRegister(I2Cx, I2C_Register_SR1);/*器件地址(写)*/#ifdef A T24C01AI2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);#elseI2C_Send7bitAddress(I2Cx, 0, I2C_Direction_Transmitter);#endif}while(!(I2C_ReadRegister(I2Cx, I2C_Register_SR1) & 0x0002));I2C_ClearFlag(I2Cx, I2C_FLAG_AF);I2C_GenerateSTOP(I2Cx, ENABLE); /*停止位*/}/******************************************************************************** Function Name : I2C_Read* Description : 通过指定I2C接口读取多个字节数据* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预读取字节存储位置* - *buf:读取数据的存储位置* - num:读取字节数* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/u8 I2C_Read(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num){///u16 angle;if(num==0)return 1;while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));/*允许1字节1应答模式*/I2C_AcknowledgeConfig(I2Cx, ENABLE);/* 发送起始位*/I2C_GenerateST ART(I2Cx, ENABLE);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*////#ifdef A T24C01A/*发送器件地址(写)*/I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));/*发送地址*/I2C_SendData(I2Cx, addr);while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*数据已发送*/ /*起始位*/I2C_GenerateST ART(I2Cx, ENABLE);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));/*器件读*/I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);/// while(1);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));///#else/*发送器件地址(读)24C01*//// I2C_Send7bitAddress(I2Cx, addr<<1, I2C_Direction_Receiver);/// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));///#endifwhile (num){if(num==1){I2C_AcknowledgeConfig(I2Cx, DISABLE); /* 最后一位后要关闭应答的*/ I2C_GenerateSTOP(I2Cx, ENABLE); /* 发送停止位*/return 0;}/*器件读*//// I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */*buf = I2C_ReceiveData(I2Cx);buf++;/* Decrement the read bytes counter */num--;/// I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);/// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));}/* 再次允许应答模式*/I2C_AcknowledgeConfig(I2Cx, ENABLE);return 0;}/******************************************************************************** Function Name : I2C_WriteOneByte* Description : 通过指定I2C接口写入一个字节数据* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预写入字节地址* - value:写入数据* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/u8 I2C_WriteOneByte(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 value){/* 起始位*/I2C_GenerateST ART(I2Cx, ENABLE);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));///#ifdef A T24C01A/* 发送器件地址(写)*/I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));/*发送地址*/I2C_SendData(I2Cx, addr);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));///#else/// I2C_Send7bitAddress(I2Cx, addr<<1, I2C_Direction_Transmitter);/// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); ///#endif/* 写一个字节*/I2C_SendData(I2Cx, value);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/* 停止位*/I2C_GenerateSTOP(I2Cx, ENABLE);I2C_AcknowledgePolling(I2Cx,I2C_Addr);I2C_delay(1000);return 0;}/******************************************************************************** Function Name : I2C_Write* Description : 通过指定I2C接口写入多个字节数据* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预写入字节地址* - *buf:预写入数据存储位置* - num:写入字节数* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/u8 I2C_Write(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num){u8 err=0;while(num--){if(I2C_WriteOneByte(I2Cx, I2C_Addr,addr++,*buf++)){err++;}}if(err)return 1;elsereturn 0;}//初始化HMC5883,根据需要请参考pdf进行修改****void Init_HMC5883(){///Single_Write_HMC5883(0x02,0x00); //I2C_WriteOneByte(I2C1,0x3c,0x02,0);}/************************************************************************************************************/ /******************************************************************************** Function Name : void Axia3AngInit(void).* Description : Read 3 axia angle data from HMC5883 then process the data.* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预写入字节地址* - value:写入数据* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/void Axia3AngInit(void){I2C_Configuration();Init_HMC5883();}/************************************************************************************************************//************************************************************************************************************/ /******************************************************************************** Function Name : Detect3AxiaAng();* Description : Read 3 axia angle data from HMC5883 then process the data.* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预写入字节地址* - value:写入数据* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/void Detect3AxiaAng(void){I2C_Read(I2C1,0x3C,0x03,BUF,7);//Axia3Ang_x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output registerAxia3Ang_z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output registerAxia3Ang_y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register/*//Get float dataAxia3Ang_xF=Axia3Ang_x*0.0 BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output registerAxia3Ang_zF=Axia3Ang_x* BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output registerAxia3Ang_yF=Axia3Ang_x* BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register// delay_ms(500);*/}//*********************************************************//主程序********//*********************************************************void HMC5883L_test(void ){ // bit sign_bit;///unsigned int i;///int x,y,z;///double angle;I2C_Configuration();Init_HMC5883();while(1) //循环{///// Multiple_Read_HMC5883(); //连续读出数据,存储在BUF中///loop1:I2C_Read(I2C1,0x3C,0x03,BUF,7);////---------显示X轴delay_ms(10);/// goto loop1;/// while(1);Axia3Ang_x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output registerAxia3Ang_z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output registerAxia3Ang_y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output registerdelay_ms(500);/// angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees/// angle*=10;///conversion(angle); //计算数据和显示///for (i=0;i<10000;i++); //延时}}/********************************************************************************************************* END FILE*********************************************************************************************************/[4] 源文件4/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************* File Name : stm32f10x_i2c.c* Author : MCD Application T eam* V ersion : V2.0.1* Date : 06/13/2008* Description : This file provides all the I2C firmware functions.********************************************************************************* THE PRESENT FIRMW ARE WHICH IS FOR GUIDANCE ONL Y AIMS A T PROVIDING CUSTOMERS* WITH CODING INFORMA TION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SA VE TIME. * AS A RESUL T, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE * CONTENT OF SUCH FIRMW ARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING* INFORMA TION CONT AINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.*******************************************************************************//* Includes ------------------------------------------------------------------*/#include "stm32f10x_i2c.h"#include "stm32f10x_rcc.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//* I2C SPE mask */#define CR1_PE_Set ((u16)0x0001)#define CR1_PE_Reset ((u16)0xFFFE)/* I2C ST ART mask */#define CR1_ST ART_Set ((u16)0x0100)#define CR1_ST ART_Reset ((u16)0xFEFF)/* I2C STOP mask */#define CR1_STOP_Set ((u16)0x0200)#define CR1_STOP_Reset ((u16)0xFDFF)/* I2C ACK mask */#define CR1_ACK_Set ((u16)0x0400)#define CR1_ACK_Reset ((u16)0xFBFF)/* I2C ENGC mask */#define CR1_ENGC_Set ((u16)0x0040)#define CR1_ENGC_Reset ((u16)0xFFBF)/* I2C SWRST mask */#define CR1_SWRST_Set ((u16)0x8000)#define CR1_SWRST_Reset ((u16)0x7FFF)/* I2C PEC mask */#define CR1_PEC_Set ((u16)0x1000)#define CR1_PEC_Reset ((u16)0xEFFF)/* I2C ENPEC mask */#define CR1_ENPEC_Set ((u16)0x0020)#define CR1_ENPEC_Reset ((u16)0xFFDF)/* I2C ENARP mask */#define CR1_ENARP_Set ((u16)0x0010)#define CR1_ENARP_Reset ((u16)0xFFEF)/* I2C NOSTRETCH mask */#define CR1_NOSTRETCH_Set ((u16)0x0080)。
HMC5883资料整理
HMC5883L3轴数字罗盘IC--采用霍尼韦尔各向异性磁阻(AMR)技术物质在磁场中电阻率发生变化的现象称为磁阻效应,磁阻传感器利用磁阻效应制成。
磁场的测量可利用电磁效应,霍尔效应,磁阻效应等各种效应。
其中磁阻效应法发展最快,测量灵敏度最高。
磁阻传感器可用于直接测量磁场或磁场变化,如弱磁场测量,地磁场测量,各种导航系统中的罗盘,计算机中的磁盘驱动器,各种磁卡机等等。
也可以通过磁场变化测量其他物理量,如利用磁阻效应已制成各种位移、角度、转速传感器,各种接近开关,隔离开关,广泛用于汽车、家电及各类需要自动检测与控制的领域。
磁阻元件的发展经历了半导体磁阻(MR),各向异性磁阻(AMR),巨磁阻(GMR),庞磁阻(CMR)等阶段。
各向异性磁阻传感器AMR(Anisotropic Magneto-Resistive sensors)由沉积在硅片上的坡莫合金薄膜形成电阻,沉积时外加磁场,形成易磁化轴方向。
铁磁材料的电阻与电流方向和磁化方向的夹角有关,电流与磁化方向平行是电阻Rmax最大,电流与磁化方向垂直是电阻Rmin最小,电流与磁化方向成θ角时,电阻可表示为:在磁阻传感器中,为消除温度等外界因素对输出的影响,有4个相同的磁阻元件构成惠斯通电桥。
AMR各向异性磁电阻效应指铁磁金属或合金中,磁场平行电流和垂直电流方向电阻率发生变化的效应。
AMR各向异性传感器的基本单元是用一种长而薄的坡莫(Ni-Fe)合金用半导体工艺沉积在以硅衬底上制成的,沉积的时候薄膜以条带的形式排布,形成一个平面的线阵以增加磁阻的感知磁场的面积。
外加磁场使得磁阻内部的磁畴指向发生变化,进而与电流的夹角θ发生变化,就表现为磁阻电阻各向异性的变化。
(1)服从式(1)中:Rmin为电流方向与磁化方向垂直时的电阻值;Rmax为电流方向与磁化方向平行时的电流值。
从图1可以清楚地看到,当电流方向与磁化方向平行时,传感器最敏感。
而一般磁阻都工作于图中45°线性区附近,这样可以实现输出的线性特性。
5883l翻译
3轴电子罗盘ICHMC5883L霍尼韦尔HMC5883L是一种表面贴装,拥有多芯片模块的低场设计的磁感应与数字接口,可应用于低成本的罗盘和磁学。
该HMC5883L包括我们国家的最先进的高精度HMC118X系列磁阻传感器以及一个专用放大集成电路,自动消磁,偏移取消,以及一个12位ADC,使罗盘航向精确度达到1°〜2 °。
Iic串行总线是一种简便接口。
该HMC5883L是3.0x3.0x0.9mm表面贴装16引脚无引线芯片载体(LCC)的。
HMC5883L的应用领域包括移动手机、上网本、消费电子、自动导航系统以及个人导航装置。
该HMC5883L采用霍尼韦尔各向异性磁阻(AMR)技术,带技术在磁传感器领域处于领先地位。
这种各向异性,方向传感器具有高轴向灵敏度和线性度。
这些传感器的固态与极低的交叉轴灵敏度建设,是用来衡量的方向和地球的磁场强度从毫高斯8高斯。
霍尼韦尔的磁传感器是最敏感和可靠的低磁场在工业中的传感器。
特征:1.3轴和磁阻传感器, 3.0x3.0x0.9mm LCC的表面ASIC封装2.12位ADC并且具有低噪声各向异性磁阻传感器实现5毫高斯灵敏度,量程± 8高斯磁场3.内建自测试功能4.低电压(2.16-3.6V)低功耗(100微安)5.内置式皮带驱动电路6.Iic数字接口7.无铅封装8.宽量程(正负8高斯)9.可用的软件和算法支持10.最大160赫兹的数据输出率优点:1.小尺寸高集成度产品。
大批量生产只需添加微控制器接口、两个贴片电容,低成本OEM封装,易于安装,适合高速SMT组装2.达到1 °-2 °度罗盘航向精度3.发布会后允许低功耗功能测试4.适用于电池供电的装置5.设置/复位和偏移消磁,自我测试带驱动程序,偏移补偿6.大众化的两线串行数据接口的消费电子产品7.RoHS认证8.传感器在强磁场的环境下可达到1 °-2 °度罗盘航向精度9.罗盘指向,软硬件和自动校准库10.行人导航和LBS应用规格:表1 :引脚配置箭头指示的方向,产生磁场,在正常的测量配置输出读数。
三维磁阻式电子罗盘的设计与实现
三维磁阻式电子罗盘的设计与实现
张玮;王冬青
【期刊名称】《工业控制计算机》
【年(卷),期】2014(027)003
【摘要】所设计的三维磁阻式电子罗盘的硬件方面是由三维磁阻传感器
HMC58831(深圳市凡高科技有限公司)、三维加速度传感器ADXL345B(深圳市创联发科技有限公司)以及微处理器MCU LPC1114FBD48(NXP公司)所组成,来测定系统的航向角、俯仰角和翻滚角.软件方面,通过对误差来源的分析,提出了椭圆拟合误差校正方法,来消除影响罗盘测量精度的误差,实现了高精度、运行稳定的三维电子罗盘.
【总页数】2页(P119-120)
【作者】张玮;王冬青
【作者单位】青岛大学自动化工程学院控制科学与工程,山东青岛266001;青岛大学自动化工程学院控制科学与工程,山东青岛266001
【正文语种】中文
【相关文献】
1.基于隧道磁阻传感器的三维电子罗盘设计∗ [J], 王琪;李孟委;王增跃;蒋孝勇;李锡广
2.一种磁阻式电子罗盘测试和标定方法研究 [J], 陈瑜;张铁民;彭孝东
3.三维磁阻式电子罗盘的研制 [J], 朱荣华;林新华;孔德义;梅涛
4.微型磁阻式电子罗盘的设计及罗差补偿方法的研究 [J], 崔瑞芬;常佶
5.基于HMC1022磁阻传感器的数字电子罗盘的设计与实现 [J], 王丽颖;支炜;孙红霞;张伟
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
支。 正常工作模式 中的串 口接 收 GP S数据放在 串口中断中处
定 。 芯 片 功耗 低 , 作 电流仅 5 0 A。 x x .5 该 工 0 6 6 1 mm 的 QF 4 N
封 装 ,适 用 于 电池 供 电 的 手持 设备 。图 中芯 片 S E P引 脚 为 LE
休 眠 控 制 端 ,低 电平 休 眠 , 此 时 消耗 电流 仅 为 3_ 。GS 、 p a 1 GS 2为灵 敏 度 选 择 ,共 有 4个 量 程 可 选 择(.g2/g6 ) 1 /g4 /g。输 5
3 o 【r ( 6 - ac 劬 )× 8 H ] 0 1
x > O, r > 0
( )控 制 器 模 块 2
控 制 器 采 用 MS 4 0 1 9 P 3F 4 ,它 是 一 款 1 6位 高 性 能 、超 低 功 耗 MC U, 工 作 电压 1 ~ . . 36 在 1 z 时钟 下 ,工 作 8 V, MH 电流 为 01' 0 A。大 多数 指 令 可 以单 时 钟 周 期 执 行 ,具 有 .- 0 “ " 4
区磁 偏 角 已知 时 ,真 北 方 位 角 为 :
A= + () 4
三 、 电子 罗盘 系 统 设 计 1 、硬 件 设 计 电子 罗 盘 硬 件 系 统 设 计 如 图 2所 示 ,该 电子 罗 盘 主要 由
传感器 、 控制器 、电源 、G S模块及显 示输 出 5个部分组成 。 P () 1 传感器模块 传感器模块 由磁 阻传感器和加速度传感器组成 。 磁阻传感器 电路 如图 3所示 ,图中 H 5 8 MC 8 3为数字接 口三轴磁阻传 感器 ,内置 ASC放大器 ,1 A D转换器, I 2位 /
出端 l.电阻和 00 电容构成 R k Q .1 C滤波 电路 , 出的模拟 输
加 速 度 信 号经 滤波 后送 入 控 制 器 片 上 A D 转 换 器 采 集 量 化 。 /
≯ 0赣 谨 F 黪 eat e ur
提 供 精 确 的 偏 角 信 息 ,便 于 罗 盘 集 成 到 其 他 测 试 设 备 中 。 显 示 电路 如 图 5 示 , 用 串行 通 信 接 口的 8 x 8点 阵 L D 液 所 采 44 C 晶模 块 L H7 6 。该 L D 晶 片 上 绑 定 了驱 动 芯 片 ,体 积 小 、 P 36 C 工作 电压 低 , 工 作 电流 低 于 2 0 A,且 具 有 掉 电模 式 , 非 常 0 适 合 于 电池 供 电 的 便 携 式 通 信 设 备 和 测 试 设 备 。
系 统 电源 部 分采 用 4 V 锂 电池 供 电 , . 2 由低 压 差 稳 压 器 件
H 73 T 3 3转 换 成 所 需 33 电源 。 . V 2 软 件 设 计 、
控 制 软 件 用 C语 言 编 写 ,便 于 阅读 和 今 后 移 植 ,且 采 用 模 块 化 设计 , 方 便 调 试 。软 件 功 能 主 要 包 括 初 始 化 、A D 转 / 换 、数 据 采 集 、 方 向角 计 算 、补 偿 校 正 以及 显 示 输 出 等 ,软 件处理流程 如图 6 示 。 所
。
,
l0 鐾
霆
{
胡 宁博
李
Pr oduc s Fea ur t t e
特 写
{:s—H  ̄0 ’㈤ I on o Hs0:c H xo o s+s s r i n x ci i n =  ̄ 0 一
利 用 三 角 函 数 关 系 可求 得 方 位 角 为 :
1 2 线 输 出 。采 用 4 4 1 mm 的 L C 封装 ,体积 小 、精 度 C总 x x. 3 C
高、 成本低廉 、 使用方便 。 5 为 1 R、 0 C总线上拉 电阻 , D DR Y
为 数 据准 备好 中 断 ,接 控 制 器 中断 输 入 口。 电 容 C2 1 、C1加 4 上传 感器 片上 ASC 电路 中的 H 电桥 驱 动 电路 可 以产 生 电流 I .
息 ,根 据 经 纬 度 信 息 查 表 得 到 当地 的 磁 偏 角 ,最 终 计 算 得 到
H )× r 】 [rt ( ac n 爿 a
H <0
的方 向及 角 度 显 示 在 液 晶 屏 上 , 同 时通 过 串 口 2输 出 ,可 供 其它测量系统使用。 () 示 输 出模 块 3显 显 示 输 出部 分 包 括 串 口输 出 和 液 晶 显 示 。其 中 串 口输 出
统一 的中断管理 ,片上外 围模块丰富 ,片 内有精密硬件乘法
器 、1 的 1 4路 2位 A D 转 换 器 、两 路 U A / S RT通 信 端 口等 资
1[n )8H 0 。 8a ( 】0 x, 。r ̄ × > 一t cn 1 a
一
源。 在本设计 中控制器 串 口 1 接收 GP S信号 以获取经纬度信
9 0
H x= o, Y< 0 H H = 0, y > 0 H
27 0
由于 地 磁 南 北 极 与 地 理 南 北 极存 在 磁 偏 角 ,要 得 到 准 确 的南北极方向, 必须 用 计 算 结 果 加 上 或 减 去 所在 地 区磁 偏 角 ,
得出前进 方向与地理北极的夹角即真北方位 角 。当所在地
脉冲 ,使片上 的置位/ 复位电流带产 生磁Байду номын сангаас给传感器去磁和极
性翻 转 。 加 速 度 传 感 器 电路 如 图 4所 示 , 以低 成 本 微 型 电容 式 加 速 度传 感 器 芯 片 MMA76 QT为 核 心 , 传 感 器 采 用 了信 号 20 该
调理 、单 极 低 通 滤 波 器 和 温 度 补 偿 技 术 , 灵 敏 度 高 、 性 能稳