OpenEdv-开源电子网

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

求助,HMC5883L读取数据问题

[复制链接]

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
发表于 2016-3-22 20:53:59 | 显示全部楼层 |阅读模式
本帖最后由 joyce931015 于 2016-3-22 21:07 编辑

求大神,本人菜鸟一枚。最近研究HMC5883L读取水平面偏航数据。具体程序基本仿照原子写的,但是用友善串口助手读出的数据是这样的,见图片。不知道是什么问题。
声明:1.本人买的板子没有加上拉电阻,不知道是不是必须的。也不确定硬件是否有问题。
          2.输出数据是直接MSB+LSB的,还未经过角度换算,也就是输出的是原始数据。
想请教各位大神,有没有遇到类似问题的。如果我说的不够详细请指出,我会补充。真心学习,真心请教。但本人刚刚入门,比较外行,大神轻喷。非常感谢





友善串口助手数据

友善串口助手数据

main函数中程序

main函数中程序
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2020-2-27
在线时间
0 小时
发表于 2020-5-25 10:17:32 | 显示全部楼层
楼主求救时声嘶力竭,等别人需要了解同一问题时却吨遁的无影无踪,人品啊人品?
回复 支持 1 反对 0

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
 楼主| 发表于 2016-3-22 20:54:34 | 显示全部楼层
自己先顶一个,希望得到各位指点帮助
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
 楼主| 发表于 2016-3-22 21:00:07 | 显示全部楼层
说明一下,主板用的STM32F103,并且已经用上MPU6050陀螺仪功能,想用电子罗盘数据配合陀螺仪数据读出偏航角。串口使用全部是模拟IIC协议通讯,并且MPU6050已试验成功。但HMC5883L刚开始调试,读数不太成功
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
 楼主| 发表于 2016-3-22 21:22:44 | 显示全部楼层
我看别的帖子,需要在while(1)里加一句
while(1)
{
hmc5883_Init();       
Multiple_read_HMC5883(BUF);
I_X=(short)((BUF[0]<<8)+BUF[1]);  //
I_Z=(short)((BUF[2]<<8)+BUF[3]);  //
I_Y=(short)((BUF[4]<<8)+BUF[5]);  //
}
但貌似没什么用。求哪位大神解释一下
回复 支持 反对

使用道具 举报

14

主题

82

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2014-12-11
在线时间
64 小时
发表于 2016-3-23 09:56:01 | 显示全部楼层
[mw_shl_code=c,true]void hmc5883_init(void)
{
i2cWrite(HMC5883_ADDR,0x00,0X74);
  i2cWrite(HMC5883_ADDR,0x01,0X80);
  i2cWrite(HMC5883_ADDR,0x02,0);
}[/mw_shl_code]
我的初始化代码
[mw_shl_code=applescript,true]void hmc5883_read(void)
{
   uint8_t xdat[6]        ,i;
   hmc5883_OK=0;
   if(i2c_Read(HMC5883_ADDR,0x09)&1==1)
           {
       i2cread(HMC5883_ADDR,0x03,6,xdat);
           mag[0]=(((int16_t)xdat[0])<<8)|xdat[1];
           mag[2]=(((int16_t)xdat[2])<<8)|xdat[3];
           mag[1]=(((int16_t)xdat[4])<<8)|xdat[5];

           for(i=0;i<3;i++)
            {
               
            //if(mag>32768)
              //mag = -(0x10000 - mag );
            if(mag_sym==0&&usart_command==2)
             {
                   mmax=mag;
                  mmin=mag;
                  }
            else if(mag_sym==1&&usart_command==2)
         {
              if(mmax<mag)
                     mmax=mag;
              if(mmin>mag)
                    mmin=mag;
                 }
                 mag-=magoffset;
            mag_f=(float)mag;//*1.3*100.0/0x7ff;       
          }
          
          mag_sym=1;
          
          hmc5883_OK=1;
          }
}[/mw_shl_code]
读取处理数据  好久没弄了 忘了读出的数据是什么样的了
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
 楼主| 发表于 2016-3-23 10:51:08 | 显示全部楼层
