chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32F103C8T6驅動MPU9250傳感器讀取九軸數(shù)據(jù)

jf_88434166 ? 來源:jf_88434166 ? 作者:jf_88434166 ? 2025-09-24 16:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、MPU9250傳感器模塊概述

MPU9250是一款高集成度的九軸慣性測量單元(IMU),它集成了三軸陀螺儀、三軸加速度計和三軸磁力計(通常集成的磁力計為AK8963)。由于其體積小、功耗低、性能穩(wěn)定,MPU9250廣泛應用于無人機、機器人、智能穿戴設備、虛擬現(xiàn)實以及運動追蹤等領域。MPU9250采用MEMS微機電系統(tǒng))技術制造,能夠同時采集角速度、線性加速度和地磁場數(shù)據(jù),從而實現(xiàn)九自由度測量。模塊內部還集成了數(shù)字運動處理器(DMP),用于執(zhí)行復雜的傳感器融合算法,從而降低了主控芯片的運算負擔。

二、功能與特點

MPU9250整合了3軸加速度計、3軸陀螺儀和3軸磁力計,能夠提供九軸數(shù)據(jù)。這使得系統(tǒng)可以實時計算出姿態(tài)、航向和運動狀態(tài),為高精度定位和運動控制提供數(shù)據(jù)支持。

  1. 低功耗設計
    采用先進的低功耗設計,適合于便攜式設備和電池供電的應用場景。其工作模式可根據(jù)應用需求進行靈活配置,如休眠、低功耗待機以及全速工作模式。
  2. 高動態(tài)范圍和分辨率
    陀螺儀:支持±250、±500、±1000和±2000°/s等不同的量程選擇,可適應從微小角速度到大幅度旋轉的測量。
    加速度計:支持±2g、±4g、±8g和±16g的量程,適用于多種運動狀態(tài)檢測。
    磁力計:內置AK8963磁力計,具有高分辨率,可以進行精確的地磁測量,用于航向計算和磁場干擾補償。
  3. 數(shù)字運動處理器(DMP)
    內置DMP可以實現(xiàn)基本的姿態(tài)計算和傳感器融合,降低主控MCU的計算負擔,并實現(xiàn)實時的運動檢測與姿態(tài)估計。
  4. 多種通信接口
    MPU9250支持I2C和SPI兩種通信方式,便于在不同系統(tǒng)中靈活應用。標準庫或HAL庫均可對其進行驅動開發(fā)。
  5. 內置溫度傳感器
    除了三軸數(shù)據(jù),MPU9250還內置溫度傳感器,用于監(jiān)控芯片內部溫度。雖然該溫度數(shù)據(jù)主要反映芯片工作時的溫度狀況,但在某些應用中也可作為溫度補償參考。

三、數(shù)據(jù)校準與轉換

傳感器輸出的原始數(shù)據(jù)通常為16位有符號數(shù)。為了獲得物理意義上的數(shù)值,需要根據(jù)所選的量程進行轉換。例如:

  1. 加速度計:如果選擇±2g量程,則轉換系數(shù)為16384 LSB/g,即原始數(shù)據(jù)除以16384后得到加速度值(單位g)。
  2. 陀螺儀:如果選擇±250°/s量程,則轉換系數(shù)為131 LSB/°/s,即原始數(shù)據(jù)除以131后得到角速度值(單位°/s)。
  3. 溫度傳感器:MPU9250的文檔中未明確給出溫度轉換參數(shù),溫度轉換公式一般參考MPU6050的公式:

溫度(℃)={TEMP-OUT}/{340}+36.53

四、常用寄存器說明

1、WHO_AM_I:讀取設備ID寄存器(只讀不能寫),MPU9250的ID默認為0x71。


其中AK8963的設備ID固定為0x48。

2、PWR_MGMT_1:電源管理1, 此寄存器用于設置用戶配置電源模式和時鐘源。

