HMC5883L和QMC5883P芯片區(qū)別

HMC5883L和QMC5883P兩款都是磁力計芯片,HMC5883L是Honeywell生產(chǎn)的芯片,QMC5883P是QST公司生產(chǎn)的替代芯片,兩者在硬件封裝上是兼容的,都是LGA-16 3.0x3.0x0.9mm封裝,引腳上也都是兼容的,但是引腳功能上HMC5883L比QMC5883P多了一個DRDY引腳,可以用于中斷控制,還有軟件驅(qū)動上是不兼容的,寄存器地址以及IIC地址都是不相同的,不過底層驅(qū)動原理都是相同的。
以上是兩個芯片的一些重要參數(shù)的區(qū)別,還有一個重要的區(qū)別是兩者的磁場方向上是有區(qū)別的,如下圖:
進行計算的時候需要注意區(qū)分下。
HMC5883L獲取ID及三軸磁力計數(shù)據(jù)
HMC5883L手冊鏈接:HMC5883L手冊
寄存器說明
這里先看下HMC5883L的寄存器表格:
首先注意下10/11/12寄存器這里用10進制來寫了,實際代碼中讀取的寄存器地址應該分別是0A,0B,0C的寄存器地址。
Configuration Register A(00H) :位CRA7保留;CRA6-CRA5配置采樣平均次數(shù);CRA4-CRA2配置輸出速率(配置的是連續(xù)測量模式下的輸出速率(如下表1)。如果是在單次測量模式下,可以通過監(jiān)測 DRDY 中斷引腳可以實現(xiàn)最高 160 Hz的輸出速率);CRA1-CRA0:測量配置(主要用于正常測量或 啟用正/負偏置自檢(self-test) :00 = Normal、01 = Positive bias (自檢+)、10 = Negative bias (自檢?)、11 = 保留/未定義,具體說明可以看下表2)。

