[应用相关] STM32之MPU6050获取欧拉角

[复制链接]
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:08 | 显示全部楼层
FIFO使能寄存器 22841658d2cfe1d28e.png 控制mpu6050的加速度计、温度传感器、陀螺仪的原始数据是否写入FIFO缓冲区。

TEMP_FIFO_EN 位用于控制是否将温度传感器的原始数据写入FIFO缓冲区,设置为 1,写入FIFO缓冲区。
XG_ FIFO_EN 位用于控制是否将陀螺仪X轴的原始数据写入FIFO缓冲区,设置为 1,写入FIFO缓冲区。
YG_ FIFO_EN 位用于控制是否将陀螺仪Y轴的原始数据写入FIFO缓冲区,设置为 1,写入FIFO缓冲区。
ZG_ FIFO_EN 位用于控制是否将陀螺仪Z轴的原始数据写入FIFO缓冲区,设置为 1,写入FIFO缓冲区。
ACCEL_ FIFO_EN 位用于控制是否将加速度计的原始数据写入FIFO缓冲区,设置为 1,写入FIFO缓冲区。
其他位不用管,设置为0。
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:08 | 显示全部楼层
我是谁寄存器
38488658d2d119cc04.png
存储 mpu6050 的7位I2C地址的高6位,用来验证设备的身份。

该寄存器的默认值为0x68(即 b0 110100 0)。
mpu6050 的 Slave 地址为 b110100X,7 位字长,最低有效位 X 由 AD0 引脚上的逻辑电平决定,高电平为1,低电平为0。
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:09 | 显示全部楼层
MPU6050通信协议
当连接到系统芯片时,mpu6050 总是作为从设备,因此,系统芯片可以通过 400kHz 的 I2C 接口来操作 mpu6050 的内部寄存器。mpu6050 的 Slave 地址为 b110100X,7 位字长,最低有效位 X 由 AD0 引脚上的逻辑电平决定,高电平为1,低电平为0(即高电平时 mpu6050 从机地址为0x69,低电平时 mpu6050 从机地址为0x68)。
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:09 | 显示全部楼层
MPU6050写入寄存器时序
单字节写入时序:

90980658d2d38da8fd.png
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:09 | 显示全部楼层
多字节写入时序: 22381658d2d48a239f.png
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:09 | 显示全部楼层
①:主设备发送起始信号。
②:主设备发送7位mpu6050的I2C设备地址以及一个W 位,即0 。
③:主设备等待从设备(mpu6050)发送应答信号。
④:主设备发送想要写入寄存器的地址。
⑤:主设备等待从设备(mpu6050)发送应答信号。
⑥:主设备发送想要写入寄存器的数据。
⑦:主设备等待从设备(mpu6050)发送应答信号。
⑧:主设备发送终止信号。
如果想连续写入寄存器数据则在主设备发送终止信号前重复⑥、⑦步骤即可。
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:10 | 显示全部楼层
MPU6050寄存器读取时序
单字节读取时序: 39542658d2d5be449c.png
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:10 | 显示全部楼层
多字节读取时序:
80757658d2d66a008d.png ①:主设备发送起始信号。
②:主设备发送7位mpu6050的I2C设备地址以及一个W 位,即0 。
③:主设备等待从设备(mpu6050)发送应答信号。
④:主设备发送想要写入寄存器的地址。
⑤:主设备等待从设备(mpu6050)发送应答信号。
⑥:主设备发送起始信号。
⑦:主设备发送7位mpu6050的I2C设备地址以及一个R 位,即1 。
⑧:主设备等待从设备(mpu6050)发送应答信号。
⑨:主设备读取想要读取寄存器的数据。
⑩:主设备发送应答信号(可选,多字节读取时序时使用)。
⑪:主设备读取想要读取寄存器的数据(可选,多字节读取时序时使用)。
⑫:主设备发送非应答信号。
⑬:主设备发送终止信号。
如果想连续读取寄存器数据则在主设备发送非应答信号和终止信号前重复⑩、⑪步骤即可。
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:10 | 显示全部楼层
MPU6050获取三轴加速度、三轴陀螺仪以及温度
MPU6050与STM32板子接线
PB6 <-> SCL
PB7 <-> SDA
单片机5V <-> VCC
GND <-> GND
AD0 <-> GND
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:10 | 显示全部楼层
STM32CubeMX相关配置
配置SYS
38492658d2d80bdc95.png
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:11 | 显示全部楼层
配置RCC 91519658d2d8e05494.png 51523658d2d938e117.png
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:11 | 显示全部楼层
配置USART3 16383658d2d9f61651.png
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:11 | 显示全部楼层
配置NVIC 15993658d2dab0e461.png
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:11 | 显示全部楼层
使用Micro库
只要映射了printf用来发送数据去串口都要使用这个库。 51898658d2db73ebde.png
 楼主| 发顺丰更大nc 发表于 2023-12-28 16:11 | 显示全部楼层
