找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8954|回复: 14
打印 上一主题 下一主题
收起左侧

stm32+QMC5883L磁力传感器源程序,可以用来融合校准MPU6050Z轴偏移

  [复制链接]
跳转到指定楼层
楼主
ID:125878 发表于 2019-7-10 10:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
该代码是磁力计stm32控制QMC5883L磁力计输出角度与三个磁力分量,某宝一些标记有hmc5883L模块实际是QMC5883L,输出角度一直是45的可以试一下,你会感谢我的

单片机源程序如下:
  1. #include "HMC5883L.h"
  2. #include "I2C.h"
  3. #include "delay.h"
  4. void hmc_write_reg(u8 reg,u8 data)
  5. {
  6.         IIC_Start();
  7.         IIC_Send_Byte(WRITE_ADDRESS);
  8.         IIC_Wait_Ack();
  9.         IIC_Send_Byte(reg);
  10.         IIC_Wait_Ack();
  11.         IIC_Send_Byte(data);
  12.         IIC_Wait_Ack();
  13.         IIC_Stop();
  14.         //delay_ms(5);
  15. }

  16. u8 hmc_read_reg(u8 reg)
  17. {
  18.         u8 data;
  19.         IIC_Start();
  20.         IIC_Send_Byte(WRITE_ADDRESS);
  21.         IIC_Wait_Ack();
  22.         IIC_Send_Byte(reg);
  23.         IIC_Wait_Ack();
  24.         IIC_Stop();
  25.         IIC_Start();
  26.         IIC_Send_Byte(READ_ADDRESS);
  27.         IIC_Wait_Ack();
  28.         data=IIC_Read_Byte();
  29.         IIC_NAck();
  30.         IIC_Stop();
  31.         return data;
  32. }

  33. void hmc_read_XYZ(short int *data)
  34. {
  35. //        u16 temp;
  36. //        temp=hmc_read_reg(DATAX_M);
  37. //        *data++=(temp<<8)+hmc_read_reg(DATAX_L);
  38. //        temp=hmc_read_reg(DATAY_M);
  39. //        *data++=(temp<<8)+hmc_read_reg(DATAY_L);
  40. //        temp=hmc_read_reg(DATAZ_M);
  41. //        *data++=(temp<<8)+hmc_read_reg(DATAZ_L);
  42.         *data++=((int16_t)hmc_read_reg(DATAX_M)<<8)|hmc_read_reg(DATAX_L);
  43.         *data++=((int16_t)hmc_read_reg(DATAY_M)<<8)|hmc_read_reg(DATAY_L);
  44.         *data++=((int16_t)hmc_read_reg(DATAZ_M)<<8)|hmc_read_reg(DATAZ_L);
  45. }

  46. void hmc_init(void)
  47. {
  48.         hmc_write_reg(0X0B,0x01);
  49.         hmc_write_reg(0X20,0x40);
  50.         hmc_write_reg(0X21,0x01);
  51.         hmc_write_reg(CONFIGA,0x1D);
  52.         delay_ms(10);
  53. }

复制代码


  1. #include "stm32f10x.h"
  2. #include "I2C.h"
  3. #include "HMC5883L.h"
  4. #include "delay.h"
  5. #include "math.h"
  6. #include "usart.h"

  7. //连接引脚PA8(SCL)PA11(SDA)

  8. short int data[3];
  9. double angle,x,y,z;
  10. int main(void)
  11. {       
  12.         delay_init();
  13.         i2c_init();
  14.         hmc_init();
  15.         uart_init(115200);
  16.         while(1)
  17.         {
  18.                 hmc_read_XYZ(data);
  19.                 angle=atan2((double)data[0],(double)data[2])*(180 / 3.14159265)+180;
  20.                 x=(double)data[0];
  21.                 y=(double)data[1];
  22.                 z=(double)data[2];
  23.                 printf("%f %f %f %f\r\n",x,y,z,angle);
  24.                 delay_ms(100);
  25.         }
  26. }
复制代码

所有资料51hei提供下载:
STM32F1_QMC5883L.7z (3.13 MB, 下载次数: 347)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:466684 发表于 2019-7-16 10:17 | 只看该作者
谢谢老哥,整了两天看了你的代码终于好了
回复

使用道具 举报

板凳
ID:466684 发表于 2019-7-16 10:19 | 只看该作者
谢谢大佬,两天的调试,宝宝心里的苦,估计只有大佬能感受到
回复

使用道具 举报

地板
ID:625819 发表于 2019-10-17 19:38 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

5#
ID:660972 发表于 2019-12-10 20:33 | 只看该作者
赚点黑币去下载
回复

使用道具 举报

6#
ID:284786 发表于 2020-10-18 20:33 | 只看该作者
确定能用吗   我怎么读出来都是-1啊
回复

使用道具 举报

7#
ID:855651 发表于 2020-12-16 21:41 | 只看该作者
搞不定,编译后烧写,串口一直输出45,啥原因啊?
回复

使用道具 举报

8#
ID:338306 发表于 2021-3-12 08:50 | 只看该作者
我已经将资料下载下来了,今天测试一下51程序,希望能用,提前感谢楼主了
回复

使用道具 举报

9#
ID:462324 发表于 2021-10-16 19:10 | 只看该作者
BigBen 发表于 2020-12-16 21:41
搞不定,编译后烧写,串口一直输出45,啥原因啊?

我也是这样,你解决了吗?
回复

使用道具 举报

10#
ID:462324 发表于 2021-10-16 19:11 | 只看该作者
怎么读出来是45
回复

使用道具 举报

11#
ID:978679 发表于 2023-2-16 17:20 | 只看该作者
有没有HAL库版本的呀?
回复

使用道具 举报

12#
ID:1119648 发表于 2024-6-7 09:20 | 只看该作者
为什么读取到的一直是45
回复

使用道具 举报

13#
ID:168356 发表于 2024-7-26 11:18 | 只看该作者
可以用,谢谢楼主被某一个宝坑惨了
回复

使用道具 举报

14#
ID:988162 发表于 2024-7-31 15:31 | 只看该作者
读出来45 就是假的吗
回复

使用道具 举报

15#
ID:418578 发表于 2024-9-21 21:24 | 只看该作者
init的代码有问题,应该是这样写:
  • void hmc_init(void)
  • {
  •         hmc_write_reg(0X0B,0x01);
  •         //hmc_write_reg(0X20,0x40);
  •         //hmc_write_reg(0X21,0x01);
  •         hmc_write_reg(CONFIGA,0x1D);
  •         delay_ms(10);
  • }

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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