OpenEdv-开源电子网

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

有大佬 知道怎么读GY—87的hmc085531的值

[复制链接]

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2018-10-13
在线时间
40 小时
发表于 2018-11-4 16:57:21 | 显示全部楼层 |阅读模式
5金钱
    iic 没有一点问题 mpu6050 和bmp085 也能读出出来 就是hmc085531读出来  我想问问是不是我读取方式不对
     下面是的代码


#ifndef _HMC58831_H
#define _HMC58831_H
#include "myiic.h"
#define        HMC5883L_Addr   0x1E        //磁场传感器器件地址  
#define CONFIG_A_REG    0x00    //配置寄存器 A 地址
#define CONFIG_B_REG    0x01    //配置寄存器 B 地址
#define CONFIG_C_REG    0x02    //模式寄存器   地址
#define X_MSB_REG       0x03    //数据输出 X MSB 寄存器
#define X_LSB_REG       0x04    //数据输出 X LSB 寄存器
#define Z_MSB_REG       0x05    //数据输出 Z MSB寄存器
#define Z_LSB_REG       0x06    //数据输出 Z LSB 寄存器
#define Y_MSB_REG       0x07    //数据输出 Y MSB 寄存器
#define Y_LSB_REG       0x08    //数据输出 Y LSB 寄存器

u8 HMC58831_Write_Byte(u8 reg,u8 cmd);
short HMC58831_Read_Bybt(u8 reg);
void HMC5883L_Init(void);
short Read_HMC58831(void);
#endif


#include "hmc58831.h"
#include "math.h"
u8 HMC58831_Write_Byte(u8 reg,u8 cmd)
{
        IIC_Start();
        IIC_Send_Byte(0X3c);    //写指令  HMC5883L_Addr << 1| 0
        if(IIC_Wait_Ack() == False)
        {
                return False;
        }  
        IIC_Send_Byte(reg);
        IIC_Wait_Ack();
       
        IIC_Send_Byte(cmd);
        IIC_Wait_Ack();
        IIC_Stop();
        return True;
}
short HMC58831_Read_Bybt(u8 reg)
{
        short receive;
    IIC_Start();
        IIC_Send_Byte(0x3c);   //HMC5883L_Addr <<1| 0
        IIC_Wait_Ack();
        IIC_Send_Byte(reg);
        IIC_Wait_Ack();
        IIC_Send_Byte(0x3d);      //HMC5883L_Addr <<1 | 1
        IIC_Wait_Ack();
    receive = IIC_Read_Byte(1);
    receive = (receive << 8) | IIC_Read_Byte(0);
        IIC_Stop();
    return receive;       
}
void HMC5883L_Init(void)
  {
          
        HMC58831_Write_Byte(CONFIG_A_REG,0x14);  //配置寄存器A:采样平均数1 输出速率75Hz 正常测量
    HMC58831_Write_Byte(CONFIG_C_REG,0x00);  //模式寄存器:连续测量模式
  }

  short Read_HMC58831(void)
  {
            u8 res ;
           short x=0,y=0,z=0;
           float angle = 0;
          res = HMC58831_Write_Byte(CONFIG_A_REG,0x14);
          printf("res = %d\r\n",res);
          HMC58831_Write_Byte(CONFIG_B_REG,0x20);
          HMC58831_Write_Byte(CONFIG_C_REG,0x00);
          
          delay_ms(5);
          
          x = HMC58831_Read_Bybt(X_MSB_REG);
         // z = HMC58831_Read_Bybt(Z_MSB_REG);
          y = HMC58831_Read_Bybt(Y_MSB_REG);
          
          if(x > 0x7fff)x -=0xffff;
      if(y > 0x7fff)y -=0xffff;         //使角度在0~360之间;
      if(z > 0x7fff)z -=0xffff;          
          
          angle = atan2((double)y,(double)x) * (180 / 3.14159265) + 180;
          return angle;
  }

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-11-5 01:47:44 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 03:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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