Configuration Register B(01H) :前三位GN通過設(shè)置增益確定量程范圍,如下表,剩下的位并未使用,需要配置為0。(對于B寄存器的具體說明可以看資料對應的章節(jié)說明,這里就不贅述了)
Mode Register(01H) :這個寄存器最高位MR7是設(shè)置為1可以配置成高速IIC模式,MR6到MR2未使用配置為0,MR1和MR0是用來配置模式,配置00時連續(xù)測量模式,01是單次測量模式,剩下兩個都是休眠模式。如下表:
03-08H :分別是三軸數(shù)據(jù)的寄存器了,都是12bits數(shù)據(jù)。
09H :狀態(tài)寄存器,只讀寄存器,用來讀取數(shù)據(jù)鎖存位和數(shù)據(jù)完成標志位。
| 位 | 名稱 | 功能說明 |
|---|---|---|
| 7–3 | 0 | 保留,固定為 0 |
| 2 | LOCK | 數(shù)據(jù)鎖存位。當一個軸的數(shù)據(jù)輸出寄存器被讀出時,其他兩個軸的數(shù)據(jù)會鎖存,直到它們也被讀出或發(fā)生新的測量更新。此位為1表示在讀取過程中有新數(shù)據(jù)到來,舊數(shù)據(jù)被鎖存;0表示沒有鎖存。 |
| 1 | RDY | 數(shù)據(jù)準備完成標志。當有新數(shù)據(jù)寫入輸出寄存器時置 1,表示三軸數(shù)據(jù)已更新,可以讀取。讀取一次數(shù)據(jù)后會自動清零。 |
| 0 | 0 | 保留 |
0A-0CH:分別是存儲3個ID身份的ASCII碼,分別對應:0A-H,0B-4,0C-3
以上就是所有寄存器的簡單介紹了,下面開始初始化模塊和讀取數(shù)據(jù)。
獲取HMC5883L ID和磁力計三軸數(shù)據(jù)
這里展示的是STM32F103C8T6單片機通過軟件IIC初始化HMC5883L模塊以及讀取三個標識ID寄存器和磁力計三軸數(shù)據(jù),直接讀取寄存器的值,未作校準,自己有更精準的數(shù)據(jù)需求的話,需要自行開發(fā)算法哦。
HMC5883L驅(qū)動代碼部分展示
/** * 函 數(shù):HMC5883L初始化*/
void HMC5883L_Init(void)
{
MyI2C_Init(); //先初始化底層的I2C
/* 配置寄存器A:配置為 0x70 (8-average, 15Hz, normal)
8-average: MA = 11 (bits 5-6)
15 Hz: DO = 100 (bits 2-0)
Normal measurement: MS = 00 (bits 1-0 of config A for measurement mode)*/
HMC5883L_WriteReg(HMC5883L_REG_CONFIG_A, 0x70);
/*配置寄存器B: Gain = default (1.3 Ga) - > 0x20 (可按需修改) */
HMC5883L_WriteReg(HMC5883L_REG_CONFIG_B, 0x20);
/* 模式: continuous-measurement mode (0x00) */
HMC5883L_WriteReg(HMC5883L_REG_MODE, 0x00);
}
/**
* 函 數(shù):HMC5883L獲取ID號
* 參 數(shù):無
* 返 回 值:HMC5883L的ID號
*/
void HMC5883L_GetID(uint8_t *A, uint8_t *B, uint8_t *C)
{
*A = HMC5883L_ReadReg(HMC5883L_REG_IDA); //返回IDA寄存器的值
*B = HMC5883L_ReadReg(HMC5883L_REG_IDB); //返回IDB寄存器的值
*C = HMC5883L_ReadReg(HMC5883L_REG_IDC); //返回IDC寄存器的值
}
/**
* 函 數(shù):HMC5883L獲取數(shù)據(jù)
* 參 數(shù):磁力計X、Y、Z軸的數(shù)據(jù),使用輸出參數(shù)的形式返回
* 返 回 值:無
*/
void HMC5883L_GetData(int16_t *X, int16_t *Y, int16_t *Z)
{
uint8_t DataH, DataL; //定義數(shù)據(jù)高8位和低8位的變量
DataH = HMC5883L_ReadReg(HMC5883L_REG_XOUT_H); //讀取磁力計X軸的高8位數(shù)據(jù)
DataL = HMC5883L_ReadReg(HMC5883L_REG_XOUT_L); //讀取磁力計X軸的低8位數(shù)據(jù)
*X = (DataH < < 8) | DataL; //數(shù)據(jù)拼接,通過輸出參數(shù)返回
DataH = HMC5883L_ReadReg(HMC5883L_REG_YOUT_H); //讀取磁力計Y軸的高8位數(shù)據(jù)
DataL = HMC5883L_ReadReg(HMC5883L_REG_YOUT_L); //讀取磁力計Y軸的低8位數(shù)據(jù)
*Y = (DataH < < 8) | DataL; //數(shù)據(jù)拼接,通過輸出參數(shù)返回
DataH = HMC5883L_ReadReg(HMC5883L_REG_ZOUT_H); //讀取磁力計Z軸的高8位數(shù)據(jù)
DataL = HMC5883L_ReadReg(HMC5883L_REG_ZOUT_L); //讀取磁力計Z軸的低8位數(shù)據(jù)
*Z = (DataH < < 8) | DataL; //數(shù)據(jù)拼接,通過輸出參數(shù)返回
}
HMC5883L主函數(shù)
uint8_t IDA, IDB, IDC; //定義用于存放ID號的變量
int16_t X, Y, Z; //定義用于存放各個數(shù)據(jù)的變量
int main(void)
{
/*模塊初始化*/
OLED_Init(); //OLED初始化
HMC5883L_Init(); //HMC5883L初始化
/*顯示ID號*/
OLED_ShowString(1, 1, "ID:");
HMC5883L_GetID(&IDA, &IDB, &IDC); //獲取HMC5883L的ID號
OLED_ShowHexNum(1, 4, IDA, 2); //OLED顯示ID號(hex)
OLED_ShowHexNum(1, 7, IDB, 2);
OLED_ShowHexNum(1, 10, IDC, 2);
OLED_ShowString(2, 1, "ID:");
OLED_ShowChar(2, 4, (char)IDA); //OLED顯示ID號(ASCII碼)
OLED_ShowChar(2, 5, (char)IDB);
OLED_ShowChar(2, 6, (char)IDC);
while (1)
{
HMC5883L_GetData(&X, &Y, &Z); //獲取HMC5883L的數(shù)據(jù)
OLED_ShowSignedNum(3, 1, X, 5); //OLED顯示數(shù)據(jù)
OLED_ShowSignedNum(3, 9, Y, 5);
OLED_ShowSignedNum(4, 1, Z, 5);
}
}
輸出結(jié)果
OLED輸出數(shù)據(jù)
QMC5883P獲取ID及三軸磁力計數(shù)據(jù)
QMC5883P手冊鏈接:QMC5883P手冊
寄存器說明

