標(biāo)題: stm32+QMC5883L磁力傳感器源程序,可以用來融合校準(zhǔn)MPU6050Z軸偏移 [打印本頁(yè)]

作者: 461534727    時(shí)間: 2019-7-10 10:54
標(biāo)題: stm32+QMC5883L磁力傳感器源程序,可以用來融合校準(zhǔn)MPU6050Z軸偏移
該代碼是磁力計(jì)stm32控制QMC5883L磁力計(jì)輸出角度與三個(gè)磁力分量,某寶一些標(biāo)記有hmc5883L模塊實(shí)際是QMC5883L,輸出角度一直是45的可以試一下,你會(huì)感謝我的

單片機(jī)源程序如下:
  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. }

復(fù)制代碼


  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. }
復(fù)制代碼

所有資料51hei提供下載:
STM32F1_QMC5883L.7z (3.13 MB, 下載次數(shù): 347)


作者: a984984sd123456    時(shí)間: 2019-7-16 10:17
謝謝老哥,整了兩天看了你的代碼終于好了
作者: a984984sd123456    時(shí)間: 2019-7-16 10:19
謝謝大佬,兩天的調(diào)試,寶寶心里的苦,估計(jì)只有大佬能感受到
作者: hanhuliang    時(shí)間: 2019-10-17 19:38
好資料,51黑有你更精彩!!!
作者: cnvya    時(shí)間: 2019-12-10 20:33
賺點(diǎn)黑幣去下載
作者: HYJ520    時(shí)間: 2020-10-18 20:33
確定能用嗎   我怎么讀出來都是-1啊

作者: BigBen    時(shí)間: 2020-12-16 21:41
搞不定,編譯后燒寫,串口一直輸出45,啥原因?
作者: 3478污鈔    時(shí)間: 2021-3-12 08:50
我已經(jīng)將資料下載下來了,今天測(cè)試一下51程序,希望能用,提前感謝樓主了
作者: 哈哈你好1    時(shí)間: 2021-10-16 19:10
BigBen 發(fā)表于 2020-12-16 21:41
搞不定,編譯后燒寫,串口一直輸出45,啥原因。

我也是這樣,你解決了嗎?
作者: 哈哈你好1    時(shí)間: 2021-10-16 19:11
怎么讀出來是45
作者: hero_huang    時(shí)間: 2023-2-16 17:20
有沒有HAL庫(kù)版本的呀?
作者: wang0011    時(shí)間: 2024-6-7 09:20
為什么讀取到的一直是45
作者: 2307393235    時(shí)間: 2024-7-26 11:18
可以用,謝謝樓主被某一個(gè)寶坑慘了
作者: lpdf    時(shí)間: 2024-7-31 15:31
讀出來45 就是假的嗎
作者: 春陰釀寒    時(shí)間: 2024-9-21 21:24
init的代碼有問題,應(yīng)該是這樣寫:

作者: DL_AM    時(shí)間: 2025-4-27 21:08
wang0011 發(fā)表于 2024-6-7 09:20
為什么讀取到的一直是45

請(qǐng)問一下,你解決了嗎?





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1