STM32 HAL驅動MPU6050傳感器

STM32 HAL驅動MPU6050傳感器

項目概述

本項目實現了基于STM32 HAL庫的MPU6050傳感器驅動,可以讀取加速度計和陀螺儀數據。項目使用I2C接口與MPU6050通信,并通過UART接口輸出數據。

項目倉庫地址:STM32_Sensor_Drives

硬件連接

在這里插入圖片描述

MPU6050 I2C接口

PB10 ------> I2C2_SCL
PB11 ------> I2C2_SDA

UART調試接口

PA2 ------> USART2_TX
PA3 ------> USART2_RX

代碼結構

項目主要包含以下文件:

  • main.c: 主程序入口,初始化外設并循環讀取MPU6050數據
  • i2c.c/h: I2C配置和MPU6050驅動函數
  • usart.c/h: UART配置和printf重定向
  • gpio.c/h: GPIO配置

MPU6050驅動實現

數據結構定義

i2c.h中定義了MPU6050數據結構:

typedef struct _mpu6050_data{double ACCEL_X ,ACCEL_Y ,ACCEL_Z;double GYRO_X ,GYRO_Y ,GYRO_Z;
}mpu6050_data;

初始化函數

i2c.c中實現了MPU6050初始化函數:

void MPU6050_start(void)
{uint8_t SendAddress = 0x6b;uint8_t SendData  = 0x00; //解除休眠狀態HAL_I2C_Mem_Write(&hi2c2,0xD1,SendAddress,1,&SendData,1,0xff);SendAddress = 0x19;//采樣率分頻器SendData = 0x07;HAL_I2C_Mem_Write(&hi2c2,0xD1,SendAddress,1,&SendData,1,0xff);SendAddress = 0x1A;//低通濾波器SendData = 0x06;HAL_I2C_Mem_Write(&hi2c2,0xD1,SendAddress,1,&SendData,1,0xff);SendAddress = 0x1B;//陀螺儀SendData = 0x08;   //± 500 °/sHAL_I2C_Mem_Write(&hi2c2,0xD1,SendAddress,1,&SendData,1,0xff);SendAddress = 0x1C;//加速度計SendData = 0x00;   //± 2gHAL_I2C_Mem_Write(&hi2c2,0xD1,SendAddress,1,&SendData,1,0xff);   
}

初始化步驟:

  1. 解除MPU6050休眠狀態(寄存器0x6B)
  2. 設置采樣率分頻器(寄存器0x19)
  3. 配置低通濾波器(寄存器0x1A)
  4. 配置陀螺儀量程為±500°/s(寄存器0x1B)
  5. 配置加速度計量程為±2g(寄存器0x1C)

數據讀取函數

i2c.c中實現了MPU6050數據讀取函數:

void get_i2c_mpu6050(mpu6050_data *data){uint8_t MPU_Data[] = {0X00, 0X00,0X00, 0X00,0X00, 0X00,0X00, 0X00,0X00, 0X00,0X00, 0X00,0X00, 0X00};uint8_t preg1_Data  = 0x3B;HAL_I2C_Mem_Read(&hi2c2, 0xD1,preg1_Data,I2C_MEMADD_SIZE_8BIT,MPU_Data,14,50);float Temp = (MPU_Data[6]<<8)|MPU_Data[7];if(Temp>32768) Temp-=65536;Temp=(36.53+Temp/340);short int ACCEL_XOUT1 = ((MPU_Data[0]<<8)|MPU_Data[1]);data->ACCEL_X = (double)ACCEL_XOUT1/16384;short int ACCEL_YOUT1 = ((MPU_Data[2]<<8)|MPU_Data[3]);data->ACCEL_Y = (double)ACCEL_YOUT1/16384;short int ACCEL_ZOUT1 = ((MPU_Data[4]<<8)|MPU_Data[5]);data->ACCEL_Z = (double)ACCEL_ZOUT1/16384;short int GYRO_XOUT1 = ((MPU_Data[8]<<8)|MPU_Data[9]);data->GYRO_X = (double)GYRO_XOUT1/65.5;short int GYRO_YOUT1 = ((MPU_Data[10]<<8)|MPU_Data[11]);data->GYRO_Y = (double)GYRO_YOUT1/65.5;short int GYRO_ZOUT1 = ((MPU_Data[12]<<8)|MPU_Data[13]);data->GYRO_Z = (double)GYRO_ZOUT1/65.5;
}