学习一下,谢谢。看看效果怎么样
回复 支持 反对

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-3-23 10:54:32 | 显示全部楼层
HMC5883和MPU6050是完全一样的。我之前用的STM32,加了一大堆头文件和函数什么的。前阵子在用别的芯片,感觉费事,就直接调在I2C时把两个传感器的配置一写:
  txBuf1[0] = 0x6B;
  txBuf1[1] = 0x00;
  bspI2cWrite(txBuf1, 2, 0x68);
  txBuf1[0] = 0x19;
  txBuf1[1] = 0x07;
  bspI2cWrite(txBuf1, 2, 0x68);
  txBuf1[0] = 0x1A;
  txBuf1[1] = 0x06;
  bspI2cWrite(txBuf1, 2, 0x68);
  txBuf1[0] = 0x1C;
  txBuf1[1] = 0x08;
  bspI2cWrite(txBuf1, 2, 0x68);
  txBuf1[0] = 0x1B;
  txBuf1[1] = 0x00;
  bspI2cWrite(txBuf1, 2, 0x68);

  txBuf1[0] = 0x02;
  txBuf1[1] = 0x00;
  bspI2cWrite(txBuf1, 2, 0x1E);
  txBuf1[0] = 0x00;
  txBuf1[1] = 0x18;
  bspI2cWrite(txBuf1, 2, 0x1E);
  txBuf1[0] = 0x01;
  txBuf1[1] = 0x00;
  bspI2cWrite(txBuf1, 2, 0x1E);
函数是自己写的,你不用管,反正意思就是给地址0x6B写入0x00等等。。。HMC5883也是一样。
然后怎么读MPU6050,你就怎么读HMC5883,过程是完全一样的,注意改一下地址就行了。
你读MPU6050时,只需要读一个X轴,然后把缓存区设成长度为6,它就能把XYZ三轴的高低位都读出来。HMC5883也是一样。只需要去读第一个X轴的地址。
自在随心
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
 楼主| 发表于 2016-3-24 11:27:38 | 显示全部楼层
[mw_shl_code=c,true]void Multiple_read_HMC5883(u8* BUF)
{   u8 i;
    IIC_Start();                          
    IIC_Send_Byte(SlaveAddress);           
    IIC_Wait_Ack();
    IIC_Send_Byte(0x03);                  
    IIC_Wait_Ack();
    IIC_Start();                          
    IIC_Send_Byte(SlaveAddress+1);         
    IIC_Wait_Ack();
     for (i=0; i<6; i++)                     
    {
         
        if (i == 5)
        {
           BUF = IIC_Read_Byte(0);  
        }                                            
        else
        {
          BUF = IIC_Read_Byte(1);
        }                                       
      
         }
         IIC_Stop();                    
}[/mw_shl_c这是我的读取数据的代码,并没有发现错误
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
 楼主| 发表于 2016-3-24 14:44:18 | 显示全部楼层
C:\Users\LENOVO\Desktop\3.PNG
换个程序,这又是怎么回事
3.PNG
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
 楼主| 发表于 2016-3-24 15:45:32 | 显示全部楼层
本帖最后由 joyce931015 于 2016-3-24 15:46 编辑

之前出现-1的原因找到了,是因为全部转换成short的原因。现在去掉short后结果是这样的,有谁能解释为什么加上short会输出-1.还有现在输出超量程可能是什么原因
5.PNG
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
 楼主| 发表于 2016-3-24 16:59:33 | 显示全部楼层
这里是所有程序。
主函数:[mw_shl_code=applescript,true]#include "sys.h"
#include "delay.h"
#include"Init.h"
#include "led.h"
#include "usart.h"
#include "IOI2C.h"
#include "stm32f10x_it.h"
#include "HMC5883L.h"

float I_X,I_Y,I_Z,Iangle;
u8 BUF[6];

int main(void)
{
        Stm32_Clock_Init(9);   //system clock
        delay_init(72);        //SysTick initialization
        DELAY_init();          //delay function initialization
        NVIC_Configuration();  //Nested Vectored Interrupt Controller configuration
        TIM_Configuration();//open or close the timer for testing
        TIM3_Configuration();
        uart_init(115200);           //uart initialization 256000       
        IIC_Init();            // IIC initialization
  hmc5883_Init();         
        LED_Init();                                     //led initialization
               
while(1)
{  
        if(flag_show1)
                {       
                          flag_show1 = 0;
                        time2_count1 = 0;
                        delay_ms(10);
                  hmc5883_Init();         
                  Multiple_read_HMC5883(BUF);
                        I_X=(BUF[0]<<8)|BUF[1];  //X轴数据
                        I_Z=(BUF[2]<<8)|BUF[3];//Z轴数据
                        I_Y=(BUF[4]<<8)|BUF[5]; //Y轴数据
  delay_ms(10);
                         printf(" %.1f\n %.1f\n %.1f\n",I_X,I_Y,I_Z);//输出3轴原始数据
                  }
         }
}[/mw_shl_code]
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
 楼主| 发表于 2016-3-24 17:10:52 | 显示全部楼层
HM5883.c文件
#include "HMC5883L.h"
#include "delay.h"
#include "IOI2C.h"
#include "usart.h"

#define SlaveAddress 0x3C

void hmc5883_Init(void)
{
write_hmc5883(0x00,0x70);  //存储器A,采样平均数8,传输速度15HZ
write_hmc5883(0x01,0x00);  //存储器B增益1370高斯
write_hmc5883(0x02,0x00);  //连续采样模式
}

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

    IIC_Send_Byte(add);    //内部寄存器地址
    IIC_Wait_Ack();

    IIC_Send_Byte(da);       //数据
    IIC_Wait_Ack();

    IIC_Stop();                   //停止信号
    delay_ms(10);//&#209;óê±
}

