基于STM32的三轴数字罗盘HMC5883L模块的测试方案

2018-03-12 21:06:53编辑:王磊 关键字:HMC5883L  数字罗盘  STM32

最近买了个数字罗盘模块,调通后发现很不错,非常灵敏,测试的时候精度在1°以内。连续测量模式下,最快测量、输出速率可达75hz,模块每次测量完毕并将数据更新至寄存器后,其DRDY引脚便产生一个低电平脉冲(可以配置一个外部中断捕获DRDY引脚的下降沿,并在中断服务程序中读取数据),在STM32中可以设置一个下降沿触发的外部中断,并在中断服务程序中调用角度数据读取函数。以下为操作该模块的主要步骤。


一、IIC协议相关操作(单片机作为主机控制时钟线)


  宏定义:

  //这里用到了STM32的位带区操作,方便实现对一个位的操作

  //PB13配置为OD输出,同时外部给上拉电阻,这样既可输出信号给从机,也能

  //在PB13为漏极开路状态时接收从机的信号(STM32的IO配置为输出模式时,

  //IO口的电平也会不断地被捕获到输入寄存器中)

  //PB14配置为推挽输出,PB15配置为浮空输入

  #defineR_SDAIPB13//PB13输入寄存器

  #defineW_SDAOPB13//PB13输出寄存器

  #defineW_SCLOPB14//PB14输出寄存器

  #defineR_DRDYIPB15//PB15输入寄存器

  #defineXmsb0//X轴数字量的高8位

  #defineXlsb1//X轴数字量的低8位

  #defineZmsb2//Z轴数字量的高8位

  #defineZlsb3//Z轴数字量的低8位

  #defineYmsb4//Y轴数字量的高8位

  #defineYlsb5//Y轴数字量的低8位

  附位带宏定义:

  #defineGPIOB_ODR_Addr(GPIOB_BASE+12)//0x40010C0C

  #defineGPIOB_IDR_Addr(GPIOB_BASE+8)//0x40010C08

  #defineBITBAND_Addr(Addr,num)((volaTIleunsignedlong*)(0x42000000+32*(Addr-0x40000000)+4*num))

  #defineIPB13*BITBAND_Addr(GPIOB_IDR_Addr,13)

  #defineOPB13*BITBAND_Addr(GPIOB_ODR_Addr,13)

  #defineOPB14*BITBAND_Addr(GPIOB_ODR_Addr,14)

  #defineIPB15*BITBAND_Addr(GPIOB_IDR_Addr,15)

  启动IIC传输:

  void_iic_Start()

  {

  W_SCL=1;

  W_SDA=1;

  _delay();

  W_SDA=0;//SCL高时,拉低SDA,表示开始IIC传输,占用总线

  _delay();

  W_SCL=0;//控制SCL

  _delay();

  }

  停止IIC传输:

  void_iic_Stop()

  {

  W_SCL=1;//释放SCL(由于没有其他主器件,SCL无需开漏)

  W_SDA=0;

  发送一个字节:

  uint8_t_iic_SendByte(uint8_tdat)

  {

  uint8_TI;

  for(i=0;i《8;i++)

  {

  _delay();

  W_SDA=dat》》7;//SCL拉高之前写SDA

  dat=dat《《1;

  _delay();

  W_SCL=1;//拉高SCL,从器件开始读取SDA

  _delay();

  W_SCL=0;//重新拉低SCL

  }

  W_SDA=1;//释放SDA

  W_SCL=1;//拉高SCL,读取从器件应答信号

  //等待应答

  i=100;

  while(i&&R_SDA){i--;_delay();}

  if(i==0)//无应答

  {

  W_SCL=0;//重新拉低SCL

  return0;

  }

  else{//有应答

  _delay();

  W_SCL=0;//重新拉低SCL

  return1;

  }

  }

  _delay();

  W_SDA=1;//SCL为高时,拉高SDA表示结束ICC传输,释放总线

  }

  接收一个字节:

  uint8_t_iic_ReadByte(uint8_tAck)

  {

  uint8_ttemp,i;

  W_SDA=1;//释放SDA

  _delay();

  for(i=0;i《8;i++)

  {

  _delay();

  W_SCL=1;//拉高SCL开始读取SDA

  temp=temp《《1;

  temp|=R_SDA;//SCL拉高之后读取SDA

  W_SCL=0;//拉低SCL,从器件开始放置数据

  }

  //发送应答信号

  if(Ack)W_SDA=0;//拉低SDA表示应答

  W_SCL=1;//拉高SCL,从器件接收应答信号

  _delay();

  W_SCL=0;//重新拉低SCL

  W_SDA=1;//释放SDA

  returntemp;

  }


  二、配置HMC5883L模块

  voidHMC5883L_Init()

  {

  _iic_Start();

  _iic_SendByte(0x3c);//写操作

  _iic_SendByte(0x00);//指针指向00,配置寄存器A

  _iic_SendByte(0x78);//数据测量、输出速率75hz

  _iic_Start();//指针定位到02,模式寄存器

  _iic_SendByte(0x3c);

  _iic_SendByte(0x02);

  _iic_SendByte(0x00);//连续测量模式

  _iic_Stop();

  }

  三、读取角度数据

  接收三轴数据,处理X,Y轴的数据并计算角度:

  int16_tHMC5883L_ReadAngle()

  {

  staTIcuint8_TI;

  staticuint8_tXYZ_Data[6];//用来存储三个轴输出的数字量

  _iic_Start();

  _iic_SendByte(0x3c);//发送HMC5883L的器件地址0x3c,写操作

  _iic_SendByte(0x03);//指针指向03,Xmsb寄存器

  _iic_Start();

  _iic_SendByte(0x3d);//改为读操作

  //依次读取三个轴的数字量

  for(i=0;i《5;i++)//前5次读取发送应答信号

  {

  XYZ_Data[i]=_iic_ReadByte(1);

  }

  XYZ_Data[5]=_iic_ReadByte(0);//不应答

  _iic_Stop();

  returnatan2((double)((int16_t)((XYZ_Data[Ymsb]《《8)+XYZ_Data[Ylsb])),(double)((int16_t)((XYZ_Data[Xmsb]《《8)+XYZ_Data[Xlsb])))*(180/3.14159265)+180;//计算角度,需要包含math.h头文件

  }


  配置好IO口,调用HMC5883L_Init()后,便可调用HMC5883L_ReadAngle()读取角度值,0~360°。以下为测试时的截图:


  测试时,模块比较灵敏且精确,稍微旋转模块便有精确的变化。由于该模块是基于对地磁场的测量,此模块容易受到其他磁场的干扰,比如将该模块靠近直流电机时,便会因为电机内的磁场而降低精度甚至失灵(之前做智能小车时就遇到这个问题,要将电机内的磁场屏蔽起来才行)。