H_RESET:重置內部寄存器,并恢復默認設置。寫一個1來設置重置位,該位將自動清除。即復位MPU9250。
SLEEP:設置MPU9250工作模式為休眠模式。
CYCLE:周期模式。當你在 PWR_MGMT_1 寄存器中設置了 CYCLE 位,同時確保 SLEEP 和 STANDBY 位沒有被設置時,MPU9250 會進入一種低功耗工作模式。在這種模式下,芯片會不斷地在“休眠”與“短暫喚醒采樣”之間交替工作。每次喚醒時,它只會采集一個加速度計樣本,而不是連續(xù)采集數(shù)據(jù)。采樣的頻率由 LP_ACCEL_ODR 寄存器來控制。注意:如果你通過 PWR_MGMT_2 寄存器禁用了所有加速度計的軸(也就是關閉了加速度計),那么即使啟用了周期模式,芯片仍然會按照 LP_ACCEL_ODR 寄存器設定的時間間隔定時喚醒,但由于加速度計被禁用了,所以它不會采集任何數(shù)據(jù)。簡單來說,就是啟用周期模式時芯片周期性地從低功耗休眠狀態(tài)中喚醒,采集一次數(shù)據(jù),然后再回到休眠狀態(tài)。如果禁用加速度計:芯片仍會周期性喚醒,但不會采集數(shù)據(jù)。
GYRO_STANDBY:陀螺儀待機。設置后,陀螺儀驅動器和鎖相環(huán)電路將啟用,但感測路徑將被禁用。這是一種低功耗模式,可快速啟用陀螺儀。
PD_PTAT:關閉內部 PTAT 電壓發(fā)生器和 PTAT ADC
CLKSEL[2:0]:時鐘選擇??蛇x擇內部8M晶振、外部晶振或陀螺儀時鐘作為時鐘源。設備上電默認使用內部8M晶振作為時鐘,但其精度不高。官方推薦使用陀螺儀時鐘或外部晶振作為時鐘源,以提高穩(wěn)定性,一般設置CLKSEL=001,即選擇陀螺儀X軸時鐘作為時鐘源即可。下表為時鐘源選擇。

3、PWR_MGMT_2:電源管理2,使能3軸加速度和3軸陀螺儀。

4、SMPLRT_DIV:采樣率分頻器,用于設置傳感器數(shù)據(jù)采樣的速率。將設置采樣速率時鐘通過這個寄存器進行分頻,從而得到最終的數(shù)據(jù)采樣率

分頻計算公式如下

5、CONFIG:配置寄存器。

FIFO_MODE:控制 FIFO(數(shù)據(jù)緩沖區(qū))在裝滿后如何處理新的數(shù)據(jù)。當FIFO_MODE = 0時,一旦FIFO裝滿,則新數(shù)據(jù)覆蓋舊數(shù)據(jù)。FIFO_MODE = 1時,一旦FIFO滿,則停止存儲數(shù)據(jù)。
EXT_SYNC_SET[2:0]:配置外部同步,讓芯片與外部觸發(fā)信號同步采集數(shù)據(jù)。以下表為選擇哪個傳感器數(shù)據(jù)同步,其中000為禁用同步,001為溫度數(shù)據(jù)同步,010-111分別為3軸陀螺儀、3軸加速度數(shù)據(jù)同步。

DLPF_CFG[2:0]:設置數(shù)字低通濾波器,用于濾除傳感器信號中的高頻噪聲。當 FCHOICE_B [1:0] = 00 時,DLPF 由 DLPF_CFG 配置。陀螺儀和溫度傳感器根據(jù) DLPF_CFG 和 FCHOICE_B 的值進行過濾,如下表所示。

6、GYRO_CONFIG:配置陀螺儀自檢和滿量程


7、ACCEL_CONFIG:配置加速度自檢和滿量程


8、INT_PIN_CFG:中斷配置寄存器,用于設置INT中斷引腳的電平標準和驅動方式(推挽、開漏)等;

