基本信息:测量范围-8~8G、16位ADC采样、-40~85℃、最大200HZ的数据输出率。

重点来了:淘宝上面现在买的三轴磁传感器模块GY-273,其实用的都是QMC5883,但是却标的是HMC5883,最重要的是两个芯片的IIC地址、寄存器也都不一样,这实在是太坑了啊。

寄存器以及IIC地址:

寄存器从00H-0DH,14个寄存器。

7位IIC地址0x0D ,如果需要其他地址,联系厂家订做。

======================================================================================

1、通过读取ID,查看是否能检测到芯片:

bool CheckQMC5883Chip()
{uint8_t ChipID=0;    I2cReadByte( 0, QMC5883_ADDRESS, QMC5883_REG_PRODUCTID, &ChipID );if(ChipID==0xFF){return true;}else   {return false;}
}

读取寄存器0DH,读数固定为0xFF,也可以用于测试iic驱动是否正常,当然也可以用于判断传感器是否存在。

2、设置芯片的工作模式:

主要设置控制寄存器1和控制寄存器2

其中,控制寄存器1主要设置采样模式:待机模式和连续测量模式,上电之后处于待机模式;

数据输出速率(ODR):四个特定速率,10hz、50hz、100hz、200hz(单片机读数速率不能超过相应的数据输出速率);

满量程范围:2G、8G(量程越大,精度也就越低;反之);

过采样率:64、128、256、512。

void InitQMC5883()
{I2cWriteByte( 0, QMC5883_ADDRESS, QMC5883_REG_CTRL2, QMC5883_CMD_SOFT_RST_ENABLE );      //使能软件复位I2cWriteByte( 0, QMC5883_ADDRESS, QMC5883_REG_CTRL1, QMC5883_CMD_MODE_CON|QMC5883_CMD_ODR_10HZ|QMC5883_CMD_RNG_8G|QMC5883_CMD_OSR_512 );//连续模式、满量程为8G、过采样率I2cWriteByte( 0, QMC5883_ADDRESS, QMC5883_REG_CTRL2, QMC5883_CMD_INT_DISABLE|QMC5883_CMD_ROL_PNT_ENABLE );//不使用中断,数据指针自动移动到下一个地址(在寄存器00H~05H之间)
}

3、读数

主要是寄存器00H~05H,连续测量模式下,根据设置的速率数据周期更新,是有符号数据,范围在-32768~32768之间。