关键字:HMC5883L  数字罗盘  STM32

来源: 互联网 引用地址:http://www.eeworld.com.cn/Test_and_measurement/article_2018031219946.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:2018年5月28日国际太阳能光伏展,福禄克与您不见不散
下一篇:中兴通讯成功地完成一款支持下行Cat-18终端的研发

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

意法半导体数字罗盘引领最薄手机和平板电脑时尚潮流 [

、购物中心。   意法半导体推出的新款数字罗盘比目前已量产的罗盘尺寸缩减60%,芯片大小相当于一个单功能独立运动传感器的尺寸。同时,新模块拥有傲人的高精度感应功能、经扩展的磁场量程和最小的测量噪声。新模块的尺寸和性能优势让OEM厂商能够在移动产品内增加更多吸引眼球的功能,同时能够与消费电子微型化趋势保持同步。   LSM303D模块的最大量程虽然可达到±16g (线性加速度)和 ±12 Gauss [2] (磁场),但是在全量程范围内仍可提供极其精确的数据输出。该模块内置一个温度传感器和一个可设置FIFO (先入先出)存储区,以满足先进运动识别和智能电源管理应用。模块的先进功能包括两个可编程的中断信号。当发现运动
发表于 2012-07-05 20:48:08
意法半导体数字罗盘引领最薄手机和平板电脑时尚潮流  [

意法半导体(ST)数字罗盘引领最薄手机和平板电脑时尚潮流

和方向侦测在内的各种应用。只要把装有GPS的移动设备指向相关目标,在罗盘的指南针功能配合下,移动定位服务应用软件就可以帮助消费者查找并检索附近的信息,例如名胜古迹、酒店、购物中心。 意法半导体推出的新款数字罗盘比目前已量产的罗盘尺寸缩减60%,芯片大小相当于一个单功能独立运动传感器的尺寸。同时,新模块拥有傲人的高精度感应功能、经扩展的磁场量程和最小的测量噪声。新模块的尺寸和性能优势让OEM厂商能够在移动产品内增加更多吸引眼球的功能,同时能够与消费电子微型化趋势保持同步。 LSM303D模块的最大量程虽然可达到±16g (线性加速度)和 ±12 Gauss   (磁场),但是在全量程范围内仍可提供极其精确
发表于 2012-07-04 22:38:31

新型车辆模拟驾驶训练系统动感系统设计

上行驶的感觉一样,从而弥补现有车辆模拟驾驶训练系统的不足,提高驾驶训练的效果。 2 系统的组成及工作原理       新型车辆模拟驾驶训练系统中的动感系统主要由动感数据采集系统、动感数据无线发收系统、动感平台及其控制系统组成。   工作原理是:安装于模型车上的动感数据采集系统实时采集模型车行驶过程中姿态的动感数据,通过无线收发系统将动感数据实时传送到动感平台控制系统,进而使动感平台产生相应的动感。 3 硬件设计   3.1 动感数据采集系统   动感系统的动感数据采集使用HMR3000型数字罗盘模块。HMR3000是Honeywell公司的产品,它不仅可以测量磁场,还可以测量物体
发表于 2010-04-29 19:12:24
新型车辆模拟驾驶训练系统动感系统设计

意法半导体发布MEMS数字罗盘模块

      意法半导体(纽约证券交易所代码:STM),在单一模块内集成一个3轴数字加速计和一个3轴数字磁感应计,这款数字罗盘模块兼备高精度、小尺寸、低功耗、具有竞争力的价格等多项优点,能够满足市场对先进导航功能以及新兴的智能定位服务日益增长的需求。意法半导体的高性能系统级封装数字罗盘采用霍尼韦尔公司的磁阻技术,让便携消费电子应用设备加速采用增强的电子罗盘功能,包括方位查找、地图/显示方位、定位服务和步行方位推算。       把高性能运动检测与磁感应功能结合在一起,可在多方面提高移动设备的使用体验。意法半导体的新模块增加了向前
发表于 2010-01-15 15:37:55
意法半导体发布MEMS数字罗盘模块

C51、STM32和S3C2440中断体系的比较

/* 名称:C51、STM32和S3C2440中断体系的比较 说明:对于这三个芯片的中断体系来说,就我目前了解的, 我说:差不多。这里说的差不多,是中断的本质上差不多,都是首先中断源提出申请(比如触发了外部中断,定时器中断等),然后经过中断源屏蔽寄存器,再然后中断优先级的比较,最后CPU相应中断。(我去,这好像又回到了计算机组成原理啊)。不同的是细节,C51作为低级一点的芯片,其中断少,中断能达到的功能也少,相对来说较为简单些(无论是设计还是具体使用)。而STM32和S3C2440来说,其提供的功能较多,设计起来和使用起来要复杂的多(使用的时候得配置好多好多寄存器)。目前总结的,差不多就是这些吧。*/
发表于 2018-07-21 14:40:54

STM32_GPIO之按键输入

/* 名称:STM32_GPIO之按键输入 说明:这个实验是GPIO的输入功能。基本的思路和51单片机差不多。也是 操作相应的IO口,不过不同的是对于独立按键输入实验来说,51单片机是 需要一开始把待检测的IO口设置成高电平,然后检测其何时被拉低。而对 于STM32来说,其GPIO端口就可以设置成上拉输入,即不需要再人为的把对 应的对应的IO口设置成高电平,硬件电路会自动把对应端口引脚拉成高电 平。还有一点关于条件编译要说的:这个ifndef… #endif 一般用在头文件中。书上说为了防止重复编译。就我目前了解的来看,在实际应用中,如果在两个.c源文件中都
发表于 2018-07-21 14:37:58

小广播

更多相关热搜器件

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved