电子指南针也称为电子罗盘,是一种重要的导航工具,能实时提供移动物体的航向和姿态。随着半导体工艺的进步和手机操作系统的发展,集成了越来越多传感器的智能手机变得功能强大,很多手机上都实现了电子罗盘的功能。而基于电子罗盘的应用(如Android的Skymap)在各个软件平台上也流行起来。

霍尼韦尔 HMC5883L是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率HMC118X系列磁阻传感器,并附带霍尼韦尔专利的集成电路包括放大器、自动消磁驱动器、偏差校准、能使罗盘精度控制在1°~2°的12 位模数转换器.简易的I2C 系列总线接口。HMC5883L 是采用无铅表面封装技术,带有16 引脚,尺寸为3.0X3.0X0.9mm。HMC5883L 的所应用领域有手机、笔记本电脑、消费类电子、汽车导航系统和个人导航系统。

HMC5883L 采用霍尼韦尔各向异性磁阻(AMR)技术,该技术的优点是其他磁传感器技术所无法企及。这些各向异性传感器具有在轴向高灵敏度和线性高精度的特点.传感器带有的对于正交轴低敏感行的固相结构能用于测量地球磁场的方向和大小,其测量范围从毫高斯到 8 高斯(gauss)。 霍尼韦尔的磁传感器在低磁场传感器行业中是灵敏度最高和可靠性最好的传感器。

我们采用CC2540作为单片机,通过模拟I2C与HMC5883L通信,代码如下