文件编写
修改文件usart.c
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * [url=home.php?mod=space&uid=288409]@file[/url]    usart.c
  5.   * [url=home.php?mod=space&uid=247401]@brief[/url]   This file provides code for the configuration
  6.   *          of the USART instances.
  7.   ******************************************************************************
  8.   * @attention
  9.   *
  10.   * Copyright (c) 2023 STMicroelectronics.
  11.   * All rights reserved.
  12.   *
  13.   * This software is licensed under terms that can be found in the LICENSE file
  14.   * in the root directory of this software component.
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.
  16.   *
  17.   ******************************************************************************
  18.   */
  19. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "usart.h"

  22. /* USER CODE BEGIN 0 */

  23. #include <stdio.h>
  24. #include <string.h>

  25. #define USART_REC_LEN 200

  26. // 串口接收缓存(1字节)
  27. uint8_t buf = 0;

  28. uint8_t UART1_RX_Buffer[USART_REC_LEN]; // 接收缓冲,串口接收的数据存放地点

  29. // 串口接收状态,16位
  30. uint16_t UART1_RX_STA = 0;
  31. // bit15: 如果是1表示接收完成
  32. // bit14: 如果是1表示接收到回车(0x0d)
  33. // bit13~bit0: 接收到的有效字节数目


  34. /* USER CODE END 0 */

  35. UART_HandleTypeDef huart3;

  36. /* USART3 init function */

  37. void MX_USART3_UART_Init(void)
  38. {

  39.   /* USER CODE BEGIN USART3_Init 0 */

  40.   /* USER CODE END USART3_Init 0 */

  41.   /* USER CODE BEGIN USART3_Init 1 */

  42.   /* USER CODE END USART3_Init 1 */
  43.   huart3.Instance = USART3;
  44.   huart3.Init.BaudRate = 115200;
  45.   huart3.Init.WordLength = UART_WORDLENGTH_8B;
  46.   huart3.Init.StopBits = UART_STOPBITS_1;
  47.   huart3.Init.Parity = UART_PARITY_NONE;
  48.   huart3.Init.Mode = UART_MODE_TX_RX;
  49.   huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  50.   huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  51.   if (HAL_UART_Init(&huart3) != HAL_OK)
  52.   {
  53.     Error_Handler();
  54.   }
  55.   /* USER CODE BEGIN USART3_Init 2 */

  56.         /* 开启串口1的接收中断 */
  57.   HAL_UART_Receive_IT(&huart3, &buf, 1); /* 每接收一个串口数据调用一次串口接收完成回调函数 */
  58.         printf("usart3 is ok\r\n");
  59.        
  60.   /* USER CODE END USART3_Init 2 */

  61. }

  62. void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
  63. {

  64.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  65.   if(uartHandle->Instance==USART3)
  66.   {
  67.   /* USER CODE BEGIN USART3_MspInit 0 */

  68.   /* USER CODE END USART3_MspInit 0 */
  69.     /* USART3 clock enable */
  70.     __HAL_RCC_USART3_CLK_ENABLE();

  71.     __HAL_RCC_GPIOB_CLK_ENABLE();
  72.     /**USART3 GPIO Configuration
  73.     PB10     ------> USART3_TX
  74.     PB11     ------> USART3_RX
  75.     */
  76.     GPIO_InitStruct.Pin = GPIO_PIN_10;
  77.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  78.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  79.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  80.     GPIO_InitStruct.Pin = GPIO_PIN_11;
  81.     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  82.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  83.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  84.     /* USART3 interrupt Init */
  85.     HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
  86.     HAL_NVIC_EnableIRQ(USART3_IRQn);
  87.   /* USER CODE BEGIN USART3_MspInit 1 */

  88.   /* USER CODE END USART3_MspInit 1 */
  89.   }
  90. }

  91. void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
  92. {

  93.   if(uartHandle->Instance==USART3)
  94.   {
  95.   /* USER CODE BEGIN USART3_MspDeInit 0 */

  96.   /* USER CODE END USART3_MspDeInit 0 */
  97.     /* Peripheral clock disable */
  98.     __HAL_RCC_USART3_CLK_DISABLE();

  99.     /**USART3 GPIO Configuration
  100.     PB10     ------> USART3_TX
  101.     PB11     ------> USART3_RX
  102.     */
  103.     HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11);

  104.     /* USART3 interrupt Deinit */
  105.     HAL_NVIC_DisableIRQ(USART3_IRQn);
  106.   /* USER CODE BEGIN USART3_MspDeInit 1 */

  107.   /* USER CODE END USART3_MspDeInit 1 */
  108.   }
  109. }

  110. /* USER CODE BEGIN 1 */

  111. /* 重写stdio.h文件中的prinft()里的fputc()函数 */
  112. int fputc(int my_data, FILE *p)
  113. {
  114.     unsigned char temp = my_data;
  115.     // 改写后,使用printf()函数会将数据通过串口一发送出去
  116.     HAL_UART_Transmit(&huart3, &temp, 1, 0xffff); // 0xfffff为最大超时时间
  117.     return my_data;
  118. }

  119. /* 串口接收完成回调函数 */
  120. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  121. {
  122.     // 判断中断是哪个串口触发的
  123.     if (huart->Instance == USART1)
  124.     {

  125.         // 判断接收是否完成,即判断UART1_RX_STA的bit15是否为1
  126.         if (!(UART1_RX_STA & 0x8000))
  127.         { // 如果没接收完成就进入接收流程

  128.             // 判断是否接收到回车0x0d
  129.             if (UART1_RX_STA & 0x4000)
  130.             {

  131.                 // 判断是否接收到换行0x0a
  132.                 if (buf == 0x0a)
  133.                 {

  134.                     // 如果回车和换行都接收到了,则表示接收完成,即把bit15拉高
  135.                     UART1_RX_STA |= 0x8000;
  136.                 }
  137.                 else
  138.                 { // 如果接收到回车0x0d没有接收到换行0x0a

  139.                     // 则认为接收错误,重新开始接收
  140.                     UART1_RX_STA = 0;
  141.                 }
  142.             }
  143.             else
  144.             { // 如果没有接收到回车0x0d

  145.                 // 则判断收到的这个字符是否是回车0x0d
  146.                 if (buf == 0x0d)
  147.                 {

  148.                     // 如果这个字符是回车,则将将bit14拉高,表示接收到回车
  149.                     UART1_RX_STA |= 0x4000;
  150.                 }
  151.                 else
  152.                 { // 如果不是回车

  153.                     // 则将这个字符存放到缓存数组中
  154.                     UART1_RX_Buffer[UART1_RX_STA & 0x3ffff] = buf;
  155.                     UART1_RX_STA++;

  156.                     // 如果接收数据大于UART1_REC_LEN(200字节),则重新开始接收
  157.                     if (UART1_RX_STA > USART_REC_LEN - 1)
  158.                     {
  159.                         UART1_RX_STA = 0;
  160.                     }
  161.                 }
  162.             }
  163.         }
  164.         // 如果接收完成则重新开启串口1的接收中断
  165.         HAL_UART_Receive_IT(&huart3, &buf, 1);
  166.     }
  167. }

  168. /* 对串口接收数据的处理 */
  169. void usart1_receive_data_handle()
  170. {
  171.     /* 判断判断串口是否接收完成 */
  172.     if (UART1_RX_STA & 0x8000)
  173.     {
  174.         printf("接收完成\r\n");

  175.         // 串口接收完数据后,对串口数据进行处理
  176.         if (!strcmp((const char *)UART1_RX_Buffer, "haozige"))
  177.         {
  178.             printf("浩子哥\r\n");
  179.         }

  180.         // 接收到其他数据,进行报错
  181.         else
  182.         {
  183.                                                 printf("%s\r\n", "输入错误,请重新输入");
  184.         }

  185.         // 换行,重新开始下一次接收
  186.         memset(UART1_RX_Buffer, 0, USART_REC_LEN);
  187.         UART1_RX_STA = 0;
  188.     }
  189. }

  190. /* USER CODE END 1 */

 楼主| 发顺丰更大nc 发表于 2023-12-28 16:12 | 显示全部楼层
