OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10817|回复: 14

分享一个 hmc5883l (gy-271)电子指南针电子罗盘模块的程序

[复制链接]

4

主题

19

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-11-1
在线时间
9 小时
发表于 2018-11-19 16:38:02 | 显示全部楼层 |阅读模式
楼主这几天疯狂的学习这个模块,很是头疼,经过各种办法与尝试  有了以下的程序   亲测可用,在这里和大家分享一下,有写的不好的地方还请大家指出。


[/mw_shl_code]
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "key.h"
#include "nrf24l01.h"
#include "pwm.h"
#include "iic.h"
#include "hmc5883l.h"
#include "math.h"

        u8 BUF[6];

int main()
{        
        
        SysTick_Init(168);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
        LED_Init();
        USART1_Init(115200);
        NRF24L01_Init();
        Init_HMC5883();
        IIC_Init();
        
        
   int x,y,z;
        double angle;
        u8 BUF[6];
        while(1)
        {               
               
      Multiple_read_HMC5883(BUF);
                x=BUF[0] << 8 | BUF[1]; //
            z=BUF[2] << 8 | BUF[3]; //
            y=BUF[4] << 8 | BUF[5]; //分别读取x y z轴的数据
                if(x>32768)
                        x = -(0xFFFF - x + 1);
                if(z>32768)
                        z = -(0xFFFF - z + 1);
                if(y>32768)
                        y = -(0xFFFF - y + 1);
                if(x<0)            //这里的数据楼主读出来x偶尔有负整数,而y永远是负整数
                        x=-x;
                angle= (atan2((double)y,(double)x) * (180 / 3.14159265) + 180); // angle in degrees   这个公式算出来的角度是与x轴的夹角度数,但是x轴楼主觉得是一直在变得啊,这个角度到底是什么楼主现在也不能确定。。。  所以这个公式楼主并没有采用
//楼主采用的是直接去读x y z的数据,因为模块动的时候这些数据也在变化,水平转动的时候z轴是不变的,只有x y在变,所以楼主采用读取xy数据,根据xy的数据去确定大致的方向。
//以下是确定方向的代码      xy的值是楼主自己测出来然后拿手机上面的指南针对比的,所以每个人去的数据可能不一样,以下是楼主的数据
if((100< x )&&(x <150)&&(650< (-y))&&(700>(-y)))
{
printf("dong %d%d\r\n",x,-y);   //指向东面,同时打印出x -y的值
delay_ms(50);
}
else
        printf("x,y %d%d\r\n",x,-y);      //如果指的不是东面,就打印出x -y的值   指向其他方向的楼主没有写,因为数据有点多,今天不想测了。。。
  
               
        }
}
[/mw_shl_code]

这是头文件
[C] 纯文本查看 复制代码
#ifndef __HMC5883L_H
#define __HMC5883L_H
#include "system.h"
#include "iic.h"

#define SlaveAddress 0x3c    //从机地址

void Init_HMC5883(void);
void Write_HMC5883(u8 add, u8 da);
u8 Read_HMC5883(u8 REG_Address);
void Multiple_read_HMC5883(u8*BUF);

#endif







正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

19

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-11-1
在线时间
9 小时
 楼主| 发表于 2018-11-19 16:40:12 | 显示全部楼层
这是c文件


[mw_shl_code=c,true]#include "hmc5883l.h"
#include "iic.h"
#include "SysTick.h"


#define SlaveAddress 0x3c    //从机地址


void Init_HMC5883(void)
{
        delay_ms(5);
        IIC_Init();
        Write_HMC5883(0x02, 0x00);                //连续测量模式
}

void Write_HMC5883(u8 add, u8 da)
{
    IIC_Start();                  //起始信号
    IIC_Send_Byte(SlaveAddress);   //发送设备地址+写信号
        IIC_Wait_Ack();

    IIC_Send_Byte(add);    //内部寄存器地址,请参考中文pdf
        IIC_Wait_Ack();

    IIC_Send_Byte(da);       //内部寄存器数据,请参考中文pdf
        IIC_Wait_Ack();

    IIC_Stop();                   //发送停止信号
}