#include<ioCC2540.h>
#include  <math.h>
#include  <stdio.h>#include "hmc5883l.h"#define   uchar unsigned char
#define   uint unsigned int #define SCL P1_0      //IIC时钟引脚定义
#define SDA P1_1      //IIC数据引脚定义#define    SlaveAddress   0x3C   //定义器件在IIC总线中的从地址
typedef unsigned char BYTE;
typedef unsigned short WORD;void delay(unsigned int k);
void Init_HMC5883(void);            //初始化5883void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void conversion(uint temp_data);void  Single_Write_HMC5883(uchar REG_Address,uchar REG_data);   //单个写入数据
uchar Single_Read_HMC5883(uchar REG_Address);                   //单个读取内部寄存器数据
void  Multiple_Read_HMC5883();                                  //连续的读取内部寄存器数据
//以下是模拟iic使用函数-------------
void Delay5us();
void Delay5ms();
void HMC5883_Start();
void HMC5883_Stop();
void HMC5883_SendACK(unsigned char ack);
unsigned char  HMC5883_RecvACK();
void HMC5883_SendByte(BYTE dat);
BYTE HMC5883_RecvByte();
void HMC5883_ReadPage();
void HMC5883_WritePage();
//-----------------------------------/*******************************/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<1210;j++)
{;}}
}/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{unsigned char count_i;for(count_i=0; count_i<30; count_i++);
}/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{WORD n = 5600;while (n--);
}/**************************************
起始信号
**************************************/
void HMC5883_Start()
{P1DIR |= 0x02;  SDA = 1;                    //拉高数据线SCL = 1;                    //拉高时钟线Delay5us();                 //延时SDA = 0;                    //产生下降沿Delay5us();                 //延时SCL = 0;                    //拉低时钟线
}/**************************************
停止信号
**************************************/
void HMC5883_Stop()
{P1DIR |= 0x02;  SDA = 0;                    //拉低数据线SCL = 1;                    //拉高时钟线Delay5us();                 //延时SDA = 1;                    //产生上升沿Delay5us();                 //延时
}/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void HMC5883_SendACK(unsigned char ack)
{P1DIR |= 0x02;  SDA = ack;                  //写应答信号SCL = 1;                    //拉高时钟线Delay5us();                 //延时SCL = 0;                    //拉低时钟线Delay5us();                 //延时
}/**************************************
接收应答信号
**************************************/
unsigned char HMC5883_RecvACK()
{P1DIR &= 0xfd;  SCL = 1;                    //拉高时钟线Delay5us();                 //延时CY = SDA;                   //读应答信号SCL = 0;                    //拉低时钟线Delay5us();                 //延时return CY;
}/**************************************
向IIC总线发送一个字节数据
**************************************/
void HMC5883_SendByte(BYTE dat)
{BYTE i;P1DIR |= 0x02;for (i=0; i<8; i++)         //8位计数器{dat <<= 1;              //移出数据的最高位SDA = CY;               //送数据口SCL = 1;                //拉高时钟线Delay5us();             //延时SCL = 0;                //拉低时钟线Delay5us();             //延时}HMC5883_RecvACK();
}/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE HMC5883_RecvByte()
{BYTE i;BYTE dat = 0;P1DIR |= 0x02;SDA = 1;//使能内部上拉,准备读取数据,P1DIR &= 0xfd;for (i=0; i<8; i++)         //8位计数器{dat <<= 1;SCL = 1;                //拉高时钟线Delay5us();             //延时dat |= SDA;             //读数据               SCL = 0;                //拉低时钟线Delay5us();             //延时}return dat;
}//***************************************************void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)
{HMC5883_Start();                  //起始信号HMC5883_SendByte(SlaveAddress);   //发送设备地址+写信号HMC5883_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf HMC5883_SendByte(REG_data);       //内部寄存器数据,请参考中文pdfHMC5883_Stop();                   //发送停止信号
}//********单字节读取内部寄存器*************************
uchar Single_Read_HMC5883(uchar REG_Address)
{  uchar REG_data;HMC5883_Start();                          //起始信号HMC5883_SendByte(SlaveAddress);           //发送设备地址+写信号HMC5883_SendByte(REG_Address);                   //发送存储单元地址,从0开始    HMC5883_Start();                          //起始信号HMC5883_SendByte(SlaveAddress+1);         //发送设备地址+读信号REG_data=HMC5883_RecvByte();              //读出寄存器数据HMC5883_SendACK(1);   HMC5883_Stop();                           //停止信号return REG_data;
}
//******************************************************
//
//连续读出HMC5883内部角度数据,地址范围0x3~0x5
//
//******************************************************
void Multiple_read_HMC5883(unsigned char *pBuf)
{   uchar i;HMC5883_Start();                          //起始信号HMC5883_SendByte(SlaveAddress);           //发送设备地址+写信号HMC5883_SendByte(0x03);                   //发送存储单元地址,从0x3开始   HMC5883_Start();                          //起始信号HMC5883_SendByte(SlaveAddress+1);         //发送设备地址+读信号for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF{*(pBuf+i) = HMC5883_RecvByte();          //BUF[0]存储数据if (i == 5){HMC5883_SendACK(1);                //最后一个数据需要回NOACK}else{HMC5883_SendACK(0);                //回应ACK}}HMC5883_Stop();                          //停止信号Delay5ms();
}//初始化HMC5883,根据需要请参考pdf进行修改****
void Init_HMC5883(void)
{P1DIR |= 0x03;   Single_Write_HMC5883(0x02,0x00);  //
}

下面是所采集的在坐标轴上的数据

所得到的数据为在各个坐标轴上的磁场强度,测试发现,计算出的磁场角度并不准确,这个淘宝上买的GY-273模块自身应该有少许的干扰,需要进行校准。