數據讀取步驟:

  1. 從寄存器0x3B開始,連續讀取14個字節的數據
  2. 處理溫度數據(雖然在本例中未使用)
  3. 處理加速度數據(前6個字節)
    • X軸加速度:字節0-1
    • Y軸加速度:字節2-3
    • Z軸加速度:字節4-5
    • 除以16384轉換為g單位(±2g量程下)
  4. 處理陀螺儀數據(后6個字節)
    • X軸角速度:字節8-9
    • Y軸角速度:字節10-11
    • Z軸角速度:字節12-13
    • 除以65.5轉換為°/s單位(±500°/s量程下)

I2C配置

I2C配置在i2c.c中實現:

void MX_I2C2_Init(void)
{hi2c2.Instance = I2C2;hi2c2.Init.ClockSpeed = 100000;hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;hi2c2.Init.OwnAddress1 = 0;hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c2.Init.OwnAddress2 = 0;hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;if (HAL_I2C_Init(&hi2c2) != HAL_OK){Error_Handler();}
}

主要配置:

  • 時鐘速度:100kHz
  • 7位地址模式
  • 禁用時鐘拉伸

UART配置與printf重定向

UART配置在usart.c中實現:

void MX_USART2_UART_Init(void)
{huart2.Instance = USART2;huart2.Init.BaudRate = 115200;huart2.Init.WordLength = UART_WORDLENGTH_8B;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = UART_PARITY_NONE;huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart2.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart2) != HAL_OK){Error_Handler();}
}

為了支持printf函數,重定向了fputc函數:

int fputc(int ch, FILE *f)
{if (f == stdout)  // 僅處理標準輸出{HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 100);  // 阻塞發送if (ch == '\n')  // 發送\n時自動補充\rHAL_UART_Transmit(&huart2, (uint8_t *)"\r", 1, 100);}return ch;
}

主程序

主程序在main.c中實現:

