初级会员
积分 95
金钱 95
注册时间 2018-10-13
在线时间 40 小时
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;
}
我来回答