修改文件usart.h

  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * @file    usart.h
  5.   * @brief   This file contains all the function prototypes for
  6.   *          the usart.c file
  7.   ******************************************************************************
  8.   * @attention
  9.   *
  10.   * Copyright (c) 2023 STMicroelectronics.
  11.   * All rights reserved.
  12.   *
  13.   * This software is licensed under terms that can be found in the LICENSE file
  14.   * in the root directory of this software component.
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.
  16.   *
  17.   ******************************************************************************
  18.   */
  19. /* USER CODE END Header */
  20. /* Define to prevent recursive inclusion -------------------------------------*/
  21. #ifndef __USART_H__
  22. #define __USART_H__

  23. #ifdef __cplusplus
  24. extern "C" {
  25. #endif

  26. /* Includes ------------------------------------------------------------------*/
  27. #include "main.h"

  28. /* USER CODE BEGIN Includes */

  29. /* USER CODE END Includes */

  30. extern UART_HandleTypeDef huart3;

  31. /* USER CODE BEGIN Private defines */

  32. /* USER CODE END Private defines */

  33. void MX_USART3_UART_Init(void);

  34. /* USER CODE BEGIN Prototypes */

  35. void usart1_receive_data_handle(void);

  36. /* USER CODE END Prototypes */

  37. #ifdef __cplusplus
  38. }
  39. #endif

  40. #endif /* __USART_H__ */


 楼主| 发顺丰更大nc 发表于 2023-12-28 16:12 | 显示全部楼层