u8 Read_HMC5883(u8 reg_Address)
{   
    u8 reg_data;
    IIC_Start();                          //
    IIC_Send_Byte(SlaveAddress);           //
    IIC_Wait_Ack();

    IIC_Send_Byte(reg_Address);                   //发送设备地址+写信号
    IIC_Wait_Ack();

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

    reg_data=IIC_Read_Byte(0);              //
    IIC_Stop();                           //
    delay_ms(5);//
    return reg_data;
}

//******************************************************
//
//连续读取HMC5883数据,地址范围0x03~0x08
//
//******************************************************
void Multiple_read_HMC5883(u8* BUF)
{   u8 i;
    IIC_Start();                          //
    IIC_Send_Byte(SlaveAddress);           //
    IIC_Wait_Ack();
    IIC_Send_Byte(0x03);                   //
    IIC_Wait_Ack();
    IIC_Start();                          //
    IIC_Send_Byte(SlaveAddress+1);         //
    IIC_Wait_Ack();
     for (i=0; i<6; i++)                      //
    {
         
        if (i == 5)
        {
           BUF[i] = IIC_Read_Byte(0);  
                                }                                        //       最后一次发送NACK
        else
        {
          BUF[i] = IIC_Read_Byte(1);
                                }                                        //不是最后一次发送ACK应答信号
      
         }
         IIC_Stop();                     //
          printf(" i'm hmcmulread \n");
}
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
 楼主| 发表于 2016-3-24 17:20:15 | 显示全部楼层
IIC.c文件
#include "IOI2C.h"
#include "delay.h"
#include "usart.h"       
void IIC_Init(void)
{                       
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                        //使能时钟   

                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;  //初始化PB8,PB9为开漏输出,速度50MHZ
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          //应用配置到GPIOB
          GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9);
          GPIO_Init(GPIOB, &GPIO_InitStructure);
        printf(" i'm iic init\n");
}

void IIC_Start(void)
{
        SDA_OUT();     //
        IIC_SDA=1;                    
        IIC_SCL=1;
        delay_us(4);
        IIC_SDA=0;//START:when CLK is high,DATA change form high to low
        delay_us(4);
        IIC_SCL=0;
}

void IIC_Stop(void)
{
        SDA_OUT();//
        IIC_SCL=0;
        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        IIC_SCL=1;
        IIC_SDA=1;//
        delay_us(4);                                                                  
}

u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA_IN();      //  
        IIC_SDA=1;delay_us(1);          
        IIC_SCL=1;delay_us(1);         
        while(READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>50)
                {
                        IIC_Stop();
                        return 1;
                }
          delay_us(1);
        }
        IIC_SCL=0;//           
        return 0;  
}

void IIC_Ack(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=0;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}
       
            
void IIC_NAck(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=1;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}                                                                              

