MPU6050模塊

一:MPU6050簡介

輸出一個隨姿態變化而變化的電壓,想要量化電壓,就得使用ADC轉化

歐拉角

偏航角(Yaw):也叫航向角,通常是繞 z 軸旋轉的角度,以 x 軸正向為起始邊,旋轉后 x 軸在 xOy 平面上的投影與起始邊的夾角就是偏航角,范圍一般是 [-π, π] 。例如,在飛機飛行中,偏航角表示飛機機頭相對于初始航向的左右偏轉角度。

俯仰角(Pitch):是繞 y 軸旋轉的角度,以 x 軸正向為起始邊,旋轉后 x 軸與 xOz 平面的夾角就是俯仰角,范圍一般是 [-π/2, π/2] 。對于飛機來說,俯仰角反映飛機機頭的上下仰俯程度。

滾轉角(Roll):繞 x 軸旋轉的角度,以 y 軸正向為起始邊,旋轉后 y 軸與 yOz 平面的夾角就是滾轉角,范圍一般是 [-π, π] 。比如飛機飛行時,機翼的傾斜狀態就由滾轉角體現。

加速度計具有靜態穩定性,不具備動態穩定性

陀螺儀具有動態穩定性,不具有靜態穩定性

兩組數據相互融合,就可以得到姿態角

參數

0X68為從機地址,左移一位 再 按位或上讀寫位(1/0)

把0X68左移一位后的數據作為,從機地址0XD0

讀0XD0 或上0X01記0XD1為讀

寫 0XD0 或上 0x00 記0XD0 為寫,就是把讀寫位融入從機地址

硬件電路圖

通信引腳(SDA/SCL、XDA/XCL)


SDA/SCL:主 I2C 總線,直連主機(如 STM32),支持掛載多設備(如磁場傳感器),簡化拓撲。

XDA/XCL:從 I2C 總線,用于級聯從設備,因控制復雜、效率低,實際少用,優先選 “多設備共 SDA/SCL” 方案。

?XCL 和XDA通常用于外接磁力計,或氣壓計,主機能直接讀取數據

?地址配置(AD0)


7 位從機地址由?AD0?電平決定:

  1. AD0=0(默認下拉)→ 地址?0x68(二進制?1101000);
  2. AD0=1(接 VCC)→ 地址?0x69(二進制?1101001)。
  3. 可通過改?AD0?電平,實現同一總線掛多個 MPU6050(需硬件改引腳)。

?中斷引腳(INT)


  1. 功能豐富:支持 “數據就緒、I2C 錯誤、自由落體、零運動檢測” 等事件觸發。
  2. 價值:主機無需輪詢寄存器,靠中斷快速響應,適合低功耗 / 高實時性場景(如運動控制、傳感器融合)。

供電邏輯(VDD、VCC-5V、LDO)


  1. VDD:核心供電(2.375 - 3.46V),需精準穩壓,不可直連 5V。
  2. VCC-5V:寬壓輸入(3.3 - 5V),經板載 LDO 轉 3.3V 供內部電路,適配不同電源環境。

內部框圖

陀螺儀內部是需要高電壓支持的所以,用了電荷泵進行升壓

時鐘源一般選擇內置時鐘源,或者陀螺儀內部晶振時鐘

由于電容的電荷量少,所以需要充電和放電的過程來回轉化,就可以持續穩定升壓,再經過濾波器,就得到穩定的10v電壓

使用

寫字節時,要先解除睡眠模式

寄存器

運動傳感器

SMPLRT_DIV采樣率分頻器 ,用于設置傳感器數據輸出的采樣率分頻系數,SMPLRT_DIV[7:0]表示該寄存器是 8 位可讀寫(RW)的,通過設置不同數值調整采樣率。

CONFIG:配置 ,EXT_SYNC_SET[2:0]用于設置外部同步輸入的配置,DLPF_CFG[2:0]是數字低通濾波器(Digital Low Pass Filter )配置,可設定濾波特性來處理信號噪聲等。

GYRO_CONFIG:陀螺儀配置 ,FS_SEL[1:0]用于選擇陀螺儀的滿量程范圍(Full Scale Select ),決定陀螺儀可測量的角速度范圍。

ACCEL_CONFIG加速度計配置 ,XA_ST、YA_ST、ZA_ST分別是 X、Y、Z 軸的自測試(Self - Test )使能位;AFS_SEL[1:0]選擇加速度計的滿量程范圍(Accelerometer Full Scale Select );ACCEL_HPF[2:0]是加速度計高通濾波器(High Pass Filter )配置,用于過濾低頻信號。

慣性測量單元(如 MPU6050 等傳感器)的寄存器映射表