添加文件mpu6050.c

  1. #include "my_i2c.h"
  2. #include "mpu6050.h"
  3. #include "usart.h"
  4. #include <stdio.h>

  5. uint8_t mpu6050_init()
  6. {
  7.         uint8_t id,data;
  8.        
  9.         IIC_gpio_init();
  10.        
  11.         mpu6050_read_len(MPU6050_ADDR,MPU_DEVICE_ID_REG,1,&id);

  12.         if(id == 0x68){

  13.                 mpu6050_reset();  /* mpu6050软件复位  0x6B */
  14.                
  15.                 mpu6050_set_rate(100);  /* 设置陀螺仪采样频率为100Hz  0x19 */
  16.                
  17.                 mpu6050_set_accelerated_speed(0);  /* 设置加速度量程范围:±2g  0x1C */
  18.                
  19.                 mpu6050_set_gyroscope(3);  /* 设置陀螺仪量程范围:±2000dps  0x1B */
  20.                
  21.                 /* 关闭所有中断 */
  22.                 data = 0;
  23.                 mpu6050_write_len(MPU6050_ADDR,MPU_INT_EN_REG,1,&data);
  24.                
  25.                 /* 关闭IIC主模式 */
  26.                 data = 0;
  27.                 mpu6050_write_len(MPU6050_ADDR,MPU_USER_CTRL_REG,1,&data);
  28.                
  29.           /* 关闭FIFO */
  30.                 data = 0;
  31.                 mpu6050_write_len(MPU6050_ADDR,MPU_FIFO_EN_REG,1,&data);
  32.                
  33.           /* 设置CLKSEL,PLL X轴为参考 */
  34.                 data = 0x01;
  35.                 mpu6050_write_len(MPU6050_ADDR,MPU_PWR_MGMT1_REG,1,&data);
  36.                
  37.           /* 加速度与陀螺仪都工作 */
  38.                 data = 0;
  39.                 mpu6050_write_len(MPU6050_ADDR,MPU_PWR_MGMT2_REG,1,&data);
  40.                
  41.                 return 0;
  42.                
  43.         }
  44.        
  45.         return 1;
  46. }

  47. /* mpu6050软件复位 */
  48. void mpu6050_reset()
  49. {
  50.         uint8_t data;
  51.         data = 0x80;
  52.         mpu6050_write_len(MPU6050_ADDR,MPU_PWR_MGMT1_REG,1,&data);  // 复位mpu6050
  53.        
  54.         HAL_Delay(100);
  55.        
  56.         data = 0x00;
  57.           // 唤醒mpu6050
  58. }

  59. /* 设置数字低通滤波器频率(陀螺仪输出频率) */
  60. void mpu6050_set_lpf(uint16_t lpf)
  61. {
  62.         // 该函数设置陀螺仪输出频率为1000Hz
  63.         uint8_t data;
  64.         mpu6050_write_len(MPU6050_ADDR,MPU_CFG_REG,1,&data);
  65. }       


  66. /* 设置陀螺仪采样频率:4~1000Hz */
  67. void mpu6050_set_rate(uint16_t rata)
  68. {
  69.         // 陀螺仪采样率rate = 陀螺仪输出频率(1000Hz或8000Hz,mpu6050_set_lpf函数设定为1000Hz) / (SMPLPT_DIV + 1)(采样周期)
  70.         uint8_t data;
  71.         if(rata >= 1000) rata = 1000;
  72.         if(rata <= 4) rata = 4;
  73.        
  74.         data = 1000/rata - 1;
  75.         mpu6050_write_len(MPU6050_ADDR,MPU_SAMPLE_RATE_REG,1,&data);
  76.        
  77.         mpu6050_set_lpf(rata / 2); // 自动设置低通滤波频率为采样率的一半
  78.        
  79. }

  80. /*
  81. 设置加速度量程范围:
  82.         data:
  83.                 0 --> ±2g
  84.                 1 --> ±4g
  85.                 2 --> ±8g
  86.                 3 --> ±16g
  87. */
  88. void mpu6050_set_accelerated_speed(uint8_t data)
  89. {
  90.         data <<= 3;
  91.         mpu6050_write_len(MPU6050_ADDR,MPU_ACCEL_CFG_REG,1,&data);
  92. }

  93. /*
  94. 设置陀螺仪量程范围:
  95.         fsr:
  96.                 0 --> ±250dps
  97.                 1 --> ±500dps
  98.                 2 --> ±1000dps
  99.                 3 --> ±2000dps
  100. */
  101. void mpu6050_set_gyroscope(uint8_t data)
  102. {
  103.         data <<= 3;
  104.         mpu6050_write_len(MPU6050_ADDR,MPU_GYRO_CFG_REG,1,&data);
  105. }

  106. /* 获取mpu6050的原始数据 */
  107. void mpu6050_read_accelerated_speed(int16_t *accelerated_speed_x,int16_t *accelerated_speed_y,int16_t *accelerated_speed_z)
  108. {
  109.         uint8_t rev_buf[6];
  110.        
  111.         mpu6050_read_len(MPU6050_ADDR,MPU_ACCEL_XOUTH_REG,6,rev_buf);  //读取x,y,z三轴的加速度值
  112.        
  113.         *accelerated_speed_x = (int16_t)(rev_buf[0] << 8 | rev_buf[1]);
  114.         *accelerated_speed_y = (int16_t)(rev_buf[2] << 8 | rev_buf[3]);
  115.         *accelerated_speed_z = (int16_t)(rev_buf[4] << 8 | rev_buf[5]);
  116. }

  117. void mpu6050_read_gyroscope(int16_t *gyroscope_x,int16_t *gyroscope_y,int16_t *gyroscope_z)
  118. {
  119.         uint8_t rev_buf[6];
  120.          
  121.         mpu6050_read_len(MPU6050_ADDR,MPU_GYRO_XOUTH_REG,6,rev_buf);  //读取x,y,z三轴的陀螺仪值
  122.        
  123.         *gyroscope_x = (int16_t)(rev_buf[0] << 8 | rev_buf[1]);
  124.         *gyroscope_y = (int16_t)(rev_buf[2] << 8 | rev_buf[3]);
  125.         *gyroscope_z = (int16_t)(rev_buf[4] << 8 | rev_buf[5]);
  126. }

  127. float mpu6050_read_temperature()
  128. {
  129.         uint8_t rev_buf[2];
  130.         int16_t *temperature;
  131.        
  132.         mpu6050_read_len(MPU6050_ADDR,MPU_TEMP_OUTH_REG,2,rev_buf);
  133.        
  134.         *temperature = (int16_t)(rev_buf[0] << 8 | rev_buf[1]);
  135.         return 36.53 + *temperature / 340;
  136. }


  137. /* 下面两个函数用来代替dmp库中内容 */
  138. uint8_t mpu6050_write_len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf)
  139. {
  140.           uint8_t i;
  141.    
  142.     IIC_start();
  143.     IIC_send_byte((addr | 0));
  144.     if (IIC_wait_ack() == 1)
  145.     {
  146.         IIC_stop();
  147.         return 1;
  148.     }
  149.     IIC_send_byte(reg);
  150.     if (IIC_wait_ack() == 1)
  151.     {
  152.         IIC_stop();
  153.         return 1;
  154.     }
  155.     for (i=0; i<len; i++)
  156.     {
  157.         IIC_send_byte(buf[i]);
  158.         if (IIC_wait_ack() == 1)
  159.         {
  160.             IIC_stop();
  161.             return 1;
  162.         }
  163.     }
  164.     IIC_stop();
  165.     return 0;
  166. }

  167. uint8_t mpu6050_read_len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf)
  168. {
  169.           IIC_start();
  170.     IIC_send_byte(addr | 0);
  171.     if (IIC_wait_ack() == 1)
  172.     {
  173.         IIC_stop();
  174.         return 1;
  175.     }
  176.     IIC_send_byte(reg);
  177.     if (IIC_wait_ack() == 1)
  178.     {
  179.         IIC_stop();
  180.         return 1;
  181.     }
  182.     IIC_start();
  183.     IIC_send_byte(addr | 1);
  184.     if (IIC_wait_ack() == 1)
  185.     {
  186.         IIC_stop();
  187.         return 1;
  188.     }
  189.     while (len)
  190.     {
  191.         *buf = IIC_read_byte((len > 1) ? 1 : 0);
  192.         len--;
  193.         buf++;
  194.     }
  195.     IIC_stop();
  196.     return 0;
  197. }

 楼主| 发顺丰更大nc 发表于 2023-12-28 16:12 | 显示全部楼层