void GetQMC5883Data()
{int16_t mxyz[10][3] = {0};int32_t avermxyz[3]={0};uint8_t buffer[6]={0};static float  magGaussData[3] = {0.0};static uint8_t cnt=0;I2cReadData( 0, QMC5883_ADDRESS, QMC5883_REG_DATA, buffer, 6 );printf("Xl=%d,Xh=%d,Yl=%d,Yh=%d,Zl=%d,Zh=%d\r\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5]);mxyz[cnt][0] = (int16_t)(buffer[1] << 8 | buffer[0]);  mxyz[cnt][1] = (int16_t)(buffer[3] << 8 | buffer[2]);            mxyz[cnt][2] = (int16_t)(buffer[5] << 8 | buffer[4]); cnt++;if(cnt>=10){cnt=0;for(uint8_t i=0,j=0;i<3;i++){for(j=0;j<10;j++){avermxyz[i]+=mxyz[j][i];}avermxyz[i]=avermxyz[i]/10;}printf("average original data :x=%d,y=%d,z=%d\r\n",avermxyz[0],avermxyz[1],avermxyz[2]);for(uint8_t k=0;k<3;k++){   magGaussData[k]=magGaussData[k]-32768; //32768:Null Field OutputmagGaussData[k]=avermxyz[k]/3000;      //3000:sensitivity, 3000 counts/G}printf("convert the raw data :x=%f,y=%f,z=%f\r\n",magGaussData[0],magGaussData[1],magGaussData[2]);printf("\r\n");}DelayMs(3000);
}

读数减去32768是因为,是有磁场是有符号数,除以3000是满量程在8G的时候对应的灵敏度。

4、其他

(1)SET/RESET寄存器

我查阅了其他的磁传感器,set/reset功能主要用于防止芯片被磁化,设置这个寄存器之后,需要重新初始化芯片。

(2)状态寄存器

中断产生的时候需要读取这个寄存器,查询中断的类型,其中DRDY位,在数据转化完成之后置1、读取数据寄存器之后自动清0。

如要使能中断,需要配置INT引脚连接到mcu,mcu对应的引脚设置为输入中断,会产生上升沿中断,同时控制寄存器2的INT_ENB字段也要设置为0。

(3)温度寄存器

精度100LSB/℃,说直白点,读数需要除以100,才是真是温度。

将寄存器以及需要设置的参数定义如下:


#define QMC5883_REG_DATA       0x00
#define QMC5883_REG_OUT_X_L    0x00
#define QMC5883_REG_OUT_X_M    0x01
#define QMC5883_REG_OUT_Y_L    0x02
#define QMC5883_REG_OUT_Y_M    0x03
#define QMC5883_REG_OUT_Z_L    0x04
#define QMC5883_REG_OUT_Z_M    0x05#define QMC5883_REG_STATUS     0x06#define QMC5883_DRDY_BIT0      //0: no new data, 1: new data is ready#define QMC5883_OVL_BIT1       //0: normal,      1: data overflow#define QMC5883_DOR_BIT2       //0: normal,      1: data skipped for reading#define QMC5883_REG_TEMP_OUT_L 0x07
#define QMC5883_REG_TEMP_OUT_H 0x08#define QMC5883_REG_CTRL1      0x09#define QMC5883_CMD_MODE_STANDBY     0x00  //mode #define QMC5883_CMD_MODE_CON         0x01#define QMC5883_CMD_ODR_10HZ         0x00  //Output Data Rate#define QMC5883_CMD_ODR_50HZ         0x04#define QMC5883_CMD_ODR_100HZ        0x08#define QMC5883_CMD_ODR_200HZ        0x0C#define QMC5883_CMD_RNG_2G           0x00  //Full Scale#define QMC5883_CMD_RNG_8G           0x10    #define QMC5883_CMD_OSR_512          0x00  //Over Sample Ratio#define QMC5883_CMD_OSR_256          0x40    #define QMC5883_CMD_OSR_128          0x80    #define QMC5883_CMD_OSR_64           0xC0    #define QMC5883_REG_CTRL2      0x0A#define QMC5883_CMD_INT_ENABLE       0x00 #define QMC5883_CMD_INT_DISABLE      0x01#define QMC5883_CMD_ROL_PNT_ENABLE   0x40  //pointer roll-over function,only 0x00-0x06 address#define QMC5883_CMD_ROL_PNT_DISABLE  0x00 #define QMC5883_CMD_SOFT_RST_ENABLE  0x80#define QMC5883_CMD_SOFT_RST_DISABLE 0x00 #define QMC5883_REG_SET_RESET  0x0B#define QMC5883_CMD_SET_RESET        0x01 #define QMC5883_REG_PRODUCTID  0x0D           //chip id :0xFF

三轴磁传感器QMC5883相关推荐

  1. 基于椭球 磁补偿 matlab,基于椭球拟合的三轴磁传感器快速标定补偿方法

    第4期(总第173期) 2012年8月 机械工程与自动化 MECHANICAL ENGINEERING & AUTOMATION No.4Aug. 文章编号:1672-6413(2012)04 ...

  2. 基于椭球 磁补偿 matlab,基于椭球拟合的三轴磁传感器误差补偿方法.pdf

    第 2 5卷 第7期 2 0 1 2年 7月 传 感 技 术 学 报 C HI NE S E J OU R NAL O F S E NS OR S AND A C T UA T OR S V0 1 2 ...

  3. 全球与中国三轴磁传感器市场深度研究分析报告

    [报告篇幅]:91 [报告图表数]:141 [报告出版时间]:2022年2月 报告摘要 2021年全球三轴磁传感器市场销售额达到了 亿美元,预计2028年将达到 亿美元,年复合增长率(CAGR)为 % ...

  4. sc7cb27180 士兰微_供应 SILAN/士兰微 SC7A30E SC7A30 LGA10-3A 加速度计/三轴磁传感器

    产品用途:LED显示屏.LED照明.LED电源.车载显示屏.网络摄像仪器.网络串口服务器.安防产品.车充.车载DVD等 品牌:矽恩微.BCD.上海芯龙.亚成微.台湾通嘉.台湾普诚.力生美.上海天丰.通 ...

  5. 【雕爷学编程】Arduino动手做(147)---QMC5883L三轴罗盘模块

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  6. shineblink QMC5883三轴地磁传感器(指北针)

    @TOC 一.本例程实现功能 通过QMC5883三轴地磁传感器模块测量XYZ三轴的地磁强度以及航向角(Azimuth),并通过print()函数在电脑串口调试终端打印输出. 二.基本概念 1. 地磁传 ...

  7. 三轴加速度传感器和六轴惯性传感器_一文读懂汽车MEMS惯性传感器的七大应用(上)...

    本文中,我们将研究汽车MEMS惯性传感器的应用,描述它们的工作原理,并讨论如何利用MEMS惯性传感器来实现更大的应用改进. 当前,微机电系统(MEMS)传感器已被大多数汽车工程师视为尖端技术或边缘技术 ...

  8. 2022-2028年中国三轴陀螺仪行业市场深度分析及投资前景分析报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了三轴陀螺仪行业相关概述.中国三轴陀螺仪行业运行环境.分析了中国三轴陀 ...

  9. 对于STM32F103控制的三轴机械臂基本功能测试-关节转动控制

    ➤01 机械臂调试 1.简介 对于 基于STM32对于三轴机械臂控制器设计 的设计已经进行了如下的调试: 对于STM32F103三轴机械臂控制器进行基本功能测试-关节角度读取 对于STM32F103三 ...

最新文章

  1. 在 Linux“.NET研究” 操作系统中运行 ASP.NET 4 (下)
  2. Silverlight 4常用StringFormat格式总结
  3. 机器人视觉——使用numpy进行像素的处理 || 获取图像的属性 || 感兴趣区域ROI || 通道的拆分与合并
  4. org.hibernate.annotationexception no identifier specified for entity
  5. php 重定向 cookie,php – 如何在CURL重定向上传递Cookie?
  6. Enterprise Library—缓存应用程序块
  7. 音频处理入门笔记(技术英文缩写)
  8. 程序员的英语水平要达到什么程度才行?
  9. 一键备份服务器文件夹权限,教大家一键设置局域网共享文件夹权限
  10. 单片机c语言中断延时,单片机中C语言延时函数
  11. 项目中引入阿里巴巴矢量字体图标库
  12. MATLAB-数字图像处理 量化
  13. tapestry3常见问题
  14. 骆小刚:Linux后台服务启动方式systemd、daemon、nohup大比拼
  15. 【Py】隐藏warnings
  16. 如何正确使用 GC.SuppressFinalize()?
  17. linux 内核 空指针,Linux 内核IS_ERR函数
  18. rtx2060什么水平_rtx2060性能(rtx2060显卡什么水平)
  19. 绿芯GreenChip电容式触控触摸IC型号性能介绍
  20. php程序开发编辑器有哪些,常用的PHP编辑器有哪些?

热门文章

  1. Android 源码修改,使第三方应用可以直接使用su命令
  2. PR如何把视频拉满整个屏幕
  3. 利用VBA批量替换多个Word内容(带窗体界面/支持备份、大小写、通配符等功能)
  4. C51---3.2 独立按键控制LED亮灭状态
  5. 2018河北省赛--神殿(位运算)
  6. Arduino智能小车——调速篇
  7. IDEA 2019 图文教程: 从入门到上瘾教程
  8. 【面筋烧烤手册】HTTP数据传输专题
  9. php获取计算机ip代码,PHP 获取ip地址代码汇总
  10. 莫氏硬度6级以上,手机玻璃其实很硬【转】