HMC5883L 电子指南针相关推荐

  1. android 磁场传感器 罗盘,HMC5883L电子指南针罗盘模块 GY-271三轴磁场传感器 的相关教程 带Arduino 51源代码...

    //*************************************** // HMC5883 51串口测试程序 // 使用单片机STC89C51 // 晶振:11.0592M // 显示: ...

  2. ROS 学习系列-- 四轮机器人线性速率、角速度和电机PWM线性关系的定量分析

    ROS中的机器人导航需要底层轮子驱动十分精确的对行进的速率和角速度进行控制.本文根据大量的实验数据进行图形化分析,找出线性速率.角速度和电机PWM线性关系,并得出计算公式. 1. ROS导航机器人驱动 ...

  3. 瑞萨单片机 (R5F100LE) I2C IIC 电子指南针模块 HMC5883L

    2019独角兽企业重金招聘Python工程师标准>>> 电子指南针模块在智能车和飞行器上是很常用的模块,这篇文章就介绍一下瑞萨单片机如何使用HMC5883L,HMC5883L使用I2 ...

  4. 电子指南针Arduino笔记四电子指南针罗盘HMC5883L

    最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--电子指南针 电子指南针罗盘HMC5883L是三轴磁阻传感器,用来测量四周的磁感应强度,测量范围-8g~8g单位是高斯.提到磁感应强度最熟 ...

  5. STC 51单片机53——电子指南针HMC5883l

    #include  <REG51.H>     #include  <math.h>    //Keil library   #include  <stdio.h> ...

  6. 【51单片机快速入门指南】4.4:I2C 读取HMC5883L / QMC5883L 磁力计

    目录 硬知识 简介 操作模式 HMC5883L 连续测量模式 单次测量模式 闲置模式 QMC5883L 连续测量模式 待命模式 主要差异 寄存器 寄存器列表 HMC5883L QMC5883L 配置寄 ...

  7. HMC5883L常见问题解答

    HMC5883L常见问题解答:本文来源于百度文库: http://wenku.baidu.com/link?url=eDNpt5pwY5nzmez2HfAgFNg7il5rZKVKpywKcF8F9f ...

  8. 关于HMC5883L驱动书写及调试的总结

    刚刚结束对传感器HMC5883L的驱动书写及调试工作,虽然之前对相关的各种知识点都有接触,但是在真正从头书写驱动的时候还是遇到了很多不大不小的麻烦,在这里自行总结一下,也是作为以后驱动书写的一个经验教 ...

  9. HMC5883L地磁传感器驱动

    霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域.HMC5883L 包括最先进的高分辨率 HMC118X 系列磁阻传感器,并附带霍 ...

最新文章

  1. shell中执行脚本并显示到终端和保存到日志文件中
  2. 5分钟学会Java 9~Java11的七大新特性
  3. 为什么socket接收大数据的时候接收不完全,出现丢包?
  4. NIOS II 创建示例设计_Quartus II 9.0
  5. 也谈ASP.NET页面事件
  6. Angularjs controller之间的通信
  7. C#设计模式学习笔记:(20)职责链模式
  8. 什么是git_什么是Git?
  9. java实现线性顺序表
  10. c/c++教程 - 1.1 代码注释
  11. 重磅 | 京东云区块链数据服务(BDS)正式开源!
  12. 微服务架构的核心要点和实现原理解析
  13. python熊猫烧香_'熊猫烧香'病毒专题:多少变种,怎么破坏,如何查杀?
  14. 如何在vue中使用阿里图标库
  15. MySQL卸载不干净或Mysql安装失败的解决办法
  16. Google翻译插件不能用解决方案
  17. 小柯-java 进阶
  18. Collision Filtering(selective collisions) 碰撞过滤(选择性碰撞)
  19. 北京十大it外包公司
  20. tensorrt pb转uff问题

热门文章

  1. 关于微信授权登录的用户取消-2的问题
  2. php显示动态的文字,动态文字制作软件,视频上制作动感文字/动态字幕条
  3. 解决透视变换后图片信息丢失的问题,附程序
  4. 今日头条,今日特卖自媒体号如何申请。
  5. 爬虫学习笔记(用python爬取东方财富网实验)
  6. “远香烟·近健康”乡风文明之禁烟活动
  7. 提高Java反射速度的方法以及对setAccessable的误解
  8. 联通光猫nat -虚拟服务器,科学折腾 篇一:长春联通光猫改软路由拨号
  9. 【旅游热点】金秋十月 “额济纳胡杨林”登内蒙古景区热度榜首
  10. Android 蓝牙 A2dp音频数据通过L2cap 发往Controller -- 代码详解