添加文件mpu6050.h
  1. #include "main.h"

  2. #define  MPU6050_ADDR  0xD0  //mou6050APD0引脚接地,因此它的I2C地址为0xD0,即0x68 << 2

  3. #define  MPU_DEVICE_ID_REG     0X75         // 器件ID寄存器

  4. #define  MPU_CFG_REG           0X1A  // 配置寄存器
  5. #define  MPU_SAMPLE_RATE_REG   0X19  // 陀螺仪采样率分频寄存器
  6. #define  MPU_GYRO_CFG_REG      0X1B         // 陀螺仪传感器配置寄存器
  7. #define  MPU_ACCEL_CFG_REG     0X1C         // 加速度传感器配置寄存器


  8. #define  MPU_ACCEL_XOUTH_REG   0X3B  // 加速度值,X轴高8位寄存器
  9. #define  MPU_ACCEL_XOUTL_REG   0X3C  // 加速度值,X轴低8位寄存器
  10. #define  MPU_ACCEL_YOUTH_REG   0X3D  // 加速度值,Y轴高8位寄存器
  11. #define  MPU_ACCEL_YOUTL_REG   0X3E  // 加速度值,Y轴低8位寄存器
  12. #define  MPU_ACCEL_ZOUTH_REG   0X3F  // 加速度值,Z轴高8位寄存器
  13. #define  MPU_ACCEL_ZOUTL_REG   0X40  // 加速度值,Z轴低8位寄存器


  14. #define  MPU_TEMP_OUTH_REG     0X41         // 温度值高8位寄存器
  15. #define  MPU_TEMP_OUTL_REG     0X42  // 温度值低8位寄存器


  16. #define  MPU_GYRO_XOUTH_REG    0X43         // 陀螺仪值,X轴高8位寄存器
  17. #define  MPU_GYRO_XOUTL_REG    0X44         // 陀螺仪值,X轴低8位寄存器
  18. #define  MPU_GYRO_YOUTH_REG    0X45         // 陀螺仪值,Y轴高8位寄存器
  19. #define  MPU_GYRO_YOUTL_REG    0X46         // 陀螺仪值,Y轴低8位寄存器
  20. #define  MPU_GYRO_ZOUTH_REG    0X47         // 陀螺仪值,Z轴高8位寄存器
  21. #define  MPU_GYRO_ZOUTL_REG    0X48         // 陀螺仪值,Z轴低8位寄存器


  22. #define  MPU_USER_CTRL_REG     0X6A         // 用户控制寄存器
  23. #define  MPU_PWR_MGMT1_REG     0X6B         // 电源管理寄存器1
  24. #define  MPU_PWR_MGMT2_REG     0X6C         // 电源管理寄存器2


  25. #define  MPU_INTBP_CFG_REG     0X37  // 中断/旁路设置寄存器
  26. #define  MPU_INT_EN_REG        0X38  // 中断使能寄存器
  27. #define  MPU_INT_STA_REG       0X3A  // 中断状态寄存器


  28. #define  MPU_FIFO_EN_REG       0X23         // FIFO使能寄存器
  29. #define  MPU_FIFO_CNTH_REG     0X72         // FIFO计数寄存器高八位
  30. #define  MPU_FIFO_CNTL_REG     0X73         // FIFO计数寄存器低八位
  31. #define  MPU_FIFO_RW_REG       0X74         // FIFO读写寄存器

  32. void mpu6050_reset(void);
  33. uint8_t mpu6050_init(void);
  34. void mpu6050_set_lpf(uint16_t lpf);
  35. void mpu6050_set_rate(uint16_t rata);
  36. void mpu6050_set_accelerated_speed(uint8_t data);
  37. void mpu6050_set_gyroscope(uint8_t data);

  38. void mpu6050_read_accelerated_speed(int16_t *accelerated_speed_x,int16_t *accelerated_speed_y,int16_t *accelerated_speed_z);

  39. void mpu6050_read_gyroscope(int16_t *gyroscope_x,int16_t *gyroscope_y,int16_t *gyroscope_z);

  40. float mpu6050_read_temperature(void);


  41. uint8_t mpu6050_write_len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf);
  42. uint8_t mpu6050_read_len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf);

 楼主| 发顺丰更大nc 发表于 2023-12-28 16:12 | 显示全部楼层