void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
        SDA_OUT();             
    IIC_SCL=0;
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1;           
                delay_us(2);   
                IIC_SCL=1;
                delay_us(2);
                IIC_SCL=0;       
                delay_us(2);
    }         
}          
   

u8 IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();
    for(i=0;i<8;i++ )
        {
        IIC_SCL=0;
        delay_us(2);
                IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
                delay_us(2);
    }                                         
    if (ack)
        IIC_Ack(); //
    else
        IIC_NAck();//  
    return receive;
}
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
 楼主| 发表于 2016-3-24 17:20:47 | 显示全部楼层
请教大神,到底是硬件问题还是软件程序问题
回复 支持 反对

使用道具 举报

14

主题

82

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2014-12-11
在线时间
64 小时
发表于 2016-3-24 17:39:42 | 显示全部楼层
初始化里都是推挽输出????
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
 楼主| 发表于 2016-3-28 15:52:39 | 显示全部楼层
硬件上,我只连接了VCC,DRD,SCL和SDA。还剩一个引脚DYDR没连接,不知道有何用
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-5-20
在线时间
5 小时
发表于 2016-4-1 08:38:29 | 显示全部楼层
楼主,我也在研究HMC5883L卡好久了,不知你的问题解决没有
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-3-22
在线时间
5 小时
 楼主| 发表于 2016-4-1 16:44:35 | 显示全部楼层
我的问题解决了,但并不是用我这个程序,而是用的是在别的网页上下载的程序。下载后自己改初始化及串口,结果成功了
回复 支持 反对

使用道具 举报

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2014-11-15
在线时间
17 小时
发表于 2017-1-6 11:40:38 | 显示全部楼层
joyce931015 发表于 2016-4-1 16:44
我的问题解决了,但并不是用我这个程序,而是用的是在别的网页上下载的程序。下载后自己改初始化及串口,结 ...

楼主,能给下你的代码吗,我测出来的角度在90到270,x轴输出一直为正
回复 支持 反对

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-12-28
在线时间
11 小时
发表于 2017-4-13 21:14:17 来自手机 | 显示全部楼层
楼主求正确程序
回复 支持 反对

使用道具 举报

23

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
306
金钱
306
注册时间
2014-9-24
在线时间
39 小时
发表于 2017-4-19 22:38:30 | 显示全部楼层
难道楼主没有自己找一下是什么问题吗
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-3-24
在线时间
10 小时
发表于 2017-4-24 11:44:33 | 显示全部楼层
SKYZHC 发表于 2017-1-6 11:40
楼主,能给下你的代码吗,我测出来的角度在90到270,x轴输出一直为正

层主,你这个配置好了吗?为啥我的数据一直是255.是配置的问题吗?QQ;670986678,能否交流一下
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-11-29
在线时间
4 小时
发表于 2017-5-23 09:55:07 | 显示全部楼层
楼主,调试HMC5883L的程序可以给我发一下吗?我的也是一直输出-1,-1,-1
QQ:821932614@qq.com
邮箱:821932614@qq.com
回复 支持 反对

使用道具 举报

10

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
金钱
322
注册时间
2016-8-21
在线时间
37 小时
发表于 2017-9-6 13:56:21 | 显示全部楼层
我也遇到了这种情况,问题楼主解决了吗
回复 支持 反对

使用道具 举报

12

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
986
金钱
986
注册时间
2017-4-3
在线时间
118 小时
发表于 2017-9-9 10:17:05 | 显示全部楼层
楼主,我的也是一直输出-1,这么解决的或者有正确的代码能分享下么
回复 支持 反对

使用道具 举报

7

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2016-2-24
在线时间
39 小时
发表于 2018-1-24 10:05:42 | 显示全部楼层
老哥,我也在搞这个传感器,一直没弄好。可否贴一下程序,谢谢!@joyce931015
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2020-4-7
在线时间
13 小时
发表于 2020-4-19 13:57:59 | 显示全部楼层
你好,可以把你的程序分享下吗,qq邮箱1947093451@qq.com,谢谢谢谢
回复 支持 反对

使用道具 举报

14

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2019-12-4
在线时间
29 小时
发表于 2021-10-16 19:29:51 | 显示全部楼层
楼主,您好我遇到和你一样的情况,请问你是怎么解决的?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 22:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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