CCS-MSPM0G3507-7-模塊篇-MPU6050的基本使用

前言

本篇我們接收對MPU6050的基本使用,獲取ID,通過IIC協議獲取寄存器的值,至于高級濾波算法,比如卡爾曼濾波,或者上面的,后面再更新

基本配置

最好選擇PA0和PA1,5V開漏

然后給上代碼

MPU6050.c

#include "MPU6050.h"
#include "delay.h"// I2C通信相關的靜態函數定義
// 設置 SCL 引腳電平,并添加延時
static void IIC_SCL_(uint8_t state)
{if (state)DL_GPIO_setPins(SOFT_IIC_SCL_PORT, SOFT_IIC_SCL_PIN);elseDL_GPIO_clearPins(SOFT_IIC_SCL_PORT, SOFT_IIC_SCL_PIN);delay_us(5);
}// 設置 SDA 引腳電平,并添加延時
static void IIC_SDA_(uint8_t state)
{DL_GPIO_initDigitalOutput(MPU6050_SDA_IOMUX);if (state)DL_GPIO_setPins(SOFT_IIC_SDA_PORT, SOFT_IIC_SDA_PIN);elseDL_GPIO_clearPins(SOFT_IIC_SDA_PORT, SOFT_IIC_SDA_PIN);delay_us(5);
}// 讀取 SDA 引腳電平
static uint8_t IIC_SDA_Read(void)
{DL_GPIO_initDigitalInputFeatures(MPU6050_SDA_input,DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);return DL_GPIO_readPins(SOFT_IIC_SDA_PORT, SOFT_IIC_SDA_PIN);
}// I2C 初始化
static void IIC_Init(void)
{// 初始狀態:SCL 和 SDA 都為高電平IIC_SCL_(1);IIC_SDA_(1);
}// 發送起始信號
static void IIC_Start(void)
{IIC_SDA_(1);IIC_SCL_(1);IIC_SDA_(0);IIC_SCL_(0);
}// 發送停止信號
static void IIC_Stop(void)
{IIC_SCL_(0);IIC_SDA_(0);IIC_SCL_(1);IIC_SDA_(1);
}// 發送一個字節
static void IIC_SendByte(uint8_t data)
{uint8_t i;for (i = 0; i < 8; i++){IIC_SDA_((data & 0x80) >> 7);data <<= 1;IIC_SCL_(1);IIC_SCL_(0);}
}// 接收一個字節
static uint8_t IIC_ReceiveByte(uint8_t ack)
{uint8_t i, data = 0;IIC_SDA_(1); // 釋放 SDA 線for (i = 0; i < 8; i++){IIC_SCL_(1);data <<= 1;if (IIC_SDA_Read())data |= 0x01;IIC_SCL_(0);}if (ack)IIC_SDA_(0); // 發送應答elseIIC_SDA_(1); // 發送非應答IIC_SCL_(1);IIC_SCL_(0);return data;
}// 等待應答信號
static uint8_t IIC_WaitAck(void)
{uint8_t ack;IIC_SDA_(1);IIC_SCL_(1);ack = IIC_SDA_Read();IIC_SCL_(0);return ack;
}// 向 MPU6050 寫入一個字節數據
static void IIC_Write_REG(uint8_t addr, uint8_t reg, uint8_t data)
{IIC_Start();IIC_SendByte((addr << 1) | 0); // 發送寫地址IIC_WaitAck();IIC_SendByte(reg); // 發送寄存器地址IIC_WaitAck();IIC_SendByte(data); // 發送數據IIC_WaitAck();IIC_Stop();
}// 從 MPU6050 讀取一個字節數據
static uint8_t IIC_Read_REG(uint8_t Address, uint8_t regaddress)
{uint8_t data;IIC_Start();                    // 發送起始信號IIC_SendByte(Address << 1 | 0); // 發送設備地址和寫操作IIC_WaitAck();                  // 等待 ACKIIC_SendByte(regaddress);       // 發送寄存器地址IIC_WaitAck();                  // 等待 ACKIIC_Start();                    // 發送起始信號IIC_SendByte(Address << 1 | 1); // 發送設備地址和讀操作IIC_WaitAck();                  // 等待 ACKdata = IIC_ReceiveByte(0);      // 讀取數據IIC_Stop();                     // 發送停止信號return data;                    // 返回讀取的數據
}// MPU6050 初始化函數
uint8_t MPU6050_Init(void)
{IIC_Init(); // 初始化 I2C 總線// 喚醒 MPU6050IIC_Write_REG(MPU6050_ADDR_AD0_LOW, PWR_MGMT_1, 0x00);delay_ms(100); // 等待喚醒// 設置采樣率分頻IIC_Write_REG(MPU6050_ADDR_AD0_LOW, SMPLRT_DIV, 0x07);// 設置低通濾波器IIC_Write_REG(MPU6050_ADDR_AD0_LOW, CONFIG, 0x06);// 設置陀螺儀量程 ±250°/sIIC_Write_REG(MPU6050_ADDR_AD0_LOW, GYRO_CONFIG, 0x00);// 設置加速度計量程 ±2gIIC_Write_REG(MPU6050_ADDR_AD0_LOW, ACCEL_CONFIG, 0x00);delay_ms(100); // 等待喚醒return 0;
}// 讀取 MPU6050 的設備 ID
uint8_t MPU6050_GetDeviceID(void)
{uint8_t data;data = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, WHO_AM_I); // 讀取設備 ID 寄存器return data;                                         // 返回設備 ID
}float MPU6050_GET_Tempure(void)
{int16_t temp;                                       // 用于存儲溫度傳感器數據uint8_t H, L;                                       // 用于存儲高字節和低字節的數據H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, TEMP_OUT_H); // 讀取溫度傳感器高字節L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, TEMP_OUT_L); // 讀取溫度傳感器低字節temp = (H << 8) | L;                                // 將高字節和低字節合并為一個 16 位數據return (float)temp / 340.0 + 36.53 - 200;           // 計算溫度值并返回
}float MPU6050_GetAccelX(void)
{int16_t accel;                                        // 用于存儲加速度傳感器數據uint8_t H, L;                                         // 用于存儲高字節和低字節的數據H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_XOUT_H); // 讀取加速度傳感器 X 軸高字節L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_XOUT_L); // 讀取加速度傳感器 X 軸低字節accel = (H << 8) | L;                                 // 將高字節和低字節合并為一個 16 位數據return ((float)accel / 16384.0 + 1) * 90 - 90;        // 直接返回角度
}float MPU6050_GetAccelY(void)
{int16_t accel;                                        // 用于存儲加速度傳感器數據uint8_t H, L;                                         // 用于存儲高字節和低字節的數據H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_YOUT_H); // 讀取加速度傳感器 Y 軸高字節L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_YOUT_L); // 讀取加速度傳感器 Y 軸低字節accel = (H << 8) | L;                                 // 將高字節和低字節合并為一個 16 位數據return ((float)accel / 16384.0 + 1) * 90 - 90;        // 直接返回角度
}float MPU6050_GetAccelZ(void)
{int16_t accel;                                        // 用于存儲加速度傳感器數據uint8_t H, L;                                         // 用于存儲高字節和低字節的數據H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_ZOUT_H); // 讀取加速度傳感器 Z 軸高字節L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_ZOUT_L); // 讀取加速度傳感器 Z 軸低字節accel = (H << 8) | L;                                 // 將高字節和低字節合并為一個 16 位數據return ((float)accel / 16384.0 + 1) * 90 - 90;        // 直接返回角度
}float MPU6050_GetAngleX(void)
{int16_t gyro;                                        // 用于存儲陀螺儀數據uint8_t H, L;                                        // 用于存儲高字節和低字節的數據H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_XOUT_H); // 讀取陀螺儀 X 軸高字節L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_XOUT_L); // 讀取陀螺儀 X 軸低字節gyro = (H << 8) | L;                                 // 將高字節和低字節合并為一個 16 位數據return (float)gyro / 131.0;                          // 計算角速度值并返回
}float MPU6050_GetAngleY(void)
{int16_t gyro;                                        // 用于存儲陀螺儀數據uint8_t H, L;                                        // 用于存儲高字節和低字節的數據H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_YOUT_H); // 讀取陀螺儀 Y 軸高字節L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_YOUT_L); // 讀取陀螺儀 Y 軸低字節gyro = (H << 8) | L;                                 // 將高字節和低字節合并為一個 16 位數據return (float)gyro / 131.0;                          // 計算角速度值并返回
}float MPU6050_GetAngleZ(void)
{int16_t gyro;                                        // 用于存儲陀螺儀數據uint8_t H, L;                                        // 用于存儲高字節和低字節的數據H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_ZOUT_H); // 讀取陀螺儀 Z 軸高字節L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_ZOUT_L); // 讀取陀螺儀 Z 軸低字節gyro = (H << 8) | L;                                 // 將高字節和低字節合并為一個 16 位數據return (float)gyro / 131.0;                          // 計算角速度值并返回
}