添加文件mpu6050.h
#include "main.h"

#define  MPU6050_ADDR  0xD0  //mou6050APD0引脚接地,因此它的I2C地址为0xD0,即0x68 << 2

#define  MPU_DEVICE_ID_REG     0X75         // 器件ID寄存器

#define  MPU_CFG_REG           0X1A  // 配置寄存器
#define  MPU_SAMPLE_RATE_REG   0X19  // 陀螺仪采样率分频寄存器
#define  MPU_GYRO_CFG_REG      0X1B         // 陀螺仪传感器配置寄存器
#define  MPU_ACCEL_CFG_REG     0X1C         // 加速度传感器配置寄存器


#define  MPU_ACCEL_XOUTH_REG   0X3B  // 加速度值,X轴高8位寄存器
#define  MPU_ACCEL_XOUTL_REG   0X3C  // 加速度值,X轴低8位寄存器
#define  MPU_ACCEL_YOUTH_REG   0X3D  // 加速度值,Y轴高8位寄存器
#define  MPU_ACCEL_YOUTL_REG   0X3E  // 加速度值,Y轴低8位寄存器
#define  MPU_ACCEL_ZOUTH_REG   0X3F  // 加速度值,Z轴高8位寄存器
#define  MPU_ACCEL_ZOUTL_REG   0X40  // 加速度值,Z轴低8位寄存器