加速度計數據寄存器:ACCEL_XOUT_H/L、ACCEL_YOUT_H/L、ACCEL_ZOUT_H/L?,分別存儲 X、Y、Z 軸加速度測量值的高 8 位和低 8 位,拼接成 16 位數據反映加速度大小 。

溫度傳感器寄存器:TEMP_OUT_H/L?,存儲溫度測量值的高、低 8 位,組合為 16 位數據表示芯片溫度 .

陀螺儀數據寄存器:GYRO_XOUT_H/L、GYRO_YOUT_H/L、GYRO_ZOUT_H/L?,分別存儲 X、Y、Z 軸角速度測量值的高、低 8 位,拼接成 16 位數據體現角速度情況 ,這些寄存器用于讀取傳感器采集的運動、溫度數據 。

電源管理寄存器

PWR_MGMT_1(電源管理 1):可讀寫(RW),DEVICE_RESET用于設備復位;SLEEP控制睡眠模式;CYCLE使能循環模式;TEMP_DIS用于關閉溫度傳感器;CLKSEL[2:0]選擇系統時鐘源 。

PWR_MGMT_2(電源管理 2):可讀寫(RW),LP_WAKE_CTRL[1:0]配置低功耗喚醒控制;STBY_XA、STBY_YA、STBY_ZA分別使能加速度計 X、Y、Z 軸待機;STBY_XG、STBY_YG、STBY_ZG分別使能陀螺儀 X、Y、Z 軸待機 ,用于靈活控制傳感器各軸的功耗狀態 。

設備 ID 寄存器

WHO_AM_I:只讀(R)寄存器,WHO_AM_[6:1]存儲設備自身的標識 ID ,用于主機通過 I2C 等總線讀取,識別設備型號、判斷設備是否正常連接,是傳感器通信初始化時常用的 “設備身份確認” 寄存器?。

二:I2C

物理層特性

I2C 協議僅需要兩根線即可實現通信:

  1. SDA(Serial Data Line):串行數據線
  2. SCL(Serial Clock Line):串行時鐘線

這兩根線都需要通過上拉電阻連接到電源,因此當總線上的所有設備都不驅動總線時,總線會保持高電平狀態。這種設計使得多個設備可以共享同一總線,實現多主多從的通信架構。

數據傳輸格式

I2C 通信以字節(8 位)為基本單位進行數據傳輸,每個字節后面會跟隨一個應答位(ACK/NACK)。數據傳輸時,最高位(MSB)先發送。

通信流程通常包括:

  1. 起始信號(Start Condition)
  2. 從設備地址(7 位或 10 位)+ 讀寫位
  3. 應答位(ACK/NACK)
  4. 數據傳輸
  5. 停止信號(Stop Condition)

硬件

時序圖?

起始信號的核心是 “當 SCL 為高電平時,SDA 出現下降沿(從高到低的跳變)”。要產生這個下降沿,必須先讓 SDA 處于高電平狀態,再在 SCL 保持高電平期間將 SDA 拉低。

停止信號(Stop):當 SCL 為高電平時,SDA 由低電平變為高電平(上升沿),表示通信結束。

void MyI2C_Start(void)
{MyI2C_W_SDA(1);MyI2C_W_SCL(1);MyI2C_W_SDA(0);MyI2C_W_SCL(0);	
}
void MyI2C_Stop(void)
{MyI2C_W_SDA(0);MyI2C_W_SCL(1);MyI2C_W_SDA(1);
}

該函數通過循環逐位發送 8 位數據:先通過位運算將當前位輸出到 SDA 線,再拉高 SCL 讓從機讀取,最后拉低 SCL 準備下一位,按 I2C 時序完成 1 字節傳輸。?

void MyI2C_SendByte(uint8_t Byte)
{uint8_t i;for(i=0;i<8;i++){//傳遞8位數據,這樣寫方便MyI2C_W_SDA(Byte & (0x80>>i));MyI2C_W_SCL(1);MyI2C_W_SCL(0);}
}	

?整個過程遵循 I2C 時序:SCL 高電平時讀取 SDA 數據,低電平時準備下一位,確保數據按位(高位優先)正確接收。

uint8_t MyI2C_ReceiveByte(void)
{uint8_t i,Byte=0x00;MyI2C_W_SDA(1);//先釋放for(i=0;i<8;i++){MyI2C_W_SCL(1);if(MyI2C_R_SDA()==1) {Byte |=(0x80 >>i);}MyI2C_W_SCL(0);}return Byte;
}

MyI2C_SendAck(uint8_t AckByte):發送應答信號:每傳輸 1 字節數據后,接收方必須發送應答信號。若發送 “非應答”(1),通常表示數據傳輸結束或接收失敗。

MyI2C_ReceiveAck(void):接收應答信號AckByte為 0 時表示接收成功,為 1 時表示接收失敗或需終止傳輸。?

void MyI2C_SendAck(uint8_t AckByte)
{MyI2C_W_SDA(AckByte);MyI2C_W_SCL(1);MyI2C_W_SCL(0);
}	
uint8_t MyI2C_ReceiveAck(void)
{uint8_t i,AckByte=0x00;MyI2C_W_SDA(1);//先釋放MyI2C_W_SCL(1);AckByte=MyI2C_R_SDA();MyI2C_W_SCL(0);return AckByte;
}

?三:MPU6050的邏輯

整個過程遵循 I2C “主設備寫從設備” 的標準流程:起始信號→設備地址(寫)→應答→寄存器地址→應答→數據→應答→停止信號,確保數據準確寫入 MPU6050 的目標寄存器?

void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS);MyI2C_ReceiveAck();MyI2C_SendByte(RegAddress);MyI2C_ReceiveAck();MyI2C_SendByte(Data);MyI2C_ReceiveAck();MyI2C_Stop();
}

uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{uint8_t Data;MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS);MyI2C_ReceiveAck();MyI2C_SendByte(RegAddress);MyI2C_ReceiveAck();MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS | 0x01);MyI2C_ReceiveAck();Data = MyI2C_ReceiveByte();MyI2C_SendAck(1);MyI2C_Stop();return Data;
}

初始化

配置完后的檢測的數據都放到了相應的寄存器中

最后直接調用寄存器

void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{uint8_t DataH, DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);*AccX = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);*AccY = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);*AccZ = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);*GyroX = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);*GyroY = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);*GyroZ = (DataH << 8) | DataL;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916996.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916996.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916996.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jvm的棧和堆

在 JVM 中&#xff0c;棧&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;是兩種核心內存區域&#xff0c;用于存儲不同類型的數據&#xff0c;它們的設計和存儲規則有明確區分&#xff0c;主要體現在存儲內容、生命周期和管理方式上&#xff1a;一、棧&#xf…

自動駕駛車輛的敏捷安全檔案

簡介近年來&#xff0c;在開發安全關鍵軟件時&#xff0c;敏捷開發方法的使用日益增多。敏捷方法非常適合自動駕駛汽車軟件的增量改進、運行設計域的逐步擴展以及新型智能路側單元的開發。由于車輛和智能路側單元的預期改進&#xff0c;未來幾年將會有新的自動駕駛車輛試驗。因…

【時時三省】(C語言基礎)動態內存分配與它的指針變量

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省什么是內存的動態分配全局變量是分配在內存中的靜態存儲區的&#xff0c;非靜態的局部變量&#xff08;包括形參&#xff09;是分配在內存中的動態存儲區的&#xff0c;這個存儲區是一個稱為棧…

SpringMVC的核心架構與請求處理流程

Spring MVC 核心架構核心組件組件作用類比DispatcherServlet前端控制器&#xff0c;統一接收請求并協調各組件處理一個餐廳的前臺HandlerMapping根據請求URL映射到對應的處理器&#xff08;Controller&#xff09;路由表HandlerAdapter執行處理器方法&#xff0c;處理參數綁定、…

css 不錯的按鈕動畫

效果圖wxml <view class"{{status?active:}}"><view class"up-top btn"><text>向上</text></view><view class"up-left btn"><text>向左</text></view><view class"up-center b…

若依框架RuoYi-Vue-Plus-5.X的啟動,本地安裝docker,再部署 Redis、PG數據庫(智慧水務)SmartWaterServer

一、部署redis數據庫拉取鏡像 docker pull redis啟動Redis容器docker run -d --name redis-server -p 6379:6379 -v redis-data:/data redis redis-server --requirepass 123redis版本二、部署PostgreSQL 數據庫拉取鏡像docker pull postgres:15 創建數據存儲目錄、建議將數據掛…

Idea 清除無用的引用類

在IntelliJ IDEA中&#xff0c;你可以通過以下方式將選中的代碼設置為大寫&#xff1a;1. 使用快捷鍵(推薦)Windows/Linux&#xff1a;Ctrl Shift UMac&#xff1a;Cmd Shift U操作步驟&#xff1a;選中文本按下快捷鍵&#xff0c;即可在大小寫之間切換。2. 通過菜單操作選…

同個主機拉取不同權限倉庫的方法

背景&#xff1a;因為某些神奇的原因&#xff0c;無法同時授權倉庫權限給自己。 1.本地電腦只有權限訪問web倉庫地址&#xff0c;無權限訪問backend倉庫&#xff1b; 2.堡壘機服務器只有權限訪問backend倉庫&#xff0c;無權限訪問web倉庫地址。 web倉庫地址 &#xff1a;codeu…

快速搭建Node.js服務指南

Node.js是構建高效、可擴展網絡應用的理想選擇。以下是幾種快速搭建Node.js服務的方法。 方法一&#xff1a;使用Express&#xff08;最流行框架&#xff09; 1. 初始化項目 mkdir my-node-service cd my-node-service npm init -y2. 安裝Express npm install express3. 基礎服…

