HMC 5883L中文数据手册_已解锁
HMC5883L中文规格书
该装置必须符合I2C-Bus Specification(I2C-总线技术规格标准),文件号为:9398 393 40011。作为一 个I2C 兼容装置,该装置包含一个7-bit串行地址,并支持I2C 协议。这一装置可以支持标准和快速模式,分 别为100kHz 和 400kHz,但不支持高速模式(Hs)。还需要外接电阻才能支持这些标准和快速模式。
► 无引线封装结构
► 符合 RoHS 标准
► 磁场范围广(+/-8Oe)
► 传感器能在强磁场环境中罗盘航向精度达到 1°~2°
► 有相应软件及算法支持
► 可获得罗盘航向、硬磁、软磁以及自动校准库
► 最大输出频率可达160Hz
► 能应用于个人导航系统和LBS
HMC 5583L
技术规格 (*在25°C时的测试,另有说明除外)
+8
高斯(gauss)
±8
高斯
0.1
±%满量程
毫高斯
µs
ppm
%FS/Gauss
75
Hz
160
Hz
us
ms
%
hex(十六进制) hex(十六进制) hex(十六进制)
400
kHz
0.2*VDDIO 0.8*VDDIO
±1.16 ±1.08
510
V V 高斯
LSb
2000
V
750
V
-30
85
ºC
-40
内部示意图
HMC5883L
上海:Tel:021-62370237 北京:Tel:010-84583280 广州: Tel:020-84101800 香港:Tel:00852-29536412
HMC5883L常见问题解答
CONFIDENTIAL | Navigation Hong Kong Limited. All Rights Reserved1. HMC5843与HMC5883L 主要的区别是什么?HMC5843 HMC5883L 尺寸/封装4 x 4 x 1.3mm 20-Pin LCC 3 x 3 x 0.9mm 16-Pin LCC 分辨率7 mGauss 2 mGauss 磁场范围±6 Guass ±8 Guass 增益设置 1620至2820Counts/Guass1370至230Counts/Gauss 输出数据寄存器顺序Xm, XI, Ym, YI, Zm, ZI Ym, YI, Zm, ZI, Xm, XI 2. 使用HMC5883L 能不能不用加速度传感器就能计算出航向?是的,不用加速度传感器就可以计算出航向。
但是,传感器必须保证是水平的,也就是,俯仰角与滚转角都为零。
这样,在水平面上的的三个轴中只有两个会被用到。
3. 如何通过软件设置来识别板上应用的传感器是为HMC5843还是HMC5883L?我们不能通过其相同的识别寄存次来识别传感器的类型,但是可以通过下述方式进行识别:1)向配置寄存器A 写入“01100000”;然后再进行读取;2)如果其反馈值还是为“01100000”,则该传感器为HMC5883L,反之.4. 为什么需要加速度传感器?如果罗盘不是水平的,就需要加速度传感器来纠正由于倾斜引起的误差。
或者,Honeywell 提供了一体化解决方案HMC6343作为另外一种选择。
HMC6343内置3轴加速度传感器,具备倾斜补偿的航向输出,封装在9×9×1.9mm 的芯片中。
5. HMC5883L Set/Reset 回路所起到的作用是什么?该回路是Honeywell 的专利设计,其在每次数据测量之前能够进行一个自动消磁的作用,以消除设备本身存在的offset ,从而实现传感器在一个“纯净”的磁场进行测试.6. 如何判定传感器的好坏?可以通过设置HMC5883L 的寄存器以启动传感器self-test 的功能从而实现对于传感器好坏的判定.7. 如果未设置self-test 模块的启动,如何判定传感器的好坏?如果未进行自测,那么可以从传感器所采集的数据来进行分析但首先要将各个轴的Gain 值进行调整测试采集,如果传感器一直所采集的数据接近为零,则说明该传感器已经损坏或者焊锡出现虚焊和假焊现象.8. 如何判定HMC5883L 在PCB 板上的位置是否可行的?析,看各轴数据的分布形状是否呈椭圆或者近似圆的分布.9.PCB layout时应该注意的方面有哪些?在传感器周围不应该有比较大的带磁物质或者通过大电流的线路,对于蜂鸣器以及含铁物件尽量保持比较远的距离.10. HMC5883L是否支持手动焊接?HMC5883L并不推荐手工焊接,如必须使用,需注意下述两方面:1)锡膏最高温度不能超过315℃,IC不能加热时间过长;2)如果IC未保持在持续的干燥环境下,那么在封装之前必须进行烘烤,因为IC对湿度比较灵敏(MSL3)建议使用最高温度为260℃的Reflow流程进行焊接。
磁阻传感器HMC5883L在车辆检测及分类中的应用
磁阻传感器HMC5883L在车辆检测及分类中的应用作者:李娣娜来源:《电子技术与软件工程》2017年第04期摘要本文采用三轴各向异性磁阻传感器HMC5883L设计了一种车辆检测与车型分类系统,针对车辆首尾相接与大型车辆的检测矛盾,利用磁阻传感器三轴磁场信息提取车辆特征信号对车辆进行分类。
该系统成本低、传感器节点小、车辆检测分类精度高,可广泛用于军事侦察及智能交通等领域的车辆检测及分类。
【关键词】HMC5883L 车辆检测车型分类1 引言目前,各国学者对磁阻传感器检测车辆的原理及相关算法进行了研究,这些研究都是基于地磁场强度垂直分量展开的,已提出的车辆检测算法均没有考虑大型车辆被判为多辆车与车辆漏检的情况对最终车辆检测数量的相互弥补,而本文要在车辆检测的基础上对车型进行分类。
国内外现有的研究多数是基于单轴或双轴磁场信号实现车辆的检测与分类,没有充分利用空间磁场信息,不能全面体现车辆的扰动,导致车辆检测分类精度不高、车型划分种类少。
针对车辆检测分类的需求,采用新型三轴磁阻传感器HMC5883L以及无线通信模块XL02-232AP1研制了一种车辆检测分类系统。
2 磁阻传感器检测分类车辆原理磁阻传感器的基础器件是恵斯通电桥,组成电桥的电阻由镍铁合金材料制成,该电阻的阻值在一定范围内与磁场矢量变化呈线性关系。
当含铁磁物质的物体(如车辆)经过磁阻传感器时,会对传感器周围的地磁场造成扰动,磁阻传感器可以检测出由于车辆的经过而产生的地磁场变化,不同类型的车辆包含的铁磁性材料大小和形状均不同,从而不同类型的车辆对地磁场产生的扰动也不同,依据这个原理可以对车辆进行分类。
3 传感器节点设计本文选用一种三轴数字式磁阻传感器HMC5883L,该传感器采用霍尼韦尔各向异性磁阻(AMR)技术,封装在3.0×3.0×0.9 mm LCC 表面装配中,具有12 bit 的ADC 模块,能在±8 高斯的磁场中实现5 毫高斯分辨率。
使用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,然后再配置为单一测量模式,即可进入自测模式。
hmc操作手册
HMC相关操作1 HMC配置ip 地址登入hmc, 在左侧窗口选择管理环境>>>HMC配置选择右侧菜单中的定制网络设置在网络定制窗口中,更改控制台名称为: HMC 选择LAN适配器选择eth2适配器点击详细信息更改eth2端口设置如上图所示,点击确定保存配置,返回主界面选择左上角控制台下拉菜单,选择退出,重新启动HMC使设置生效2 创建逻辑分区右键点击Server图标选择创建>>>逻辑分区输入分区名称,点击下一步确定分区是否在工作负载管理组中,选择否,点击下一步输入分区概要文件名称:lpae3.pro,点击下一步输入为该逻辑分区分配的最小,期望,最大内存量,点击下一步点击下一步输入为该逻辑分区分配的最小,期望,最大处理器数,点击下一步为该分区添加必要和期望的i/o组件,点击下一步由于需要动态移动的i/o设备很少,所以没有必要设置i/o池,直接点击下一步不需要设置虚拟i/o适配器,选择否,点击下一步直接点击下一步选择正常引导方式,点击下一步确认信息无误后,点击完成,开始创建分区3 动态资源移动1)动态移动内存将64M内存从lpar1动态移动到lpar21 右键点击lpar1图标2 依次选择动态逻辑分区>>>内存资源>>>移动3 指定移动64M内存,移动至逻辑分区lpar2,点击确定执行操作2)动态移动处理器将1路处理器由lpar1动态移动到lpar2 1 右键点击lpar1图标2 依次选择动态逻辑分区>>>处理器资源>>>移动3 输入处理器数目:1 移动至逻辑分区lpar2,点击确定执行操作3)动态移动光驱光驱在aix系统中的设备名称为cd0首先在拥有cd0资源的系统中执行以下操作:1 寻找cd0上级设备#lsdev –Cl cd0 –F parent 输出结果:ide0#lsdev –Cl ide0 –F parent 输出结果:pci62 察看ide0,pci6地址信息# lscfg -l ide0ide0 U7879.001.DQD2K3L-P1-T15 A TA/IDE Controller Device # lscfg -l pci6pci6 U7879.001.DQD2K3L-P1 PCI Bus3 删除cd0资源#rmdev –dl pci6 –R,输出结果如下cd0 deletedide0 deletedpci6 deleted4 查找pci6物理位置右键点击lpar2.pro选择特性选择物理I/O5 移动光驱资源右键点击lpar2 ,依次选择动态逻辑分区>>>物理适配器资源>>>移动选择插槽T15,移至lpar1,点击确定执行操作6 在lpar1上执行命令#cfgmgr识别并建立刚加入的cd0资源4)动态移动磁带机磁带机设备名称为:rmt0,其他操作与移动cd0相同磁带机在aix系统中的设备名称为rmt0首先确定磁带机是否在本机# lsdev -Cc tapermt0 A vailable 06-08-00-0,0 Differential SCSI 4mm Tape Drive在拥有rmt0资源的系统中执行以下操作:1 寻找rmt0上级设备#lsdev –Cl rmt0 –F parent 输出结果:scsi1#lsdev –Cl scsi1 –F parent 输出结果:sisscsia1#lsdev –Cl sisscsia1 –F parent 输出结果:pci62 察看scsi1,pci6地址信息# lscfg -l scsi1scsi1 U7879.001.DQD2K3L-P1-C3-T1 PCI-X Dual Channel Ultra320 SCSI Adapter bus# lscfg -l pci6pci6 U7879.001.DQD2K3L-P1 PCI Bus 3 删除rmt0资源#rmdev –dl pci6 –R,输出结果如下rmt0 deletedscsi1 deletedscsi2 deletedsisscsia1 deletedpci6 deleted4 查找pci6物理位置右键点击P570-1.pro选择特性选择物理I/O5 移动磁带资源右键点击570-1 ,依次选择动态逻辑分区>>>物理适配器资源>>>移动选择插槽C3,移至570-2,点击确定执行操作6 在570-2上执行命令#cfgmgr识别并建立刚加入的rmt0资源4 安装HMC远程管理客户端1 启用远程虚拟终端选择启用或禁用远程虚拟终端选中启用远程虚拟终端连接后,点击确定返回上级菜单2 开启远程虚拟终端服务选择定制网络设置选择LAN适配器选择eth2,点击详细信息选择防火墙选中WebSM,点击容许然后重新启动HMC使设置生效3 下载远程终端服务软件在浏览器输入地址http://10.79.9.11/remote_client.html用户名:hscroot口令:abc123分别下载这2个软件,安装时请先安装java web start环境。
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
PIN CONFIGURATIONS
Pin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Name SCL VDD NC S1 NC NC NC SETP GND C1 GND SETC VDDIO NC DRDY SDA
2
Description Serial Clock – I C Master/Slave Clock Power Supply (2.16V to 3.6V) Not to be Connected Tie to VDDIO Not to be Connected Not to be Connected Not to be Connected Set/Reset Strap Positive – S/R Capacitor (C2) Connection Supply Ground Reservoir Capacitor (C1) Connection Supply Ground S/R Capacitor (C2) Connection – Driver Side IO Power Supply (1.71V to VDD) Not to be Connected Data Ready, Interrupt Pin. Internally pulled high. Optional connection. Low for 250 µsec when data is placed in the data output registers. 2 Serial Data – I C Master/Slave Data Table 1: Pin Configurations
FEATURES
3-Axis Magnetoresistive Sensors and ASIC in a 3.0x3.0x0.9mm LCC Surface Mount Package 12-Bit ADC Coupled with Low Noise AMR Sensors Achieves 5 milli-gauss Resolution in ±8 Gauss Fields Built-In Self Test Low Voltage Operations (2.16 to 3.6V) and Low Power Consumption (100 μA) Built-In Strap Drive Circuits I C Digital Interface Lead Free Package Construction Wide Magnetic Field Range (+/-8 Oe) Software and Algorithm Support Available Fast 160 Hz Maximum Output Rate
HMC5883L标定补偿-4页文档资料
this calibration will correct or compensate for thehard iron effects.hard iron effects are magnetic filed superimpositions on the earth's magnetic field that are fixed in magnitude and which do not depend on the orientation of the compass.the compass calibration shall be initiated by a user command that put the compass into the calibration mode. once in that mode the compass shall be rotated through 360 degrees abouth the forward or left direction followed by a 360 rotation about the up-down direction. that is, there are two full rotations required to complete the physical movement required. at the end of the rotations a command to end the calibration process shall be issued by the user to the compass.it is important to keep the forward (or left ) axis level during the first rotation and to keep the up-down axis vertical during the second calibration and until the flu calibration is complete. Failure to follow these process will result in less than optimal calibration and heading errors are likely.#define calthreshold 0int Xmax,Xmin,Ymax,Ymin,Zmax,Zmin;viod Intialize_Cal_Variables(int MagX, int MagY, int MagZ)void Calibrate(int MagX, int MagY, int MagZ)void Compute_and_Save(void)void Hard_Iron_correction(int Xoff, int Yoff, int Zoff)viod Intialize_Cal_Variables(int MagX, int MagY, int MagZ)//set Max and Min values of the mag output to the current values Xmax = MagX;Xmin = MagX;Ymax = MagY;Ymin = MagY;Zmax = MagZ;Zmin = MagZ;void Calibrate(int MagX, int MagY, int MagZ)//this routine will capture the max and min values of the magX,Y,Z data while the//compass is being rotated 360 degrees through the level plane and the upright plane.//i.e. horizontal and vertical circles.//This function should be invoked while making continuous measurements//on the magnetometersint MagXreading,int MagYreading,int MagZreading;MagXreading = MagX;MagYreading = MagY;MagZreading = MagZ;if(MagXreading > Xmax) Xmax = MagXreading;if(MagXreading < Xmin) Xmin = MagXreading;if(MagYreading > Ymax) Ymax = MagYreading;if(MagXreading < Ymin) Ymin = MagXreading;if(MagZreading > Zmax) Zmax = MagZreading;if(MagXreading < Zmin) Zmin = MagXreading;void Compute_and_Save(void)if(abs(Xmax - Xmin) > CalThreshold)Mag_UserCal_offset_X = (Xmax + Xmin)/2;//save parameters in EEif(abs(Ymax - Ymin) > CalThreshold)Mag_UserCal_offset_Y = (Ymax + Ymin)/2;//save parameters in EEif(abs(Zmax - Zmin) > CalThreshold)Mag_UserCal_offset_Z = (Zmax + Zmin)/2;//save parameters in EEvoid Hard_Iron_correction(int Xoff, int Yoff, int Zoff) //call this function for correctionMagX -= Mag_UserCal_Offset_X;MagY -= Mag_UserCal_Offset_Y;MagZ -= Mag_UserCal_Offset_Z;希望以上资料对你有所帮助,附励志名3条:1、积金遗于子孙,子孙未必能守;积书于子孙,子孙未必能读。
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.一、背景鉴于各个领域对智能化系统的需求在不断的上升,在很多危险的领域更是不用说。
HMC5883L中文数据手册
特点
优点
► 三 轴 磁 阻 传 感 器 和 ASIC 都 被 封 装 在 ► 是体积小高集成产品。只需添加一个微处理器接口,
3.0×3.0×0.9mm LCC 表面装配中
外加两个外部 SMT 电容。专为大批量、成本敏感的
OEM 生产而设计,易于装配并与高速 SMT 装配件兼容
► 12-bit ADC 与低干扰 AMR 传感器,能在 ► 能让罗盘航向精度精确到 1°~2° ±8 高斯的磁场中实现 5 毫高斯分辨率
内部示意图
HMC5883L
上海:Tel:021-62370237 北京:Tel:010-84583280 广州: Tel:020-84101800 香港:Tel:00852-29536412
5
HMC 5583L 双电源参 考设计
+8
高斯(gauss)
±8
高斯
0.1
±%满量程
毫高斯
µs
ppm
%FS/Gauss
75
Hz
160
Hz
us
ms
%
hex(十六进制) hex(十六进制) hex(十六进制)
400
kHz
0.2*VDDIO 0.8*VDDIO
±1.16 ±1.08
510
V V 高斯
LSb
2000
V
750
V
-30
85
ºC
-40
Honeywell
HMC5883L 采用霍尼韦尔各向异性磁阻(AMR)技术,该技术的优点是其他磁传感器技术所无法企及。这些各向 异性传感器具有在轴向高灵敏度和线性高精度的特点.传感器带有的对于正交轴低敏感行的固相结构能用于 测量地球磁场的方向和大小,其测量范围从毫高斯到 8 高斯(gauss)。 霍尼韦尔的磁传感器在低磁场传感 器行业中是灵敏度最高和可靠性最好的传感器。
磁力计基础(HMC5833L,HMC5983)
磁⼒计基础(HMC5833L,HMC5983)三轴磁场传感器模块HMC5983⾼精度带温度补偿IIC/SPI 通信兼容HMC5883L最⼤220Hz 输出速率补偿数据将会被⾃动放置到数据输出寄存器中,如果想要补偿功能⼯作,那么必须设置使温度传感器⼯作(设置CRA7=1)Set this bit to enable temperature sensor. Temperature sensor will be measured at each magnetic measurement. Enable Temperature sensor for automatic compensation of Sensitivity over temperature.注意这⾥的MA1 TO MA2 00=1是默认值配置寄存器B:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Below is an example ofa (power-on) initialization process for “continuous-measurement mode” via I2C interface:1. Write CRA (00) – send 0x3C 0x00 0x70 (8-average, 15 Hz default, normal measurement)2. Write CRB (01) – send 0x3C 0x01 0xA0 (Gain=5, or any other desired gain)3. Write Mode (02) – send 0x3C 0x02 0x00 (Continuous-measurement mode)4. Wait 6 ms or monitor status register or DRDY hardware interrupt pin5. LoopSend 0x3D 0x06 (Read all 6 bytes. If gain is changed then this data set is using previous gain)Convert three 16-bit 2’s compliment hex values to decimal values and assign to X, Z, Y, respectively.Send 0x3C 0x03 (point to first data register 03)Wait about 67 ms (if 15 Hz rate) or monitor status register or DRDY hardware interrupt pinEnd_loopBelow is an example of a (power-on) initialization process for “single-measurement mode” via I2C interface:1. Write CRA (00) – send 0x3C 0x00 0x70 (8-average, 15 Hz default or any other rate, normal measurement)2. Write CRB (01) – send 0x3C 0x01 0xA0 (Gain=5, or any other desired gain)3. For each measurement query:Write Mode (02) – send 0x3C 0x02 0x01 (Single-measurement mode)Wait 6 ms or monitor status register or DRDY hardware interrupt pinSend 0x3D 0x06 (Read all 6 bytes. If gain is changed then this data set is using previous gain)Convert three 16-bit 2’s compliment hex values to decimal values and assign to X, Z, Y, respectively.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++HMC 5583L技术规格启动时间I2C 控制准备时间200 µs输出速率:持续测量模式75 Hz 单⼀测量模式160 Hz~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 芯⽚引脚;⾃测为了检测HMC5883L 是否正常运⾏,传感器内部可产⽣标准磁场⽽进⾏的⾃测试,再去测量此标准磁场强度并输出。
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)。
HMC5883L标定补偿
this calibration will correct or compensate for the hard iron effects.hard iron effects are magnetic filed superimpositions on the earth's magnetic field that are fixed in magnitude and which do not depend on the orientation of the compass.the compass calibration shall be initiated by a user command that put the compass into the calibration mode. once in that mode the compass shall be rotated through 360 degrees abouth the forward or left direction followed by a 360 rotation about the up-down direction. that is, there are two full rotations required to complete the physical movement required. at the end of the rotations a command to end the calibration process shall be issued by the user to the compass.it is important to keep the forward (or left ) axis level during the first rotation and to keep the up-down axis vertical during the second calibration and until the flu calibration is complete. Failure to follow these process will result in less than optimal calibration and heading errors are likely.#define calthreshold 0int Xmax,Xmin,Ymax,Ymin,Zmax,Zmin;viod Intialize_Cal_Variables(int MagX, int MagY, int MagZ)void Calibrate(int MagX, int MagY, int MagZ)void Compute_and_Save(void)void Hard_Iron_correction(int Xoff, int Yoff, int Zoff)viod Intialize_Cal_Variables(int MagX, int MagY, int MagZ){//set Max and Min values of the mag output to the current valuesXmax = MagX;Xmin = MagX;Ymax = MagY;Ymin = MagY;Zmax = MagZ;Zmin = MagZ;}void Calibrate(int MagX, int MagY, int MagZ){//this routine will capture the max and min values of the magX,Y,Z data while the //compass is being rotated 360 degrees through the level plane and the upright plane.//i.e. horizontal and vertical circles.//This function should be invoked while making continuous measurements//on the magnetometersint MagXreading,int MagYreading,int MagZreading;MagXreading = MagX;MagYreading = MagY;MagZreading = MagZ;if(MagXreading > Xmax) Xmax = MagXreading;if(MagXreading < Xmin) Xmin = MagXreading;if(MagYreading > Ymax) Ymax = MagYreading;if(MagXreading < Ymin) Ymin = MagXreading;if(MagZreading > Zmax) Zmax = MagZreading;if(MagXreading < Zmin) Zmin = MagXreading;}void Compute_and_Save(void){if(abs(Xmax - Xmin) > CalThreshold){Mag_UserCal_offset_X = (Xmax + Xmin)/2;//save parameters in EE}if(abs(Ymax - Ymin) > CalThreshold){Mag_UserCal_offset_Y = (Ymax + Ymin)/2;//save parameters in EE}if(abs(Zmax - Zmin) > CalThreshold){Mag_UserCal_offset_Z = (Zmax + Zmin)/2;//save parameters in EE}}void Hard_Iron_correction(int Xoff, int Yoff, int Zoff) {//call this function for correctionMagX -= Mag_UserCal_Offset_X;MagY -= Mag_UserCal_Offset_Y;MagZ -= Mag_UserCal_Offset_Z;}。
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 :引脚配置箭头指示的方向,产生磁场,在正常的测量配置输出读数。
QMC5883L Datasheet 1.0
2.3
I/O Characteristics
Table 4. I/O Characteristics Parameter Voltage Input High Level 1 Voltage Input Low Level 1 Voltage Output High Level Voltage Output Low Level Symbol VIH1 VIL1 VOH VOL Pin SDA, SCL SDA, SCL INT INT, SDA Output Current ≥-100uA Output Current ≤100uA(INT) Output Current ≤1mA (SDA) Condition Min. 0.7*VD DIO -0.3 0.8*VD DIO 0.2*VD DIO TYP. Max. VDDIO+ 0.3 0.3*VD DIO Unit V V V V
3-Axis Magnetic Sensor QMC5883L
The QMC5883L is a multi-chip three-axis magnetic sensor. This surface -mount, small sized chip has integrated magnetic sensors with signal condition ASIC, targeted for high precision applications such as compassing, navigation and gaming in drone, robot, mobile and personal hand-held devices. The QMC5883L is based on our state-of-the-art, high resolution, magneto-resistive technology licensed from Honeywell AMR technology. Along with custom-designed 16-bit ADC ASIC, it offers the advantages of low noise, high accuracy, low power consumption, offset cancellation and temperature compensation. QMC5883L enables 1° to 2° compass heading accuracy. The I² C serial bus allows for easy interface. The QMC5883L is in a 3x3x0.9mm surface mount 16-pin land grid array (LGA) package.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
125
ºC
2.85
3.00
3.15
mm
0.8
0.9
1.0
mm
上海:Tel:021-62370237 北京:Tel:010-84583280 广州: Tel:020-84101800 香港:Tel:00852-29536412
2
HMC 5583L
I2C 率 I2C 滞后性
自测试 常规
ESD 电压 工作温度
所有增益/动态范围设置
7-bit 地址 8-bit 读取地址 8-bit 写入地址 由 I2C 主机控制
施密特触发器脉冲输入在SCL和 SDA 上的滞后性- 下降 (VDDIO=1.8V)
上升 (VDDIO=1.8V) X&Y 轴 Z轴
X&Y 轴(GN=100) Z 轴(GN=100)
DRDY
SDA
描述 串行时钟- I2C总线主/从时钟 电源(2.16V-3.6V) 无连接 连接 VDDIO 无连接 无连接 无连接 置位/复位带正-S/R电容( C2)连接 电源接地 存储电容器(C1)连接 电源接地 S/R电容器( C2)连接-驱动端 IO电源供应(1.7V-VDD) 无连接 数据准备,中断引脚。内部被拉高。选项为连接,当数据位于输出寄存器 上时会在低电位上停250μsec 串行数据- I2C总线主/从数据
内部示意图
HMC5883L
上海:Tel:021-62370237 北京:Tel:010-84583280 广州: Tel:020-84101800 香港:Tel:00852-29536412
5
HMC 5583L 双电源参 考设计
► 内置自检功能
► 产品组装后能进行低成本功能性测试
► 低 电 压 工 作 (2.16-3.6V) 和 超 低 功 耗 ► 适用于电池供电的应用场合 (100uA)
► 内置驱动电路
► 带置位/复位和偏置驱动器用于消磁、自测和偏移补 偿
► I2C 数字接口
► 适用于消费类电子设备应用中通用双线串行数据接口
单一测量模式下的测量周期
当达到预定的最大输出频率,才需要监控DRDY中断引脚
上海:Tel:021-62370237 北京:Tel:010-84583280 广州: Tel:020-84101800 香港:Tel:00852-29536412
要求主机的活动(寄存器的读取和写入)优先于内部活动,例如:测量。这一优先次序的安排是为了不让主 机等待,同时I²C总线占用的时间比必需的时间长。
内部时钟
该装置有一个内部时钟,具有内部数字逻辑功能和定时管理功能。
上海:Tel:021-62370237 北京:Tel:010-84583280 广州: Tel:020-84101800 香港:Tel:00852-29536412
这些磁阻元件两两对齐,形成一个共同的敏感轴(如引脚图上的箭头所示),随着磁场在敏感方向上不断增强, 电压也就正向增长。因为输出只与沿着轴方向上的磁阻元件成比例,其他磁阻电桥也放置在正交方向上,就 能精密测量其他方向的磁场强度。
自测
为了检测 HMC5883L 是否正常运行,传感器内部可产生标准磁场而进行的自测试(不论是正向配置还是负向配 置),再去测量此标准磁场强度并输出。在设置 A 寄存器上相应位 MS 的值,就可启动自测功能及产生电压的 极性。来自 VDD 电源的内部电流源产生直流电流(大约 10 mA),然后加到磁阻传感器的偏置带上,这样就 在传感器内部产生了一个人为的标准磁场。 具体参考下面的自测操作附件资料。
控制该装置可以通过I²C总线来实现。该装置将作为从机在一个主机(例如:处理器)的控制下连接总线。
该装置必须符合I2C-Bus Specification(I2C-总线技术规格标准),文件号为:9398 393 40011。作为一 个I2C 兼容装置,该装置包含一个7-bit串行地址,并支持I2C 协议。这一装置可以支持标准和快速模式,分 别为100kHz 和 400kHz,但不支持高速模式(Hs)。还需要外接电阻才能支持这些标准和快速模式。
7
HMC 5583L 基本的装置操作
各向异性磁阻传感器
霍尼韦尔HMC5883L磁阻传感器电路是三轴传感器并应用特殊辅助电路来测量磁场。通过施加供电电源,传感 器可以将量测轴方向上的任何入射磁场转变成一种差分电压输出。磁阻传感器是由一个镍铁(坡莫合金)薄膜 放置在硅片上,并构成一个带式电阻元件。在磁场存在的情况下,桥式电阻元件的变化将引起跨电桥输出电 压的相应变动。
Honeywell
HMC5883L 采用霍尼韦尔各向异性磁阻(AMR)技术,该技术的优点是其他磁传感器技术所无法企及。这些各向 异性传感器具有在轴向高灵敏度和线性高精度的特点.传感器带有的对于正交轴低敏感行的固相结构能用于 测量地球磁场的方向和大小,其测量范围从毫高斯到 8 高斯(gauss)。 霍尼韦尔的磁传感器在低磁场传感 器行业中是灵敏度最高和可靠性最好的传感器。
特性
条件*
供电电源 供电电压
平均电流损耗 性能
VDD 参考AGND VDDIO 参考 DGND
闲置模式 测量模式 (7.5Hz ODR) 没有应用测量平均值, 即设置
MA1:MA0=00) VDD = 2.5V,V DDIO = 1.8V
磁场范围
满量程 (FS) – 全部施加磁场(典型)
磁动态范围
3-bit 增益控制
电源管理
该器件可有两种不同的供电模式。第一个是内部运作的 VDD 供电电源,第二个是为 IO 接口供电的 VDDIO 电 源,当然 VDDIO 的电压可以与 VDD 电源电源相近;单电源模式,或在 VDDIO 电压低于 VDD 的情况下, HMC5883L 都能正常运作并能与其他装置兼容。
I2C 接口
表1:引脚位置
箭头标明磁场方向,该磁场在正常测量模式下产生正向输出可读。
上海:Tel:021-62370237 北京:Tel:010-84583280 广州: Tel:020-84101800 香港:Tel:00852-29536412
► 无引线封装结构
► 符合 RoHS 标准
► 磁场范围广(+/-8Oe)
► 传感器能在强磁场环境中罗盘航向精度达到 1°~2°
► 有相应软件及算法支持
► 可获得罗盘航向、硬磁、软磁以及自动校准库
► 最大输出频率可达160Hz
► 能应用于个人导航系统和LBS
HMC 5583L
技术规格 (*在25°C时的测试,另有说明除外)
8
HMC 5583L
置位/复位带驱动的H-桥式电路
ASIC包含大型开关FETs,可以传输大而短的脉冲到传感器的置位/复位带。这一置位/复位带在很大程度上是 一种电阻性负载。
并不需要外部去增加外部置位/复位回路。每次测量时,ASIC会自动完成置位/复位。首先一次置位脉冲产生 后进行测量,然后一次复位脉冲产生后进行测量,两次测量的差值的一半将会被放置在三轴上每根轴的数据 输出寄存器上。这样,在所有测量中传感器的内部偏差和温度漂移差值就可以被移除/抵消了。
回流焊和重修
该ICSMT制作级别为MSL 3,回流焊最高温度为260℃。如果SMT制作前没有保持在干燥环境中(<10%RH), 则有 必要经过烘烤过程。(125℃,24hrs)。HMC5883L对回流焊程序无特殊要求,因为HMC5883L能很好的适应电 镀锡铅和无铅锡膏回流程序。霍尼韦尔建议遵守锡膏厂商的使用指南。
绝对最大额定值(*在 25°C 时的测试,另有说明除外)
规格参数表
最小
最大
单位
供电电压 VDD
-0.3
4.8
V
供电电压 VDDIO
-0.3
4.8
V
引脚配置
引脚 1 2 3 4 5 6 7 8 9 10 11 12 13 14
15
16
名称 SCL VDD NC S1 NC NC NC SETP GND C1 GND SETC VDDIO NC
+8
高斯(gauss)
±8
高斯
0.1
±%满量程
毫高斯
µs
ppm
%FS/G
Hz
us
ms
%
hex(十六进制) hex(十六进制) hex(十六进制)
400
kHz
0.2*VDDIO 0.8*VDDIO
±1.16 ±1.08
510
V V 高斯
LSb
2000
V
750
V
-30
85
ºC
-40
4
HMC 5583L
PCB 焊盘说明和布局 HMC5883L 采用一种细间距LCC封装技术,PCB引脚指的是为了正确的封装定心,采用上述建议的PCB覆盖区的 尺寸的数值。调整HMC5883L和外部电容器(C1和C2)之间的线间距,利用线阻低电压降来处理1安培峰值电流 脉冲。
钢网设计和锡膏 对于电气接触垫,我们推荐一个4 mil 钢网和100%的锡膏覆盖。
充电电流限定
无论是单电源供电还是双电源供电, 储能电容 C1 在充电时电流是受限的,避免 VDD 的电压被拉低.
操作模式
该装置有若干种模式,其主要目的是电源管理以及通过模式寄存器进行控制。本章节将就模式进行说明。
连续测量模式
连续测量模式,在客户所选择的速率下进行连续的测量,并所测量的更新数据输出寄存器。如果有必要,数 据可以从数据输出寄存器重新读取,但是,如果主机并不能确保在下次测量完成之前可以访问数据寄存器, 数据寄存器上的旧的数据会被新的测量数据取代。为了保存测量之间的电流,该装置被放置在一个类似闲置 模式的状态,但模式寄存器没有改变成空闲模式。即MD[n]位不变。配置寄存器A的设置在连续测量模式时会 影响数据输出速率(比特DO[n]) ,测量配置(bits MS[n]),和增益(bits GN[n])。所有寄存器在连续测量模 式中保留数值。 在连续测量模式下I2C总线可被网络内的其他装置启用。