#define  MPU_TEMP_OUTH_REG     0X41         // 温度值高8位寄存器
#define  MPU_TEMP_OUTL_REG     0X42  // 温度值低8位寄存器


#define  MPU_GYRO_XOUTH_REG    0X43         // 陀螺仪值,X轴高8位寄存器
#define  MPU_GYRO_XOUTL_REG    0X44         // 陀螺仪值,X轴低8位寄存器
#define  MPU_GYRO_YOUTH_REG    0X45         // 陀螺仪值,Y轴高8位寄存器
#define  MPU_GYRO_YOUTL_REG    0X46         // 陀螺仪值,Y轴低8位寄存器
#define  MPU_GYRO_ZOUTH_REG    0X47         // 陀螺仪值,Z轴高8位寄存器
#define  MPU_GYRO_ZOUTL_REG    0X48         // 陀螺仪值,Z轴低8位寄存器


#define  MPU_USER_CTRL_REG     0X6A         // 用户控制寄存器
#define  MPU_PWR_MGMT1_REG     0X6B         // 电源管理寄存器1
#define  MPU_PWR_MGMT2_REG     0X6C         // 电源管理寄存器2


#define  MPU_INTBP_CFG_REG     0X37  // 中断/旁路设置寄存器
#define  MPU_INT_EN_REG        0X38  // 中断使能寄存器
#define  MPU_INT_STA_REG       0X3A  // 中断状态寄存器