通義千問Qwen3-30B-A3B-Thinking-2507技術解析:推理模型的工程實踐突破

Qwen3-30B-A3B模型架構圖2025年7月30日&#xff0c;阿里云通義千問團隊發布了Qwen3-30B-A3B-Thinking-2507推理模型&#xff0c;這是繼Qwen3-30B-A3B-Instruct-2507后的又一力作。作為專注于推理任務的專用模型&#xff0c;它在數學能力測試AIME25上取得85.0分&#xff0c;超越…

【源力覺醒 創作者計劃】文心一言與deepseek集成springboot開發哪個更方便

一.實驗背景 當前文心一言和deepseek都開源了&#xff0c;二者都可以作為大模型應用開發的模型基礎了&#xff0c;我們都可以編寫springboot項目來集成deepseek和文心一言了 二.實驗目標 本文基于實際操作&#xff0c;通過實際操作來對比文心一言和deepseek在集成到springbo…

核磁共振數據T2幾何均值計算

1、T? 幾何均值公式如下&#xff1a;2、核磁T2幾何均值計算代碼 CSV 文件文件格式&#xff1a; 每一行是一個樣點&#xff08;樣品深度&#xff09;&#xff0c;列為&#xff1a;第一列是“深度”或其他&#xff1b;第二列及以后&#xff08;如 TASPEC0 ~ TASPEC199&#xff0…

微服務架構技巧篇——接口類設計技巧

目錄 一、微服務架構的特點 二、微服務接口類設計技巧 2.1、BFF(Backend For Frontend) 2.1.1、 服務分布式帶來的第一個挑戰導致的幾個典型問題 2.1.2、什么是 BFF 2.1.3、BFF 應用場景 2.1.4、BFF 落地經驗 2.1.4.1、前端負責 BFF 開發優缺點 2.1.4.2、后端負責 BFF 開發優…

C++游戲開發(2)

直接上代碼 1.首先是頭文件編寫 #include <iostream> #include <graphics.h> #include <string> 2,添加畫布 長1280&#xff0c;寬720 initgraph(1280, 720); 3.添加主循環 bool running true; while(runing) { } 4.定義結構體變量msg ExMessge msg; 5.開…

Unity開發2D類銀河惡魔城游戲學習筆記目錄

Unity開發2D類銀河惡魔城游戲學習筆記 Unity教程&#xff08;零&#xff09;Unity和VS的使用相關內容 玩家狀態機 Unity教程&#xff08;一&#xff09;開始學習狀態機 Unity教程&#xff08;二&#xff09;角色移動的實現 Unity教程&#xff08;三&#xff09;角色跳躍的實現…

智慧社區項目開發(三)——基于 Spring Boot 實現動態路由加載:從數據庫到前端菜單的完整方案

在后臺管理系統中&#xff0c;不同用戶角色往往擁有不同的操作權限&#xff0c;對應的菜單展示也需動態調整。動態路由加載正是解決這一問題的核心方案 —— 根據登錄用戶的權限&#xff0c;從數據庫查詢其可訪問的菜單&#xff0c;封裝成前端所需的路由結構并返回。本文將詳細…

Python在自動化與運維領域的核心角色:工具化、平臺化與智能化

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 引言 在 IT 系統日益復雜、運維任務持續增長的今天&#xff0c;自動化已成為企業基礎設施管理的關鍵方向。Python 以其簡潔的語法、強大…

RAG實戰指南 Day 28:RAG系統緩存與性能優化

【RAG實戰指南 Day 28】RAG系統緩存與性能優化 開篇 歡迎來到"RAG實戰指南"系列的第28天&#xff01;今天我們將深入探討RAG系統的緩存機制與性能優化策略。在實際生產環境中&#xff0c;RAG系統往往面臨高并發、低延遲的需求&#xff0c;而合理的緩存設計和性能優…

swanlab實驗優雅起名

init中的參數的作用project&#xff1a;整個實驗的名字&#xff1b;experiment_name&#xff1a;在這個實驗中&#xff0c;你的名字是什么&#xff1b; 比如說現在我們要進行對比實驗&#xff0c;PEAN和Triflownet分別是對比方法的名字&#xff0c;這樣的好處是&#xff0c;她們…

Nestjs框架: NestJS 核心機制解析 —— DI(依賴注入)容器與模塊化工作原理

理解 NestJS 的 DI 管理機制 我們想要了解依賴注入&#xff08;Dependency Injection, DI&#xff09;最核心的工作邏輯NestJS 擁有自己的一套 DI 管理系統&#xff0c;它通過一個稱為 DI 容器 的機制&#xff0c;來統一管理應用中所有類&#xff08;class&#xff09;的依賴關…