BYPASS_EN:配置旁路模式。讀取磁力計數(shù)據(jù)可以通過兩種方式讀取,一種是通過配置內部I2C主控模式讀取,一種是直接通過旁路模式讀取,一般是開啟旁路模式來訪問磁力計,比較簡單方便。
9、CNTL1:配置磁力計工作模式。

以下為配置模式

五、接線說明

STM32F103C8T6MPU9250 / USB轉TTL
3V3MPU9250_VCC
GNDMPU9250和TTL的GND
GPIOB10MPU9250_SCL
GPIOB11MPU9250_SDA
GPIOA9TTL_RX
GPIOA10TTL_TX

六、讀取MPU9250九軸數(shù)據(jù)

代碼示例:

main.c

#include "stm32f10x.h"                  // Device header
#include "mpu9250.h"
#include "delay.h"
#include "usart.h"

int16_t ax, ay, az, gx, gy, gz, mx, my, mz;
float temperature;
char mpu9250ID[30], ak8963ID[30], buf[100];

int main(void)
{
	SystemInit();
	MPU9250_Init();

	USART1_Init();	// USART初始化函數(shù)
	
	sprintf(mpu9250ID, "mpu9250_id = 0x%02Xrn", MPU9250_GetID());	
	USART_SendString(USART1, mpu9250ID);
	
	sprintf(ak8963ID, "ak8963_id = 0x%02Xrnrn", AK8963_GetID());
	USART_SendString(USART1, ak8963ID);
	
	while(1)
	{
		//讀取加速度和陀螺儀
		MPU9250_GetData(&ax, &ay, &az, &gx, &gy, &gz, &mx, &my, &mz);
		//讀取溫度
		temperature = MPU6050_GetTemperature();
		
		sprintf(buf, "ax:%d  ay:%d  az:%d    gx:%d  gy:%d  gz:%drnmx:%d  my:%d  mz:%drnTemp: %.2f℃rnrn",
                ax, ay, az, gx, gy, gz, mx, my, mz, temperature);
		
		USART_SendString(USART1, buf);

        Delay_ms(500);
	}
}

MPU9250.c

#include "MyI2C.h"
#include "MPU9250_Reg.h"
#include "delay.h"

void MPU9250_WriteReg(uint8_t DeviceAddr, uint8_t RegAddress, uint8_t Data)
{
	MyI2C_Start();
	MyI2C_SendByte(DeviceAddr);
	MyI2C_ReceiveAck();
	MyI2C_SendByte(RegAddress);
	MyI2C_ReceiveAck();
	MyI2C_SendByte(Data);
	MyI2C_ReceiveAck();
	MyI2C_Stop();
}

uint8_t MPU9250_ReadReg(uint8_t DeviceAddr, uint8_t RegAddress)
{
	uint8_t Data;
	
	MyI2C_Start();
	MyI2C_SendByte(DeviceAddr);
	MyI2C_ReceiveAck();
	MyI2C_SendByte(RegAddress);
	MyI2C_ReceiveAck();
	
	MyI2C_Start();
	MyI2C_SendByte(DeviceAddr | 0x01); //指定地址讀
	MyI2C_ReceiveAck();
	Data = MyI2C_ReceiveByte();
	MyI2C_SendAck(1);
	MyI2C_Stop();
	
	return Data;
}

uint8_t MPU9250_GetID(void)
{
	return MPU9250_ReadReg(MPU9250_ADDR_WRITE, MPU9250_WHO_AM_I);
}

uint8_t AK8963_GetID(void)
{
	return MPU9250_ReadReg(AK8963_ADDR_WRITE, AK8963_WHO_AM_I);
}