MPU6050.h

#ifndef __MPU6050_H
#define __MPU6050_H#include "ti_msp_dl_config.h"// I2C引腳定義
#define SOFT_IIC_SCL_PORT GPIOA        // SCL端口
#define SOFT_IIC_SCL_PIN DL_GPIO_PIN_1 // SCL引腳
#define SOFT_IIC_SDA_PORT GPIOA        // SDA端口
#define SOFT_IIC_SDA_PIN DL_GPIO_PIN_0 // SDA引腳
#define MPU6050_SDA_input   IOMUX_PINCM1  // SDA引腳IOMUX配置// MPU6050寄存器地址定義
#define M_PI 3.14
#define SMPLRT_DIV 0x19   // 采樣率分頻,典型值:0x07(125Hz) */
#define CONFIG 0x1A       // 低通濾波頻率,典型值:0x06(5Hz) */
#define GYRO_CONFIG 0x1B  // 陀螺儀自檢及測量范圍,典型值:0x18(不自檢,2000deg/s) */
#define ACCEL_CONFIG 0x1C // 加速計自檢、測量范圍及高通濾波頻率,典型值:0x01(不自檢,2G,5Hz) */#define ACCEL_XOUT_H 0x3B // 存儲最近的X軸、Y軸、Z軸加速度感應器的測量值 */
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40#define TEMP_OUT_H 0x41 // 存儲的最近溫度傳感器的測量值 */
#define TEMP_OUT_L 0x42#define GYRO_XOUT_H 0x43 // 存儲最近的X軸、Y軸、Z軸陀螺儀感應器的測量值 */
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48#define PWR_MGMT_1 0x6B // 電源管理,典型值:0x00(正常啟用) */
#define PWR_MGMT_2 0x6C // 電源管理,典型值:0x00(正常啟用) */
#define WHO_AM_I 0x75   // IIC地址寄存器(默認數值0x68,只讀) */// HAL庫的讀寫只需要使用7位地址
#define MPU6050_ADDR_AD0_LOW 0x68 // AD0低電平時7位地址為0X68 iic寫時時發送0XD0
#define MPU6050_ADDR_AD0_HIGH 0x69// 函數聲明
uint8_t MPU6050_Init(void);
uint8_t MPU6050_GetDeviceID(void);
float MPU6050_GET_Tempure(void);
float MPU6050_GetAccelX(void);
float MPU6050_GetAccelY(void);
float MPU6050_GetAccelZ(void);
float MPU6050_GetAngleX(void);
float MPU6050_GetAngleY(void);
float MPU6050_GetAngleZ(void);#endif /* __MPU6050_H */