#define  MPU_FIFO_EN_REG       0X23         // FIFO使能寄存器
#define  MPU_FIFO_CNTH_REG     0X72         // FIFO计数寄存器高八位
#define  MPU_FIFO_CNTL_REG     0X73         // FIFO计数寄存器低八位
#define  MPU_FIFO_RW_REG       0X74         // FIFO读写寄存器

void mpu6050_reset(void);
uint8_t mpu6050_init(void);
void mpu6050_set_lpf(uint16_t lpf);
void mpu6050_set_rate(uint16_t rata);
void mpu6050_set_accelerated_speed(uint8_t data);
void mpu6050_set_gyroscope(uint8_t data);

void mpu6050_read_accelerated_speed(int16_t *accelerated_speed_x,int16_t *accelerated_speed_y,int16_t *accelerated_speed_z);

void mpu6050_read_gyroscope(int16_t *gyroscope_x,int16_t *gyroscope_y,int16_t *gyroscope_z);

float mpu6050_read_temperature(void);


uint8_t mpu6050_write_len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf);
uint8_t mpu6050_read_len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf);

 楼主| 发顺丰更大nc 发表于 2023-12-28 16:13 | 显示全部楼层
添加文件delay.c
#include "main.h"
#include "delay.h"

void delay_us(uint32_t n)
{
        uint8_t j;
        while(n--)
        for(j=0;j<10;j++);
}
void delay_ms(uint32_t n)
{
        while(n--)
        delay_us(1000);
}
void get_ms(unsigned long *time)
{

}

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部