void MPU9250_GetData(int16_t *ax, int16_t *ay, int16_t *az, 
					    int16_t *gx, int16_t *gy, int16_t *gz,
						int16_t *mx, int16_t *my, int16_t *mz)
{
	uint8_t AccData[7], GyroData[7], MagData[7];  // 包括6字節(jié)數(shù)據(jù)及1字節(jié)狀態(tài)(ST2)
    uint8_t i;
	
	//3軸加速度
	for(i = 0; i < 7; i++){
        AccData[i] = MPU9250_ReadReg(MPU9250_ADDR_WRITE, MPU9250_ACCEL_XOUT_H + i);
    }
	*ax = (int16_t)(((int16_t)AccData[0] < < 8) | AccData[1]);
    *ay = (int16_t)(((int16_t)AccData[2] < < 8) | AccData[3]);
    *az = (int16_t)(((int16_t)AccData[4] < < 8) | AccData[5]);
	
	//3軸陀螺儀
	for(i = 0; i < 7; i++){
        GyroData[i] = MPU9250_ReadReg(MPU9250_ADDR_WRITE, MPU9250_GYRO_XOUT_H + i);
    }
	*gx = (int16_t)(((int16_t)GyroData[0] < < 8) | GyroData[1]);
    *gy = (int16_t)(((int16_t)GyroData[2] < < 8) | GyroData[3]);
    *gz = (int16_t)(((int16_t)GyroData[4] < < 8) | GyroData[5]);
	
	//3軸磁力計
	for(i = 0; i < 7; i++){
        MagData[i] = MPU9250_ReadReg(AK8963_ADDR_WRITE, AK8963_HXL + i);
    }
    /* 注意:AK8963數(shù)據(jù)寄存器采用低字節(jié)在前的格式 */
    *mx = (int16_t)(((int16_t)MagData[1] < < 8) | MagData[0]);
    *my = (int16_t)(((int16_t)MagData[3] < < 8) | MagData[2]);
    *mz = (int16_t)(((int16_t)MagData[5] < < 8) | MagData[4]);
	
	/* 可以在此檢查ST2寄存器(Data[6])中的溢出標志 */
}

float MPU6050_GetTemperature(void)
{
	int16_t TempData;
	uint8_t tempH, tempL;
	
	tempH = MPU9250_ReadReg(MPU9250_ADDR_WRITE, MPU9250_TEMP_OUT_H);
	tempL = MPU9250_ReadReg(MPU9250_ADDR_WRITE, MPU9250_TEMP_OUT_L);
	
	TempData = (int16_t)(tempH < < 8) | tempL;
	
	return((float)TempData) / 340.0f + 36.53f;
}

void MPU9250_Init()
{
	MyI2C_Init();
	MPU9250_WriteReg(MPU9250_ADDR_WRITE, MPU9250_PWR_MGMT_1, 0x01);
	MPU9250_WriteReg(MPU9250_ADDR_WRITE, MPU9250_PWR_MGMT_2, 0x00);
	MPU9250_WriteReg(MPU9250_ADDR_WRITE, MPU9250_SMPLRT_DIV, 0x09);	//采樣分頻器
	MPU9250_WriteReg(MPU9250_ADDR_WRITE, MPU9250_CONFIG, 0x06);	//配置寄存器,配置同步時鐘和低通濾波
	MPU9250_WriteReg(MPU9250_ADDR_WRITE, MPU9250_GYRO_CONFIG, 0x18); //配置陀螺儀自測和滿量程
	MPU9250_WriteReg(MPU9250_ADDR_WRITE, MPU9250_ACCEL_CONFIG, 0x18);
	MPU9250_WriteReg(MPU9250_ADDR_WRITE, MPU9250_INT_PIN_CFG, 0x02);  //開啟旁路模式
	MPU9250_WriteReg(AK8963_ADDR_WRITE, AK8963_CNTL1, 0x16);  //設置連續(xù)測量模式
	Delay_ms(10);
}

效果展示:

七、讀取不到磁力計數(shù)據(jù)的可能原因及解決方法