u8 Read_HMC5883(u8 REG_Address)
{   
        u8 REG_data;
    IIC_Start();                          //起始信号
    IIC_Send_Byte(SlaveAddress);           //发送设备地址+写信号
        IIC_Wait_Ack();

    IIC_Send_Byte(REG_Address);                   //发送存储单元地址,从0开始       
        IIC_Wait_Ack();

    IIC_Start();                          //起始信号
    IIC_Send_Byte(SlaveAddress+1);         //发送设备地址+读信号
        IIC_Wait_Ack();

    REG_data=IIC_Read_Byte(0);              //读出寄存器数据
        IIC_Stop();                           //停止信号
    return REG_data;
}

//******************************************************
//
//连续读出HMC5883内部角度数据,地址范围0x3~0x5
//
//******************************************************
void Multiple_read_HMC5883(u8*BUF)
{   u8 i;
    IIC_Start();                          //起始信号
    IIC_Send_Byte(SlaveAddress);           //发送设备地址+写信号
        IIC_Wait_Ack();
    IIC_Send_Byte(0x03);                   //发送存储单元地址,从0x3开始       
        IIC_Wait_Ack();
    IIC_Start();                          //起始信号
    IIC_Send_Byte(SlaveAddress+1);         //发送设备地址+读信号
        IIC_Wait_Ack();
         for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF
    {
        
        if (i == 5)
        {
           BUF = IIC_Read_Byte(0);          //最后一个数据需要回NOACK
        }
        else
        {
          BUF = IIC_Read_Byte(1);          //返回ACK
       }
   }
    IIC_Stop();                          //停止信号
}
[/mw_shl_code]
回复 支持 1 反对 0

使用道具 举报

4

主题

19

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-11-1
在线时间
9 小时
 楼主| 发表于 2018-11-19 16:41:13 | 显示全部楼层
@正点原子 原子哥 求帮顶,让更多大神看看这个程序。。
回复 支持 反对

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2018-11-19 17:45:58 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-11-17
在线时间
1 小时
发表于 2018-11-19 19:21:20 | 显示全部楼层
兄弟,现在能看到吗
回复 支持 反对

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2018-1-22
在线时间
21 小时
发表于 2018-12-18 19:19:32 | 显示全部楼层
感谢老哥的分享
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2018-12-19 02:10:29 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2018-12-20
在线时间
0 小时
发表于 2019-1-5 01:05:46 | 显示全部楼层
那个公式应该是x轴和正北或者正南的夹角吧?他测出来的数据应该是磁通量的大小。
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-10-17
在线时间
9 小时
发表于 2019-3-7 17:05:56 | 显示全部楼层
感谢老哥的分享
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-10-17
在线时间
9 小时
发表于 2019-5-13 16:29:12 | 显示全部楼层
兄弟,为啥前面包含了无线模块的头文件?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-8-13
在线时间
1 小时
发表于 2021-2-28 11:30:25 | 显示全部楼层
您好 您能把gy271的工程文件源代码分享给我么,我现在在进行的项目重罗盘方面遇到了些问题 ,邮箱:745507209@qq.com 谢谢您
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-6-30
在线时间
7 小时
发表于 2021-3-16 14:19:26 | 显示全部楼层
zhenghonghe 发表于 2021-2-28 11:30
您好 您能把gy271的工程文件源代码分享给我么,我现在在进行的项目重罗盘方面遇到了些问题 ,邮箱: 谢谢您

可以一起交流,我研究的比你靠前
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2020-10-6
在线时间
40 小时
发表于 2021-7-10 09:21:40 | 显示全部楼层
您好,gy271的工程文件源代码能给我一份吗 ,这边我也有点问题,我想参考下,邮箱:2297379509@qq.com 谢谢了
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-9-15
在线时间
4 小时
发表于 2021-10-6 17:09:33 | 显示全部楼层
您好,WINKANG!
您上面说的gy271的工程文件源代码是否能给我一份,邮箱:1308168709@qq.com。万分感谢!
回复 支持 反对

使用道具 举报

14

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2019-12-4
在线时间
29 小时
发表于 2021-10-16 19:28:04 | 显示全部楼层

您好,您上面说的gy271的工程文件源代码是否能给我一份,邮箱:1013083447@qq.com。万分感谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 20:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表