主函數測試

    uart_init();uart_send_string("=== MPU6050 Test Program ===\r\n");char buf[100];MPU6050_Init();uint8_t id = MPU6050_GetDeviceID();sprintf(buf, "MPU6050 ID: %x\r\n", id);uart_send_string(buf);while (1){//sprintf(buf, "Acc: %.2f, %.2f, %.2f,\r\n", MPU6050_GetAccelX(), MPU6050_GetAccelY(), MPU6050_GetAccelZ());// uart_send_string(buf);sprintf(buf, "Gyro: %.2f, %.2f, %.2f,\r\n",MPU6050_GetAngleX(), MPU6050_GetAngleY(), MPU6050_GetAngleZ());uart_send_string(buf);delay_ms(100);}

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

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

相關文章

spring-ai agent概念

目錄agent 概念理解記憶能力工具計劃agent 概念理解 agent 智能體&#xff0c;突出智能 大模型的感覺 告訴你怎么做&#xff08;也不一定正確&#xff09;不會幫你做 Agent的感覺 直接準確的幫你做完&#xff08;比如&#xff0c;告訴 AI Agent 幫忙下單一份外賣&#xff0c…

NO.4數據結構數組和矩陣|一維數組|二維數組|對稱矩陣|三角矩陣|三對角矩陣|稀疏矩陣

數組的儲存 【定義】 數組&#xff1a; 由 n&#xff08;≥1&#xff09; 個相同類型的數據元素構成的有限序列&#xff0c; 是線性表的推廣。 一旦被定義&#xff0c; 維數和長度就不可再改變&#xff0c; 一般對其只有元素的存取和修改操作。 一維數組 Arr[a0,…,an?1] Arr[…

如何把Arduino IDE中ESP32程序bin文件通過樂鑫flsah_download_tool工具軟件下載到ESP32中

目錄前言獲取Arduino IDE中ESP32程序bin文件flsah_download_tool工具軟件下載程序bin文件到ESP32中總結前言 Arduino IDE豐富的驅動庫給ESP32的開發帶來了很多便利&#xff0c;當我們下載程序的時候&#xff0c;直選選擇好ESP32開發板型號和端口號即可下載程序到開發板中&…

2025XYD Summer Camp 7.11 模考

T1TTT 組詢問&#xff0c;每組詢問給定 n,mn,mn,m&#xff0c;求 (nm)?1?∑i1n∑j1mlcm?(i,j) (nm)^{-1}\cdot\sum_{i1}^n\sum_{j1}^m\operatorname{lcm}(i,j) (nm)?1?i1∑n?j1∑m?lcm(i,j) 對 109710^971097 取模。 T≤20000T\le 20000T≤20000&#xff0c;n,m≤107n,m…

uniapp 微信小程序點擊開始倒計時

一、示例 當點擊按鈕時就開始倒計時代碼 <template><view class"sq_box"><button class"button" click"topay">按鈕</button><u-modal v-model"modalShow" :show-cancel-button"true" :content&…

【網絡】Linux 內核優化實戰 - net.netfilter.nf_conntrack_tcp_timeout_established

目錄一、核心概念1. **TCP 連接狀態跟蹤**2. **參數作用**二、默認值與典型場景1. **默認值**2. **典型場景**三、如何調整該參數1. **查看當前值**2. **臨時修改&#xff08;重啟后失效&#xff09;**3. **永久修改**四、相關參數與配合優化1. **其他 TCP 狀態超時參數**2. **…

鴻蒙app 開發中的Record<string,string>的用法和含義

Record<string, string> 在鴻蒙 App 開發中的用法在 TypeScript 中&#xff0c;Record<string, string> 是一個映射類型&#xff08;Mapped Type&#xff09;&#xff0c;用于描述一個對象的結構。在鴻蒙 App 開發中&#xff0c;它常用于定義接口、組件屬性或函數參…

Webpack、Vite配置技巧與CI/CD流程搭建全解析

Webpack、Vite配置技巧與CI/CD流程搭建全解析 在現代前端開發中&#xff0c;構建工具配置和自動化部署流程是提升開發效率和項目質量的關鍵環節。本文將深入探討Webpack和Vite這兩大構建工具的核心配置技巧&#xff0c;并詳細介紹CI/CD流程的搭建方法。 一、Webpack核心配置技巧…

輸入npm install后發生了什么

一、準備階段&#xff1a;配置與環境檢查讀取配置優先級npm install 首先加載多層級的配置&#xff08;優先級從高到低&#xff09;4&#xff1a;項目級 .npmrc用戶級 .npmrc&#xff08;如 ~/.npmrc&#xff09;全局 npmrcnpm 內置默認配置可通過 npm config ls -l 查看所有配…

SpringBoot集成Redis、SpringCache

1 Redis介紹 1.1 Redis作為緩存 由于Redis的存取效率非常高,在開發實踐中,通常會將一些數據從關系型數據庫(例如MySQL)中讀取出來,并寫入到Redis中,后續當需要訪問相關數據時,將優先從Redis中讀取所需的數據,以此,可以提高數據的讀取效率,并且對一定程度的保護關系型…

靜態路由綜合配置實驗報告

一、實驗拓撲二、實驗需求1.除了R5的環回地址固定5.5.5.0/24&#xff0c;其他網段基于192.168.1.0/24進行合理劃分&#xff1b;2.R1-R4每個路由器存在兩個環回接口&#xff0c;模擬PC&#xff0c;地址也在192.168.1.0/24網絡內&#xff1b;3.R1-R4不能直接編寫到達5.5.5.0/24的…

【一起來學AI大模型】PyTorch DataLoader 實戰指南

DataLoader 是 PyTorch 中處理數據的核心組件&#xff0c;它提供了高效的數據加載、批處理和并行處理功能。下面是一個全面的 DataLoader 實戰指南&#xff0c;包含代碼示例和最佳實踐。基礎用法&#xff1a;簡單數據加載import torch from torch.utils.data import Dataset, D…

SpringBoot單元測試類拿不到bean報空指針異常

原代碼package com.atguigu.gulimall.product;import com.aliyun.oss.OSSClient; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; impo…

持續集成 簡介環境搭建

1. 持續集成簡介 1.1 持續集成的作用 隨著互聯網的蓬勃發展,軟件生命周期模型也經歷了幾個比較大的階段,從最初的瀑布模型,到 V 模型,再到現在的敏捷或者 devops,不論哪個階段,項目從立項到交付幾乎都離不開以下幾個過程,開發、構建、測試和發布,而且一直都在致力于又…

關于 java:11. 項目結構、Maven、Gradle 構建系統

一、Java 項目目錄結構標準1.1 Java 項目標準目錄結構總覽標準 Java 項目目錄結構&#xff08;以 Maven / Gradle 通用結構為基礎&#xff09;&#xff1a;project-root/ ├── src/ │ ├── main/ │ │ ├── java/ # 主業務邏輯代碼&#xff08;核心…

大數據的安全挑戰與應對

在大數據時代&#xff0c;大數據安全問題已成為開發者最為關注的核心議題之一。至少五年來&#xff0c;大數據已融入各類企業的運營體系&#xff0c;而采用先進數據分析解決方案的組織數量仍在持續增長。本文將明確當前市場中最關鍵的大數據安全問題與威脅&#xff0c;概述企業…

PostgreSQL ERROR: out of shared memory處理方式

系統允許的總鎖數 SELECT (SELECT setting::int FROM pg_settings WHERE name max_locks_per_transaction) * (SELECT setting::int FROM pg_settings WHERE name max_connections) (SELECT setting::int FROM pg_settings WHERE name max_prepared_transactions);當鎖大于…

Django 模型(Model)

1. 模型簡介 ORM 簡介 MVC 框架中一個重要的部分就是 ORM,它實現了數據模型與數據庫的解耦,即數據模型的設計不需要依賴于特定的數據庫,通過簡單的配置就可以輕松更換數據庫。即直接面向對象操作數據,無需考慮 sql 語句。 ORM 是“對象-關系-映射”的簡稱,主要任務是:…

深入解析Hadoop RPC:技術細節與推廣應用

Hadoop RPC框架概述在分布式系統的核心架構中&#xff0c;遠程過程調用&#xff08;RPC&#xff09;機制如同神經網絡般連接著各個計算節點。Hadoop作為大數據處理的基石&#xff0c;其自主研發的RPC框架不僅支撐著內部組件的協同運作&#xff0c;更以獨特的工程哲學詮釋了分布…