HMC5883L和QMC5883P芯片區(qū)別

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

Configuration Register B(01H) :前三位GN通過(guò)設(shè)置增益確定量程范圍,如下表,剩下的位并未使用,需要配置為0。(對(duì)于B寄存器的具體說(shuō)明可以看資料對(duì)應(yīng)的章節(jié)說(shuō)明,這里就不贅述了)
Mode Register(01H) :這個(gè)寄存器最高位MR7是設(shè)置為1可以配置成高速IIC模式,MR6到MR2未使用配置為0,MR1和MR0是用來(lái)配置模式,配置00時(shí)連續(xù)測(cè)量模式,01是單次測(cè)量模式,剩下兩個(gè)都是休眠模式。如下表:
03-08H :分別是三軸數(shù)據(jù)的寄存器了,都是12bits數(shù)據(jù)。
09H :狀態(tài)寄存器,只讀寄存器,用來(lái)讀取數(shù)據(jù)鎖存位和數(shù)據(jù)完成標(biāo)志位。
| 位 | 名稱 | 功能說(shuō)明 |
|---|---|---|
| 7–3 | 0 | 保留,固定為 0 |
| 2 | LOCK | 數(shù)據(jù)鎖存位。當(dāng)一個(gè)軸的數(shù)據(jù)輸出寄存器被讀出時(shí),其他兩個(gè)軸的數(shù)據(jù)會(huì)鎖存,直到它們也被讀出或發(fā)生新的測(cè)量更新。此位為1表示在讀取過(guò)程中有新數(shù)據(jù)到來(lái),舊數(shù)據(jù)被鎖存;0表示沒(méi)有鎖存。 |
| 1 | RDY | 數(shù)據(jù)準(zhǔn)備完成標(biāo)志。當(dāng)有新數(shù)據(jù)寫入輸出寄存器時(shí)置 1,表示三軸數(shù)據(jù)已更新,可以讀取。讀取一次數(shù)據(jù)后會(huì)自動(dòng)清零。 |
| 0 | 0 | 保留 |
0A-0CH:分別是存儲(chǔ)3個(gè)ID身份的ASCII碼,分別對(duì)應(yīng):0A-H,0B-4,0C-3
以上就是所有寄存器的簡(jiǎn)單介紹了,下面開始初始化模塊和讀取數(shù)據(jù)。
獲取HMC5883L ID和磁力計(jì)三軸數(shù)據(jù)
這里展示的是STM32F103C8T6單片機(jī)通過(guò)軟件IIC初始化HMC5883L模塊以及讀取三個(gè)標(biāo)識(shí)ID寄存器和磁力計(jì)三軸數(shù)據(jù),直接讀取寄存器的值,未作校準(zhǔn),自己有更精準(zhǔn)的數(shù)據(jù)需求的話,需要自行開發(fā)算法哦。
HMC5883L驅(qū)動(dòng)代碼部分展示
/** * 函 數(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號(hào)
* 參 數(shù):無(wú)
* 返 回 值:HMC5883L的ID號(hào)
*/
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ù):磁力計(jì)X、Y、Z軸的數(shù)據(jù),使用輸出參數(shù)的形式返回
* 返 回 值:無(wú)
*/
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); //讀取磁力計(jì)X軸的高8位數(shù)據(jù)
DataL = HMC5883L_ReadReg(HMC5883L_REG_XOUT_L); //讀取磁力計(jì)X軸的低8位數(shù)據(jù)
*X = (DataH < < 8) | DataL; //數(shù)據(jù)拼接,通過(guò)輸出參數(shù)返回
DataH = HMC5883L_ReadReg(HMC5883L_REG_YOUT_H); //讀取磁力計(jì)Y軸的高8位數(shù)據(jù)
DataL = HMC5883L_ReadReg(HMC5883L_REG_YOUT_L); //讀取磁力計(jì)Y軸的低8位數(shù)據(jù)
*Y = (DataH < < 8) | DataL; //數(shù)據(jù)拼接,通過(guò)輸出參數(shù)返回
DataH = HMC5883L_ReadReg(HMC5883L_REG_ZOUT_H); //讀取磁力計(jì)Z軸的高8位數(shù)據(jù)
DataL = HMC5883L_ReadReg(HMC5883L_REG_ZOUT_L); //讀取磁力計(jì)Z軸的低8位數(shù)據(jù)
*Z = (DataH < < 8) | DataL; //數(shù)據(jù)拼接,通過(guò)輸出參數(shù)返回
}
HMC5883L主函數(shù)
uint8_t IDA, IDB, IDC; //定義用于存放ID號(hào)的變量
int16_t X, Y, Z; //定義用于存放各個(gè)數(shù)據(jù)的變量
int main(void)
{
/*模塊初始化*/
OLED_Init(); //OLED初始化
HMC5883L_Init(); //HMC5883L初始化
/*顯示ID號(hào)*/
OLED_ShowString(1, 1, "ID:");
HMC5883L_GetID(&IDA, &IDB, &IDC); //獲取HMC5883L的ID號(hào)
OLED_ShowHexNum(1, 4, IDA, 2); //OLED顯示ID號(hào)(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號(hào)(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及三軸磁力計(jì)數(shù)據(jù)
QMC5883P手冊(cè)鏈接:QMC5883P手冊(cè)
寄存器說(shuō)明

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

淺談HMC5883L和QMC5883P磁力計(jì)的區(qū)別及STM32F103驅(qū)動(dòng)
評(píng)論