找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2838|回复: 0
打印 上一主题 下一主题
收起左侧

基于STM32H750 HAL库的MPU6050陀螺仪驱动+串口输出数据

[复制链接]
跳转到指定楼层
楼主
ID:629021 发表于 2020-8-7 16:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
结合网上的程序写了自己的程序。一开始参考了这里:https://blog.csdn.net/Jodan132/a ... -baidujs-1.nonecase
后来发现那个代码有两个坑:一个是IIC地址不对劲,一般来说如果A0是低电平的话应该是0xd0和0xd1(读写地址)。还有一个比较无语的坑就是:陀螺仪输出数据寄存器的低八位和高八位放反了。一开始这一段我根本没仔细看,结果输出的数据非常不稳定,数值也很诡异。。。。。。
修改好之后加上了数据转换,加速度单位是g,角速度单位是°/s。

单片机main函数所在文件如下:
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * @file           : main.c
  5.   * @brief          : Main program body
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * <h2><center>© Copyright (c) 2020 STMicroelectronics.
  10.   * All rights reserved.</center></h2>
  11.   *
  12.   * This software component is licensed by ST under BSD 3-Clause license,
  13.   * the "License"; You may not use this file except in compliance with the
  14.   * License. You may obtain a copy of the License at:
  15.   *                        opensource.org/licenses/BSD-3-Clause
  16.   *
  17.   ******************************************************************************
  18.   */
  19. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "main.h"
  22. #include "i2c.h"
  23. #include "usart.h"
  24. #include "gpio.h"
  25. /* Private includes ----------------------------------------------------------*/
  26. /* USER CODE BEGIN Includes */
  27. /* USER CODE END Includes */
  28. /* Private typedef -----------------------------------------------------------*/
  29. /* USER CODE BEGIN PTD */

  30. /* USER CODE END PTD */
  31. /* Private define ------------------------------------------------------------*/
  32. /* USER CODE BEGIN PD */
  33. #define ADDRESS_Write  0Xd0
  34. #define ADDRESS_Read   0Xd1

  35. #define PWR_MGMT_1     0x6B    //电源管理,0X00唤醒MPU6050
  36. #define SMPLRT_DIV     0X19    //陀螺仪采样率
  37. #define CONFIG         0X1A    //低通滤波
  38. #define GYRO_CONFIG    0X1B    //陀螺仪自检及测量
  39. #define ACCEL_CONFIG   0X1C    //加速度自检,测量范围及高通滤波频率
  40. #define TEMP_OUT_H     0X41
  41. #define TEMP_OUT_L     0X42

  42. #define ACCEL_XOUT_H   0X3B
  43. #define ACCEL_XOUT_L   0X3C
  44. #define ACCEL_YOUT_H   0X3D
  45. #define ACCEL_YOUT_L   0X3E
  46. #define ACCEL_ZOUT_H   0X3F
  47. #define ACCEL_ZOUT_L   0X40
  48. #define GYRO_XOUT_H    0X43
  49. #define GYRO_XOUT_L    0X44
  50. #define GYRO_YOUT_H    0X45
  51. #define GYRO_YOUT_L    0X46
  52. #define GYRO_ZOUT_H    0X47
  53. #define GYRO_ZOUT_L   0X48
  54. #define MPU6050_ADRESS_ADO_LOW        0X68 // adress pin low
  55. #define MPU6050_ADRESS_ADO_HIGH       0X69//  adress pin high
  56. int x=0,y=0,z=0,wx=0,wy=0,wz=0,t=0;
  57. unsigned char flag=0;
  58. unsigned long XB=0,YB=0,ZB=0,i,j;
  59. unsigned char display[5];
  60. /* USER CODE END PD */
  61. /* Private macro -------------------------------------------------------------*/
  62. /* USER CODE BEGIN PM */
  63. void InitMPU6050(void)
  64. {
  65. uint8_t temp;
  66. temp = 0x00;
  67. HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, PWR_MGMT_1, I2C_MEMADD_SIZE_8BIT, &temp, 1, 0x10);
  68. temp = 0x07;
  69.     HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, SMPLRT_DIV, I2C_MEMADD_SIZE_8BIT, &temp, 1, 0x10);
  70. temp = 0x06;
  71.     HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, CONFIG, I2C_MEMADD_SIZE_8BIT, &temp, 1, 0x10);
  72. temp = 0x00;
  73.     HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, GYRO_CONFIG, I2C_MEMADD_SIZE_8BIT, &temp, 1, 0x10);
  74. temp = 0x01;
  75.     HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, ACCEL_CONFIG, I2C_MEMADD_SIZE_8BIT, &temp, 1, 0x10);
  76. }
  77. void BspMpu6050_test(int *x, int *y, int *z,int *t,int *wx,int *wy,int *wz)
  78. {
  79. uint8_t mpu6050_value[2];
  80. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read , ACCEL_XOUT_H, I2C_MEMADD_SIZE_8BIT, &mpu6050_value[0], 1, 0x10);
  81. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read , ACCEL_XOUT_L, I2C_MEMADD_SIZE_8BIT, &mpu6050_value[1], 1, 0x10);
  82.   *x =( mpu6050_value[0] << 8) + mpu6050_value[1];
  83. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read , ACCEL_YOUT_H, I2C_MEMADD_SIZE_8BIT, &mpu6050_value[0], 1, 0x10);
  84. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read , ACCEL_YOUT_L, I2C_MEMADD_SIZE_8BIT, &mpu6050_value[1], 1, 0x10);
  85.   *y =( mpu6050_value[0] << 8 )+ mpu6050_value[1];
  86. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read , ACCEL_ZOUT_H, I2C_MEMADD_SIZE_8BIT, &mpu6050_value[0], 1, 0x10);
  87. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read , ACCEL_ZOUT_L, I2C_MEMADD_SIZE_8BIT, &mpu6050_value[1], 1, 0x10);
  88.   *z =( mpu6050_value[0] << 8) + mpu6050_value[1];
  89. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read , TEMP_OUT_H, I2C_MEMADD_SIZE_8BIT, &mpu6050_value[0], 1, 0x10);
  90. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read , TEMP_OUT_L, I2C_MEMADD_SIZE_8BIT, &mpu6050_value[1], 1, 0x10);
  91.   *t =( mpu6050_value[0] << 8) + mpu6050_value[1];

  92. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read ,GYRO_XOUT_H , I2C_MEMADD_SIZE_8BIT, &mpu6050_value[0], 1, 0x10);
  93. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read ,GYRO_XOUT_L, I2C_MEMADD_SIZE_8BIT, &mpu6050_value[1], 1, 0x10);
  94.   *wx =( mpu6050_value[0] << 8) + mpu6050_value[1];
  95. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read , GYRO_YOUT_H , I2C_MEMADD_SIZE_8BIT, &mpu6050_value[0], 1, 0x10);
  96. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read , GYRO_YOUT_L, I2C_MEMADD_SIZE_8BIT, &mpu6050_value[1], 1, 0x10);
  97.   *wy =( mpu6050_value[0] << 8 )+ mpu6050_value[1];
  98. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read , GYRO_ZOUT_H, I2C_MEMADD_SIZE_8BIT, &mpu6050_value[0], 1, 0x10);
  99. HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read , GYRO_ZOUT_L, I2C_MEMADD_SIZE_8BIT, &mpu6050_value[1], 1, 0x10);
  100.   *wz =( mpu6050_value[0] << 8) + mpu6050_value[1];

  101. }
  102. void convert(unsigned int a){
  103. unsigned char i,j;
  104. unsigned long b;
  105. b=1;
  106. for(i=0;i<5;i++){
  107.   for(j=0;j<(5-i);j++)b*=10;
  108.   b/=10;
  109.   display[i]=a/b%10+48;
  110. b=1;}}
  111.   
  112.   
  113. /* USER CODE END PM */
  114. /* Private variables ---------------------------------------------------------*/
  115. /* USER CODE BEGIN PV */
  116. /* USER CODE END PV */
  117. /* Private function prototypes -----------------------------------------------*/
  118. void SystemClock_Config(void);
  119. /* USER CODE BEGIN PFP */
  120. /* USER CODE END PFP */
  121. /* Private user code ---------------------------------------------------------*/
  122. /* USER CODE BEGIN 0 */
  123. /* USER CODE END 0 */
  124. /**
  125.   * @brief  The application entry point.
  126.   * @retval int
  127.   */
  128. int main(void)
  129. {
  130.   /* USER CODE BEGIN 1 */
  131.   /* USER CODE END 1 */
  132.   /* MCU Configuration--------------------------------------------------------*/
  133.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  134.   HAL_Init();
  135.   /* USER CODE BEGIN Init */
  136.   /* USER CODE END Init */
  137.   /* Configure the system clock */
  138.   SystemClock_Config();
  139.   /* USER CODE BEGIN SysInit */
  140.   /* USER CODE END SysInit */
  141.   /* Initialize all configured peripherals */
  142.   MX_GPIO_Init();
  143.   MX_I2C1_Init();
  144.   MX_USART1_UART_Init();
  145.   /* USER CODE BEGIN 2 */
  146. InitMPU6050();
  147.   /* USER CODE END 2 */
  148.   /* Infinite loop */
  149.   /* USER CODE BEGIN WHILE */
  150.   while (1)
  151.   {
  152.     /* USER CODE END WHILE */
  153.     /* USER CODE BEGIN 3 */
  154.   /*for(i=0;i<100;i++){
  155.   BspMpu6050_test(&x,&y,&z);
  156.   XB+=x;YB+=y;ZB+=z;}
  157.   XB/=100;
  158.   YB/=100;
  159.   ZB/=100;*/
  160.   BspMpu6050_test(&x,&y,&z,&t,&wx,&wy,&wz);
  161.   if(x>32768){flag=1;x=65536-x;}
  162.   else flag=0;
  163.   x*=0.61035;
  164.   convert(x);
  165.   HAL_UART_Transmit(&huart1,(uint8_t*)"x:",2,0xFFFF);
  166.   if(flag==1)HAL_UART_Transmit(&huart1,(uint8_t*)" -",2,0XFFFF);
  167.   else HAL_UART_Transmit(&huart1,(uint8_t*)" +",2,0XFFFF);
  168.   HAL_UART_Transmit(&huart1,display,1,0xFFFF);
  169.   HAL_UART_Transmit(&huart1,(uint8_t*)" .",2,0XFFFF);
  170.   HAL_UART_Transmit(&huart1,display+1,4,0xFFFF);
  171.   HAL_UART_Transmit(&huart1,(uint8_t*)"\t\n",2,0xFFFF);
  172.   //HAL_UART_Transmit(&huart1,(uint8_t*)x,2,0xFFFF);

  173.   //HAL_Delay(500);
  174.   if(y>32768){flag=1;y=65536-y;}
  175.   else flag=0;
  176.   y*=0.61035;
  177.   convert(y);
  178.   HAL_UART_Transmit(&huart1,(uint8_t*)"y:",2,0xFFFF);
  179.   if(flag==1)HAL_UART_Transmit(&huart1,(uint8_t*)" -",2,0XFFFF);
  180.   else HAL_UART_Transmit(&huart1,(uint8_t*)" +",2,0XFFFF);
  181.   HAL_UART_Transmit(&huart1,display,1,0xFFFF);
  182.   HAL_UART_Transmit(&huart1,(uint8_t*)" .",2,0XFFFF);
  183.   HAL_UART_Transmit(&huart1,display+1,4,0xFFFF);
  184.   HAL_UART_Transmit(&huart1,(uint8_t*)"\t\n",2,0xFFFF);
  185.   //HAL_Delay(500);
  186.   if(z>32768){flag=1;z=65536-z;}
  187.   else flag=0;
  188.   z*=0.61035;
  189.   convert(z);
  190.   HAL_UART_Transmit(&huart1,(uint8_t*)"z:",2,0xFFFF);
  191.   if(flag==1)HAL_UART_Transmit(&huart1,(uint8_t*)" -",2,0XFFFF);
  192.   else HAL_UART_Transmit(&huart1,(uint8_t*)" +",2,0XFFFF);
  193.   HAL_UART_Transmit(&huart1,display,1,0xFFFF);
  194.   HAL_UART_Transmit(&huart1,(uint8_t*)" .",2,0XFFFF);
  195.   HAL_UART_Transmit(&huart1,display+1,4,0xFFFF);
  196.   HAL_UART_Transmit(&huart1,(uint8_t*)"\t\n",2,0xFFFF);
  197.   //HAL_Delay(500);
  198.   /*if(t>32768){flag=1;t=65536-t;}
  199.   else flag=0;
  200.   t*=0.61035;
  201.   convert(t);
  202.   HAL_UART_Transmit(&huart1,(uint8_t*)"t:",2,0xFFFF);
  203.   if(flag==1)HAL_UART_Transmit(&huart1,(uint8_t*)'-',1,0XFFFF);
  204.   else HAL_UART_Transmit(&huart1,(uint8_t*)'+',1,0XFFFF);
  205.   HAL_UART_Transmit(&huart1,display,1,0xFFFF);
  206.   HAL_UART_Transmit(&huart1,(uint8_t*)'.',1,0XFFFF);
  207.   HAL_UART_Transmit(&huart1,display+1,4,0xFFFF);
  208.   HAL_UART_Transmit(&huart1,(uint8_t*)"\t\n",2,0xFFFF);*/
  209.   if(wx>32768){flag=1;wx=65536-wx;}
  210.   else flag=0;
  211.   wx*=0.76294;
  212.   convert(wx);
  213.   HAL_UART_Transmit(&huart1,(uint8_t*)"wx:",3,0xFFFF);
  214.   if(flag==1)HAL_UART_Transmit(&huart1,(uint8_t*)" -",2,0XFFFF);
  215.   else HAL_UART_Transmit(&huart1,(uint8_t*)" +",2,0XFFFF);
  216.   HAL_UART_Transmit(&huart1,display,3,0xFFFF);
  217.   HAL_UART_Transmit(&huart1,(uint8_t*)" .",2,0XFFFF);
  218.   HAL_UART_Transmit(&huart1,display+3,2,0xFFFF);
  219.   HAL_UART_Transmit(&huart1,(uint8_t*)"\t\n",2,0xFFFF);
  220.   if(wy>32768){flag=1;wy=65536-wy;}
  221.   else flag=0;
  222.   wy*=0.76294;
  223.   convert(wy);
  224.   HAL_UART_Transmit(&huart1,(uint8_t*)"wy:",3,0xFFFF);
  225.   if(flag==1)HAL_UART_Transmit(&huart1,(uint8_t*)" -",2,0XFFFF);
  226.   else HAL_UART_Transmit(&huart1,(uint8_t*)" +",2,0XFFFF);
  227.   HAL_UART_Transmit(&huart1,display,3,0xFFFF);
  228.   HAL_UART_Transmit(&huart1,(uint8_t*)" .",2,0XFFFF);
  229.   HAL_UART_Transmit(&huart1,display+3,2,0xFFFF);
  230.   HAL_UART_Transmit(&huart1,(uint8_t*)"\t\n",2,0xFFFF);
  231.   if(wz>32768){flag=1;wz=65536-wz;}
  232.   else flag=0;
  233.   wz*=0.76294;
  234.   convert(wz);
  235.   HAL_UART_Transmit(&huart1,(uint8_t*)"wz:",3,0xFFFF);
  236.   if(flag==1)HAL_UART_Transmit(&huart1,(uint8_t*)" -",2,0XFFFF);
  237.   else HAL_UART_Transmit(&huart1,(uint8_t*)" +",2,0XFFFF);
  238.   HAL_UART_Transmit(&huart1,display,3,0xFFFF);
  239.   HAL_UART_Transmit(&huart1,(uint8_t*)" .",2,0XFFFF);
  240.   HAL_UART_Transmit(&huart1,display+3,2,0xFFFF);
  241.   HAL_UART_Transmit(&huart1,(uint8_t*)"\t\n",2,0xFFFF);
  242.   }
  243.   /* USER CODE END 3 */
  244. }
  245. /**
  246.   * @brief System Clock Configuration
  247.   * @retval None
  248.   */
  249. void SystemClock_Config(void)
  250. {
  251.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  252.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  253.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  254.   /** Supply configuration update enable
  255.   */
  256.   HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
  257.   /** Configure the main internal regulator output voltage
  258.   */
  259.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
  260.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
  261.   /** Initializes the CPU, AHB and APB busses clocks
  262.   */
  263.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  264.   RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
  265.   RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  266.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  267.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  268.   {
  269.     Error_Handler();
  270.   }
  271.   /** Initializes the CPU, AHB and APB busses clocks
  272.   */
  273.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  274.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
  275.                               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  276.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  277.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  278.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
  279.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;
  280.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
  281.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;
  282.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;
  283.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  284.   {
  285.     Error_Handler();
  286.   }
  287.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1;
  288.   PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
  289.   PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_D2PCLK1;
  290.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  291.   {
  292.     Error_Handler();
  293.   }
  294. }
  295. /* USER CODE BEGIN 4 */
  296. /* USER CODE END 4 */
  297. /**
  298.   * @brief  This function is executed in case of error occurrence.
  299.   * @retval None
  300.   */
  301. void Error_Handler(void)
  302. {
  303.   /* USER CODE BEGIN Error_Handler_Debug */
  304.   /* User can add his own implementation to report the HAL error return state */
  305.   /* USER CODE END Error_Handler_Debug */
  306. }
  307. #ifdef  USE_FULL_ASSERT
  308. /**
  309.   * @brief  Reports the name of the source file and the source line number
  310.   *         where the assert_param error has occurred.
  311.   * @param  file: pointer to the source file name
  312.   * @param  line: assert_param error line source number
  313.   * @retval None
  314.   */
  315. void assert_failed(uint8_t *file, uint32_t line)
  316. {
  317.   /* USER CODE BEGIN 6 */
  318.   /* User can add his own implementation to report the file name and line number,
  319.      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  320.   /* USER CODE END 6 */
  321. }
  322. #endif /* USE_FULL_ASSERT */
  323. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码

完整的代码(包含外设,适用于STM32H750)+CubeMX工程放在了一起。
MPUexperiment.7z (1.86 MB, 下载次数: 52)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表