打印

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

[复制链接]
609|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一亚麻怡|  楼主 | 2018-7-10 17:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
楼主这几天疯狂的学习这个模块,很是头疼,经过各种办法与尝试  有了以下的程序   亲测可用,在这里和大家分享一下,有写的不好的地方还请大家指出。


[/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
",x,-y);   //指向东面,同时打印出x -y的值
delay_ms(50);
}
else
        printf("x,y %d%d
",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

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

404

主题

404

帖子

0

粉丝