獲取磁力計是根據(jù)AK8963來測量,在讀取磁力計數(shù)據(jù)前,先讀取下AK8963設備的ID值是否返回正常。如果不正常,可能的原因有以下幾點:

  1. 旁路模式未開啟
    MPU9250內部連接了AK8963,只有在設置旁路模式后,外部I2C才能直接訪問AK8963。如果旁路模式?jīng)]有正確配置,I2C總線上可能讀不到AK8963的數(shù)據(jù)。
    如果旁路模式已開啟,常見原因是MPU9250內部I2C主控功能沒有被關閉,導致旁路模式雖然設置了但仍然屏蔽了對AK8963的直接訪問。通常在啟用旁路模式之前,需要先清除MPU9250的I2C_MST_EN,以確保外部I2C能直接訪問AK8963。否則,即便旁路模式配置正確,也可能讀不到AK8963的寄存器,返回0x00。
    建議檢查初始化流程,確保在設置INT_PIN_CFG寄存器為0x02以啟用旁路模式之前,先在USER_CTRL寄存器中清除I2C主控使能位,然后再進行后續(xù)的AK8963初始化流程。
  2. I2C通信問題
    檢查下I2C初始化和通訊時序是否正確。
    值得注意的是I2C地址的位寬上,AK8963的7位從地址是0x0C,如果你的I2C位操作中,傳遞的是8位地址。對于8位地址,寫操作應使用(0x0C<<1)=0x18,而讀操作應使用0x18|0x01=0x19。如果直接使用0x0C,就相當于地址錯誤,I2C總線讀取時由于找不到設備,返回的自然就是上拉電平(0xFF)。
  3. 供電或復位問題
    如果AK8963沒有正確上電或者處于復位狀態(tài),也可能返回0x00。確保傳感器的電源電壓和啟動順序符合要求。

總結

MPU9250作為一款集成了九軸傳感器的高性能IMU,憑借其小巧的體積、低功耗和多種通信接口,成為了廣泛應用于無人機、機器人、可穿戴設備和VR等領域的首選傳感器模塊。其內部集成的DMP不僅簡化了外部數(shù)據(jù)處理,也為實現(xiàn)高精度姿態(tài)估計提供了強有力的支持。然而,在實際應用中,校準、磁干擾和信號完整性等問題依然需要開發(fā)者認真對待,通過軟硬件設計優(yōu)化實現(xiàn)更穩(wěn)定可靠的系統(tǒng)。

