OpenEdv-开源电子网

标题: 有大佬 知道怎么读GY—87的hmc085531的值 [打印本页]

作者: 罗涛    时间: 2018-11-4 16:57
标题: 有大佬 知道怎么读GY—87的hmc085531的值
    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;
  }


作者: 正点原子    时间: 2018-11-5 01:47
帮顶




欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/) Powered by Discuz! X3.4