[其他] [经验] 基于HMC5883L的电子指南针

[复制链接]
 楼主| cr315 发表于 2021-7-12 15:11 | 显示全部楼层 |阅读模式
四天前我已经发了一篇关于使用MM32开发板做电子指南针的帖子,那篇帖子内容不够详细。我现在把内容再细说一下。我把程序又调试修改了一些,现在把改进的程序也给大家分享一下。先来张图片看看效果。
这些照片是将传感器放在不同位置时读取的方位角度情况,由于传感器放置的不够水平精度有些小误差。
 楼主| cr315 发表于 2021-7-12 15:15 | 显示全部楼层
下面再说说编写程序方面的事
我使用的是MDK510版本的编译器

1.HMC5883L的底层程序是我移植厂家给的底层程序,我在I2C方面做了部分的改动。读取HMC5883L传感器的读取函数中要注意寄存器的地址和读出来的数据所存放的缓冲器大小及位置
void read_hmc5883l(void)//¶ÁÈ¡
{
        IIC_Write(HMC5883L_Addr,0x00,0x14);   //ÅäÖüĴæÆ÷A£º²ÉÑùƽ¾ùÊý1 Êä³öËÙÂÊ75Hz Õý³£²âÁ¿
        IIC_Write(HMC5883L_Addr,0x01,0x20);   //ÅäÖüĴæÆ÷B£ºÔöÒæ¿ØÖÆ
        IIC_Write(HMC5883L_Addr,0x02,0x00);   //ģʽ¼Ä´æÆ÷£ºÁ¬Ðø²âÁ¿Ä£Ê½
      
        Delayms(5);

        IIC_Read(HMC5883L_Addr,0x03,8);//OUT_X_L_A
        IIC_Read(HMC5883L_Addr,0x04,8);//OUT_X_H_A

        IIC_Read(HMC5883L_Addr,0x07,8);//OUT_Y_L_A
        IIC_Read(HMC5883L_Addr,0x08,8);//OUT_Y_H_A
        IF(x>0x7fff)x-=0xffff;         
        if(y>0x7fff)y-=0xffff;      
        if(z>0x7fff)z-=0xffff;      
                x=IIC_buf[0] << 8 | IIC_buf[1]; //Combine MSB and LSB of X Data output register
    y=IIC_buf[2] << 8 | IIC_buf[3]; //Combine MSB and LSB of Y Data output register
                z=IIC_buf[4] << 8 | IIC_buf[5]; //Combine MSB and LSB of Z Data output register
    angLEDot= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees
               
}      
 楼主| cr315 发表于 2021-7-12 15:17 | 显示全部楼层
2.关于显示坐标与角度方位情况的函数操作

        if((angledot < 22.5) || (angledot > 337.5 ))
                {
            LCD_ShowString(170,290,200,16,16,"         ");
                        LCD_ShowString(170,290,200,16,16,"South");  
                }                       
      
    if((angledot> 22.5) && (angledot < 67.5 ))
                {
                                LCD_ShowString(170,290,200,16,16,"         ");
                        LCD_ShowString(170,290,200,16,16,"South-West");
                }
    if((angledot > 67.5) && (angledot < 112.5 ))
                {
                                LCD_ShowString(170,290,200,16,16,"         ");
      LCD_ShowString(170,290,200,16,16,"West");
                }
          if((angledot > 112.5) && (angledot < 157.5 ))
                {
                                LCD_ShowString(170,290,200,16,16,"         ");
       LCD_ShowString(170,290,200,16,16,"North-West");
                }
    if((angledot > 157.5) && (angledot < 202.5 ))
                {
                                LCD_ShowString(170,290,200,16,16,"         ");
       LCD_ShowString(170,290,200,16,16,"North");
                }
    if((angledot> 202.5) && (angledot < 247.5 ))
                {
                                LCD_ShowString(170,290,200,16,16,"         ");
                         LCD_ShowString(170,290,200,16,16,"NorthEast");
                }
    if((angledot > 247.5) && (angledot < 292.5 ))
                {
                                LCD_ShowString(170,290,200,16,16,"         ");
      LCD_ShowString(170,290,200,16,16,"East");
                }
    if((angledot > 292.5) && (angledot < 337.5 ))
                {
                                LCD_ShowString(170,290,200,16,16,"         ");
                        LCD_ShowString(170,290,200,16,16,"SouthEast");
                }      
 楼主| cr315 发表于 2021-7-12 15:18 | 显示全部楼层
本帖最后由 cr315 于 2021-7-12 15:19 编辑

在显示新的位置字符串时需要将显示的上一位置的字符串清除掉,我这里是让显示空格的方式来清除上次显示的字符串。
3.在方位识别方面还可以将角度分的更细致,在这里我只分了八个方位角。由于使用的是杜邦线连接的传感器,所以也会是数据受到影响。
IMG_20160910_091054.jpg (538 KB, 下载次数: 20)






092515qznazj3rcyajaca3.jpg.thumb.jpg
IMG_20160910_091100.jpg (628.66 KB, 下载次数: 23)






092625capnphki6vozeezo.jpg.thumb.jpg
IMG_20160910_091120.jpg (471.06 KB, 下载次数: 24)






092629llbim7cpr7ixr1li.jpg.thumb.jpg
截图00.jpg (23.49 KB, 下载次数: 24)






093313o1ncydmzb2eb2jer.jpg.thumb.jpg


foxsbig 发表于 2021-7-14 11:42 | 显示全部楼层
指南针,不是要有个针指着南的么?
单片小菜 发表于 2021-7-14 15:13 | 显示全部楼层
看不见指南针的指针,在哪里呢?
自己造声卡 发表于 2021-7-14 17:01 | 显示全部楼层
没有看见指南针的表针。
aspoke 发表于 2021-8-8 21:48 | 显示全部楼层
hmc5883l库文件吗     
232321122 发表于 2021-8-8 21:48 | 显示全部楼层
电子罗盘HMC5883L和HMC5983哪个更好
ghuca 发表于 2021-8-8 21:48 | 显示全部楼层
hmc5883l的引脚 怎么连接
soodesyt 发表于 2021-8-8 21:48 | 显示全部楼层
  HMC5883L 的角度算法公式是怎样的?  
mnynt121 发表于 2021-8-8 21:48 | 显示全部楼层
怎样修改HMC5883L的默认IIC地址
plsbackup 发表于 2021-8-8 21:48 | 显示全部楼层
用过HMC5883L这个传感器?  
kmzuaz 发表于 2021-8-8 21:49 | 显示全部楼层
HMC5883L是怎么校正的呢  
qiufengsd 发表于 2021-8-8 21:49 | 显示全部楼层
HMC5883L磁阻传感器如何接收地磁场信息?
sdCAD 发表于 2021-8-8 21:49 | 显示全部楼层
怎样使用MPU6050连接HMC5883L
fengm 发表于 2021-8-8 21:49 | 显示全部楼层
hmc5883l 与adxl345哪个好
huquanz711 发表于 2021-8-10 18:30 来自手机 | 显示全部楼层
还不错,谢谢分享。
sesefadou 发表于 2021-8-11 17:17 | 显示全部楼层
HMC5883L和HMC5983哪个更好
earlmax 发表于 2021-8-11 17:17 | 显示全部楼层
hmc5883L各方向角度不均匀  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1444

主题

4813

帖子

0

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