需要源代碼可收藏加關注在評論留下郵箱獲?。。?!

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2577

    文章

    55503

    瀏覽量

    793947
  • STM32F
    +關注

    關注

    1

    文章

    42

    瀏覽量

    18820
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    基于STM32F103C8T6的智能超聲波測距尺:從原理到代碼的完整實現(xiàn)

    連接、時序邏輯以及核心代碼的實現(xiàn)。 一、硬件連接與選型 核心硬件: - MCU: STM32F103C8T6 (藍 pill 最小系統(tǒng)板) - 傳感器: HC-SR04 超聲波模塊 - 顯示
    發(fā)表于 02-28 02:21

    STM32驅動串口屏,STM32F103C8T6串口發(fā)送指令控制HMI串口屏

    僅是一部分常用的基礎指令,更多更仔細的指令或者函數(shù)可以訪問陶晶馳資料官網(wǎng)。 硬件和接線 硬件需要一塊STM32F103C8T6的開發(fā)板,杜邦線諾干,2.4寸串口屏一塊 接線 串口屏 STM32 +5V 5V TX PA10 RX PA9 GND GND 實驗前準備 準備前
    的頭像 發(fā)表于 02-10 17:07 ?558次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>驅動</b>串口屏,<b class='flag-5'>STM32F103C8T6</b>串口發(fā)送指令控制HMI串口屏

    【瑞薩RA6E2】硬件IIC驅動傳感器與OLED顯示

    通過現(xiàn)有代碼的成功運行,驗證了以下能力: 硬件IIC可靠性 :RA6E2的硬件IIC接口能夠穩(wěn)定驅動多個傳感器設備 實時數(shù)據(jù)處理 :系統(tǒng)能夠實時采集、處理和顯示
    發(fā)表于 11-27 02:18

    f103c8t6使用adc采樣時程序無法正常工作怎么解決?

    我在學習使用stm32f103c8t6的adc的使用時遇到了這個問題。 是按照教程一步一步操作的:這是教程地址:https://blog.csdn.net/WTF___000/article
    發(fā)表于 10-13 07:25

    stm32f103c8t6 PWM設置后不生效是怎么回事?

    參照這這篇文檔 https://blog.csdn.net/2301_80066900/article/details/144024976 芯片f103c8t6,rt版本4.1.1, 定時TIM2
    發(fā)表于 09-10 07:26

    CherryUSB +STM32F103C8 example usb cdc device不識別是怎么回事?

    stm32f103c8t6 配置cdc,使用cubeMX 配置生成xxx_msp.c 為什么 放開 CONFIG_USBDEV_SETUP_LOG_PRINT 發(fā)現(xiàn) usb 中斷 一直未能進入 ____usbd_event_ep0_setup_complete_hand
    發(fā)表于 09-10 07:03

    零知開源——STM32F407VET6驅動SHT41溫濕度傳感器完整教程

    目基于STM32F407VET6零知增強板,實現(xiàn)SHT41高精度溫濕度傳感器驅動數(shù)據(jù)采集。SHT41是Sensirion推出的新一代數(shù)字溫濕度
    發(fā)表于 07-10 12:01

    零知開源——STM32F407VET6驅動SHT41溫濕度傳感器完整教程

    摘要:本項目基于STM32F407VET6零知增強板驅動SHT41高精度溫濕度傳感器,實現(xiàn)±0.2℃溫度精度和±1.8%RH濕度精度的數(shù)據(jù)采集。硬件連接采用I2
    的頭像 發(fā)表于 07-09 18:53 ?1887次閱讀
    零知開源——<b class='flag-5'>STM32F407VET6</b><b class='flag-5'>驅動</b>SHT41溫濕度<b class='flag-5'>傳感器</b>完整教程

    零知開源——STM32F103RBT6驅動 ICM20948 傳感器及 vofa + 上位機可視化教程

    STM32F1本教程使用零知標準板(STM32F103RBT6)通過I2C驅動ICM20948
    發(fā)表于 06-09 14:53

    零知開源——STM32F103RBT6驅動 ICM20948 傳感器及 vofa + 上位機可視化教程

    本教程使用零知標準板(STM32F103RBT6)通過I2C驅動ICM20948傳感器,實現(xiàn)
    的頭像 發(fā)表于 06-09 14:01 ?2228次閱讀
    零知開源——<b class='flag-5'>STM32F103RBT6</b><b class='flag-5'>驅動</b> ICM20948 <b class='flag-5'>九</b><b class='flag-5'>軸</b><b class='flag-5'>傳感器</b>及 vofa + 上位機可視化教程

    基于stm32mpu9250的usb hid鍵盤、鼠標、游戲控制實例打包下載

    基于stm32mpu9250的usb hid鍵盤、鼠標、游戲控制實例打包,推薦下載!
    發(fā)表于 05-29 21:44

    基于stm32mpu9250的usb hid鍵盤、鼠標、游戲控制

    基于stm32mpu9250的usb hid鍵盤、鼠標、游戲控制 項目實例下載! 純分享帖,需要者可點擊附件免費獲取完整資料~~~【免責聲明】本文系網(wǎng)絡轉載,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請
    發(fā)表于 05-23 20:53

    STM32F103C6T6 DCAC逆變器原理圖

    STM32F103C6T6 DCAC逆變器原理圖
    發(fā)表于 05-19 17:48 ?2次下載

    stm32f103c8t6主控芯片無人機原理圖

    stm32f103c8t6主控芯片無人機原理圖
    發(fā)表于 04-29 17:02 ?3次下載

    STM32F103C8T6無法選擇外部晶振怎么解決?

    我從網(wǎng)上購入了STM32F103C8T6的核心板,板上有外部晶振。但我使用STM32CubeMX生成項目時,卻無法選擇外部晶振(如下圖)。請問要在哪里設置才能選擇外部晶振呀?
    發(fā)表于 04-28 07:03