int main(void)
{/* 初始化代碼省略 */MX_GPIO_Init();MX_USART2_UART_Init();MX_I2C2_Init();/* USER CODE BEGIN 2 */MPU6050_start();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */printf("System will start while\n");while (1){mpu6050_data data = {0};get_i2c_mpu6050(&data);printf("ax: %.3f--ay: %.3f--az: %.3f--gx: %.3f--gy: %.3f--gz: %.3f\n", data.ACCEL_X, data.ACCEL_Y, data.ACCEL_Z, data.GYRO_X, data.GYRO_Y, data.GYRO_Z);HAL_Delay(200);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

主程序流程:

  1. 初始化GPIO、UART和I2C外設
  2. 初始化MPU6050傳感器
  3. 進入主循環
    • 讀取MPU6050數據
    • 通過UART打印數據
    • 延時200ms

MPU6050寄存器說明

寄存器地址名稱功能
0x6BPWR_MGMT_1電源管理1,用于設備復位、睡眠模式、時鐘源等
0x19SMPLRT_DIV采樣率分頻器
0x1ACONFIG配置寄存器,主要用于配置DLPF(數字低通濾波器)
0x1BGYRO_CONFIG陀螺儀配置,設置量程等
0x1CACCEL_CONFIG加速度計配置,設置量程等
0x3B-0x40ACCEL_XOUT_H至ACCEL_ZOUT_L加速度計輸出數據
0x41-0x42TEMP_OUT_H和TEMP_OUT_L溫度傳感器輸出數據
0x43-0x48GYRO_XOUT_H至GYRO_ZOUT_L陀螺儀輸出數據

注意事項

  1. MPU6050的I2C地址為0x68(二進制:1101000),但在代碼中使用的是0xD1(二進制:11010001)。這是因為HAL庫的I2C函數需要在7位地址后添加讀/寫位(0表示寫,1表示讀)。

  2. 加速度計和陀螺儀的原始數據都是16位有符號整數,需要進行轉換才能得到實際的物理量:

    • 加速度計:在±2g量程下,除以16384得到以g為單位的加速度
    • 陀螺儀:在±500°/s量程下,除以65.5得到以°/s為單位的角速度
  3. 溫度傳感器的數據轉換公式為:溫度(°C) = 36.53 + (原始數據/340)

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

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

相關文章

flex-wrap子元素是否換行

flex-wrap設置子元素是否換行&#xff0c;默認情況下&#xff0c;項目都排在一條線&#xff08;又稱”軸線”&#xff09;上。flex-wrap屬性定義&#xff0c;flex布局中默認是不換行的。1、div的寬度是600px&#xff0c;每個span的寬度是150px&#xff0c;總共有5個&#xff0c…

RabbitMQ面試精講 Day 21:Spring AMQP核心組件詳解

【RabbitMQ面試精講 Day 21】Spring AMQP核心組件詳解 開篇 歡迎來到"RabbitMQ面試精講"系列第21天&#xff01;今天我們將深入探討Spring AMQP的核心組件&#xff0c;這是Java開發者集成RabbitMQ最常用的框架。掌握Spring AMQP不僅能提升開發效率&#xff0c;更是…

Flink TableAPI 按分鐘統計數據量

一、環境版本環境版本Flink1.17.0Kafka2.12MySQL5.7.33二、MySQL建表腳本 create table user_log (id int auto_increment comment 主鍵primary key,uid int not null comment 用戶id,event int not null comment 用戶行為,logtime bigint null comment 日志時…

18.13 《3倍效率提升!Hugging Face datasets.map高級技巧實戰指南》

3倍效率提升!Hugging Face datasets.map高級技巧實戰指南 實戰項目:使用 datasets.map 進行高級數據處理 在大模型訓練過程中,數據預處理的質量直接決定了模型最終的表現。Hugging Face Datasets 庫提供的 datasets.map 方法是處理復雜數據場景的瑞士軍刀,本章將深入解析…

實體店獲客新引擎:數據大集網如何破解傳統門店引流難題

在商業競爭日益激烈的當下&#xff0c;實體店的生存與發展正面臨前所未有的挑戰。無論是街邊的小型便利店&#xff0c;還是大型購物中心的連鎖品牌&#xff0c;都在為"如何吸引顧客進店"而絞盡腦汁。傳統廣告投放效果不佳、線下流量持續萎縮、客戶轉化率難以提升………

LeetCode 分類刷題:2302. 統計得分小于 K 的子數組數目

題目一個數組的 分數 定義為數組之和 乘以 數組的長度。比方說&#xff0c;[1, 2, 3, 4, 5] 的分數為 (1 2 3 4 5) * 5 75 。給你一個正整數數組 nums 和一個整數 k &#xff0c;請你返回 nums 中分數 嚴格小于 k 的 非空整數子數組數目。子數組 是數組中的一個連續元素序…

TDengine IDMP 基本功能(1.界面布局和操作)

UI 布局和操作說明 TDengine IDMP 的用戶界面&#xff08;UI&#xff09;設計旨在提供直觀、易用的操作體驗。下面介紹 UI 的主要區域和典型操作&#xff1a; 主要區域 IDMP 的用戶界面是完全基于瀏覽器的。登錄后的典型 UI 界面具有幾個區域&#xff1a; 主菜單&#xff1a;AI…

QT(概述、基礎函數、界面類、信號和槽)

一、概述1、QTQT是一個c的第三方庫&#xff0c;是專門用來進行界面編程的一個庫 1. QT本身實現了多種軟件&#xff1a; 2. ubuntu系統中所有界面都是QT做的 3. 最新版本的QQ也是QT做的 4. 嵌入式編程中&#xff0c;幾乎所有的上位機&#xff0c;都可以使用QT來做 QT本身除了實現…

【從零開始java學習|第六篇】運算符的使用與注意事項

目錄 一、算術運算符 1. 基本算術運算符&#xff08;二元&#xff09; 2. 自增 / 自減運算符&#xff08;一元&#xff09; 二、類型轉換&#xff08;隱式與強制&#xff09; 1. 隱式轉換&#xff08;自動類型轉換&#xff09; ?編輯 2. 強制轉換&#xff08;顯式類型轉…

shellgpt

一、介紹 官網&#xff1a;https://github.com/TheR1D/shell_gpt ShellGPT&#xff08;shell_gpt&#xff09; 是一款把 GPT 系列大模型能力直接搬到終端 的開源命令行生產力工具。用日常英語或中文描述需求&#xff0c;就能幫你 生成、解釋甚至自動執行 Shell 命令&#xff…

geoserver sql視圖調用Postgis自定義函數問題記錄

一、問題描述&#xff1a;geoserver sql視圖調用Postgis自定義函數對點圖層增加一條記錄時&#xff0c;返回結果主鍵自增ID加了2&#xff0c;但表中數據只增加一條記錄。 但在pgAdmin中直接寫SQL調用Postgis自定義函數對點圖層增加一條記錄時&#xff0c;返回結果主鍵自增ID只加…

#T1224. 最大子矩陣

題目傳送 題目描述 已知矩陣的大小定義為矩陣中所有元素的和。給定一個矩陣&#xff0c;你的任務是找到最大的非空(大小至少是11)子矩陣。 比如&#xff0c;如下44的矩陣 0 -2 -7 09 2 -6 2 -4 1 -4 1-1 8 0 -2的最大子矩陣是 9 2-4 1-1 8這…

2025年大模型安全崗的面試匯總(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 1. Transformer核心機制及其對LLM突破的基石作用 2. LLM能力邊界評估框架設計 3. 模型層級安全風險分析 …

《關于省級政務云服務費支出預算標準的規定》豫財預〔2024〕106號解讀

《關于省級政務云服務費支出預算標準的規定》豫財預〔2024〕106號文件由河南省財政廳編制經省政府同意后于2024年12月3日印發執行&#xff0c;規定作為省級政務云服務費支出預算編制和審核的依據&#xff0c;旨在加強省級部門預算管理&#xff0c;規范政務云服務費支出預算編制…

使用HalconDotNet實現異步多相機采集與實時處理

文章目錄 一、核心功能與原理 功能目標: 工作原理: 關鍵機制: 二、完整C#實現代碼 三、關鍵實現解析 1. 零拷貝圖像傳輸 2. 動態幀率控制 3. HALCON并行優化 4. 異常隔離機制 四、高級優化策略 1. 硬件加速配置 2. 內存池管理 3. 實時性保障 一、核心功能與原理 功能目標:…

《瘋狂Java講義(第3版)》學習筆記ch4

ch4流程控制與數組1.switch語句后的expression表達式的數據類型只能是byte、short、char、int四種證書類型。2.建議不要在循環體內修改循環變量&#xff08;也叫循環計數器&#xff09;的值&#xff0c;否則會增加程序出錯的可能性。3.定義數組推薦語法格式&#xff1a;type[] …

COLMAP進行密集重建,三維重建的步驟

密集重建是在稀疏重建的基礎上進行的 稀疏重建見&#xff1a;用 COLMAP GUI 在 Windows 下一步步完成 相機位姿估計&#xff08;SfM&#xff09; 和 稀疏點云重建的詳細步驟&#xff1a;_colmap database導入圖片位姿-CSDN博客 完成稀疏重建后直接進入以下步驟進行密集重建&am…

基于飛算JavaAI實現Reactor模式服務器的深度實踐

一、飛算JavaAI技術概述 1.1 飛算JavaAI平臺簡介飛算JavaAI是飛算科技推出的智能化Java開發平臺&#xff0c;通過AI技術賦能傳統軟件開發流程&#xff0c;為開發者提供從需求分析到代碼實現的全流程智能化解決方案。該平臺深度融合了人工智能技術與軟件開發實踐&#xff0c;具備…

量子人工智能

量子人工智能&#xff08;QAI&#xff09;是量子計算與人工智能的強大融合。這一領域旨在將量子系統獨特的計算能力與人工智能的模式識別和學習能力相結合&#xff0c;以更快、更高效地解決問題。 量子人工智能與常規人工智能的區別是什么&#xff1f;常規人工智能在經典計算機…

算法題Day1

1. 練習1&#xff1a;Hello,World!解題步驟:using namespace std; int main() {cout<<"Hello,World!"<<endl;return 0; }2. 練習2&#xff1a;打印飛機解題步驟:#include <iostream> using namespace std; int main() {cout << " …