參數(shù)上和HMC5883L是大同小異的,這里不細說明了,可以自行查看手冊里的說明。主要區(qū)別是兩個芯片數(shù)據(jù)存放的寄存器位置不同,驅(qū)動的時候改下寄存器地址即可,還有QMC5883P的三軸數(shù)據(jù)是16bits,以及ID寄存器這里只用了一個寄存器(00H)去存放,不像HMC5883L用了三個寄存器存放ID。下面直接上代碼驅(qū)動。
獲取QMC5883P ID和磁力計三軸數(shù)據(jù)
這里展示的是STM32F103C8T6單片機通過軟件IIC初始化QMC5883P模塊以及讀取ID寄存器和磁力計三軸數(shù)據(jù),直接讀取寄存器的值,未作校準,自己有更精準的數(shù)據(jù)需求的話,需要自行開發(fā)算法哦。
QMC5883P驅(qū)動代碼部分展示
/**
* 函 數(shù):QMC5883P初始化
* 參 數(shù):無
* 返 回 值:無
*/
void QMC5883P_Init(void)
{
MyI2C_Init(); //先初始化底層的I2C
/* 初始化 QMC:
配置寄存器1:連續(xù)模式 + 200Hz
位 [7:6]=OSR2, [5:4]=OSR1, [3:2]=ODR, [1:0]=MODE
這里寫 0x0F = > OSR2=00(濾波器), OSR1=00(過采樣率), ODR=11(200Hz), MODE=11(連續(xù)發(fā)送模式Continuous Mode) */
QMC5883P_WriteReg(QMC5883P_REG_CONTROL1, 0xFF);
/* 配置寄存器2:這里寫的參數(shù)是不軟復位,不自檢,量程30Guass,不更新偏移量 */
QMC5883P_WriteReg(QMC5883P_REG_CONTROL2, 0x01);
}
/**
* 函 數(shù):QMC5883P獲取ID號
* 參 數(shù):無
* 返 回 值:QMC5883P的ID號
*/
uint8_t QMC5883P_GetID(void)
{
return QMC5883P_ReadReg(QMC5883P_REG_CHIPID); //返回CHIPID寄存器的值
}
/**
* 函 數(shù):QMC5883P獲取數(shù)據(jù)
* 參 數(shù):X Y Z 磁力計X、Y、Z軸的數(shù)據(jù),使用輸出參數(shù)的形式返回
* 返 回 值:無
*/
void QMC5883P_GetData(int16_t *X, int16_t *Y, int16_t *Z)
{
uint8_t DataH, DataL; //定義數(shù)據(jù)高8位和低8位的變量
DataH = QMC5883P_ReadReg(QMC5883P_REG_XOUT_H); //讀取磁力計X軸的高8位數(shù)據(jù)
DataL = QMC5883P_ReadReg(QMC5883P_REG_XOUT_L); //讀取磁力計X軸的低8位數(shù)據(jù)
*X = (DataH < < 8) | DataL; //數(shù)據(jù)拼接,通過輸出參數(shù)返回
DataH = QMC5883P_ReadReg(QMC5883P_REG_YOUT_H); //讀取磁力計Y軸的高8位數(shù)據(jù)
DataL = QMC5883P_ReadReg(QMC5883P_REG_YOUT_L); //讀取磁力計Y軸的低8位數(shù)據(jù)
*Y = (DataH < < 8) | DataL; //數(shù)據(jù)拼接,通過輸出參數(shù)返回
DataH = QMC5883P_ReadReg(QMC5883P_REG_ZOUT_H); //讀取磁力計Z軸的高8位數(shù)據(jù)
DataL = QMC5883P_ReadReg(QMC5883P_REG_ZOUT_L); //讀取磁力計Z軸的低8位數(shù)據(jù)
*Z = (DataH < < 8) | DataL; //數(shù)據(jù)拼接,通過輸出參數(shù)返回
}
QMC5883P主函數(shù)
uint8_t ID; //定義用于存放ID號的變量
int16_t X, Y, Z; //定義用于存放各個數(shù)據(jù)的變量
int main(void)
{
/*模塊初始化*/
OLED_Init(); //OLED初始化
QMC5883P_Init(); //QMC5883P初始化
/*顯示ID號*/
OLED_ShowString(1, 1, "ID:"); //顯示靜態(tài)字符串
ID = QMC5883P_GetID(); //獲取QMC5883P的ID號
OLED_ShowHexNum(1, 4, ID, 2); //OLED顯示ID號
while (1)
{
QMC5883P_GetData(&X, &Y, &Z); //獲取QMC5883P的數(shù)據(jù)
OLED_ShowSignedNum(2, 1, X, 5); //OLED顯示數(shù)據(jù)
OLED_ShowSignedNum(3, 1, Y, 5);
OLED_ShowSignedNum(4, 1, Z, 5);
}
}
輸出結(jié)果
QMC5883P——OLED測試現(xiàn)象
總結(jié)
==由于兩個模塊的底板是兼容的,所以拿到手的時候磁場方向只有HMC5883L的磁場方向是對的,QMC5883P的磁場方向?qū)謨岳锘蛘呱厦娲艌龇较驁D片看就行。==
需要代碼和對應資料的可以在評論區(qū)留言郵箱獲取哦!
-
單片機
+關(guān)注
關(guān)注
6072文章
45267瀏覽量
661178 -
STM32F103
+關(guān)注
關(guān)注
34文章
486瀏覽量
66823 -
磁力計
+關(guān)注
關(guān)注
1文章
72瀏覽量
21651
發(fā)布評論請先 登錄
求助啊 為什么我的HMC5883L讀出的原始數(shù)據(jù)中Y軸一直都是-4096
HMC5883L
發(fā)現(xiàn)一款可以直接PIN-TO-PIN替換HMC5883L的傳感器!?。。?/a>
請問MPU6050+HMC5883L的數(shù)據(jù)融合磁力計如何加入算出YAW的準確角度?
如何處理磁力計HMC5883L獲取的三軸數(shù)據(jù)?
請問MPU6050,HMC5883L,ADXL345之間我該選擇哪個?
如何使用這款QMC5883L磁力計呢
HMC5883L中文數(shù)據(jù)手冊
hmc5883l的特點及優(yōu)點_HMC5883L磁力計校準方法
HMC5883L應用說明
如何利用HMC5883L實現(xiàn)三軸磁力計的設(shè)計

淺談HMC5883L和QMC5883P磁力計的區(qū)別及STM32F103驅(qū)動
評論