stm32专题二十七:MPU6050 驱动程序

发布者:Joyful444Life最新更新时间:2021-10-29 来源: eefocus关键字:stm32  MPU6050  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

提供了一个简单的mpu6050的驱动:


mpu6050.h


#ifndef __MPU6050_H

#define __MPU6050_H

 

#include "stdint.h"

 

#include "i2c.h"

#include "usart.h"

#include "stm32f1xx_hal.h"

 

/* MPU6050 */

#define DELAY_MS                10          // 初始化延时

 

#define DEVICE_ADDR             (0XD0)      // 8位设备地址

 

#define PWR_MGMT_1              (0X6B)      // 电源管理1

#define MPU6050_RA_RATE_DIV     (0X19)      // 采样频率分频器

#define MPU6050_RA_CONFIG       (0X1A)      // 低通滤波器

#define MPU6050_RA_ACCEL_CONFIG (0X1C)      // 加速度计量程设置

#define MPU6050_RA_GYRO_CONFIG  (0X1B)      // 陀螺仪量程设置

 

#define MPU6050_RA_WHO_AM_I     (0X75)      // 设备标识

 

#define MPU6050_GYRO_OUT        (0x43)      // 陀螺仪数据寄存器地址

#define MPU6050_ACC_OUT         (0x3B)      // 加速度数据寄存器地址

 

#define MPU6050_RA_TEMP_OUT_H   (0x41)      // 温度寄存器 高地址

#define MPU6050_RA_TEMP_OUT_L   (0x42)      // 温度寄存器 低地址

 

typedef enum

{

    Bit_Reset = 0,

    Bit_Set

} BIT_Typedef;

 

 

void MPU6050_Init(void);

void MPU6050_ReadID(void);

void MPU6050_ReadAcc(int16_t *accData);

void MPU6050_ReadGyro(int16_t *gyroData);

 

#endif /* __MPU6050_H */

mpu6050.c


#include "mpu6050.h"

 

/**

  * @brief 写数据到MPU6050寄存器 

  * @param reg_addr     待写入的寄存器地址

  * @param data         待写入的数据

  */

static void MPU6050_WriteRegData(uint8_t reg_addr, uint8_t data)

{

HAL_I2C_Mem_Write(&hi2c1, DEVICE_ADDR, reg_addr, I2C_MEMADD_SIZE_8BIT, &data, 1, 0xFFFF);

}

 

/**

  * @brief 从指定寄存器读取数据

  * @param reg_addr     待读取的寄存器地址

  * @param data         数据指针

  * @param num          待读取的字节数

  */

static void MPU6050_ReadRegData(uint8_t reg_addr, uint8_t *data, uint8_t num)

{

HAL_I2C_Mem_Read(&hi2c1, DEVICE_ADDR, reg_addr, I2C_MEMADD_SIZE_8BIT, data, num, 0XFFFF);

}

 

/**

  * @brief MPU6050初始化

  */

void MPU6050_Init(void)

{

HAL_Delay(DELAY_MS);

 

/* 解除休眠 */

MPU6050_WriteRegData(PWR_MGMT_1, 0X00);

 

/* 陀螺仪采样率 = 1kHz / (1 + 采样率分频) = 100Hz */

MPU6050_WriteRegData(MPU6050_RA_RATE_DIV, 0x09);

 

/* 采样频率fs = 100Hz,带宽 = fs/2 = 50Hz */

MPU6050_WriteRegData(MPU6050_RA_CONFIG, 0X03);

 

/* 配置加速度计量程范围(最小计量范围):±2g */

MPU6050_WriteRegData(MPU6050_RA_ACCEL_CONFIG, 0x00);

 

/* 配置陀螺仪量程范围(最小计量范围):±250°/s */

MPU6050_WriteRegData(MPU6050_RA_GYRO_CONFIG, 0X00);

}

 

/**

  * @brief 读取MPU6050的设备ID

  */

void MPU6050_ReadID(void)

{

uint8_t device_id = 0;

 

MPU6050_ReadRegData(MPU6050_RA_WHO_AM_I, &device_id, 1);

 

if (device_id == 0X68)

{

printf("设备ID读取成功 -- ID = %#Xn", device_id);

}

else

{

printf("设备ID读取失败n");

}

}

 

/**

  * @brief 读取加速度值

  * @param accData  加速度数组指针

  */

void MPU6050_ReadAcc(int16_t *accData)

{

uint8_t buf[6] = {0};

 

/* 连续读取6个寄存器值,高位在前 */

MPU6050_ReadRegData(MPU6050_ACC_OUT, buf, 6);

 

/* 数据保存到传入的数组指针 */

accData[0] = (buf[0] << 8) | buf[1];

accData[1] = (buf[2] << 8) | buf[3];

accData[2] = (buf[4] << 8) | buf[5];

}

 

/**

  * @brief 读取陀螺仪值

  * @param accData  加速度数组指针

  */

void MPU6050_ReadGyro(int16_t *gyroData)

{

uint8_t buf[6] = {0};

 

/* 连续读取6个寄存器值,高位在前 */

MPU6050_ReadRegData(MPU6050_GYRO_OUT, buf, 6);

 

/* 数据保存到传入的数组指针 */

gyroData[0] = (buf[0] << 8) | buf[1];

gyroData[1] = (buf[2] << 8) | buf[3];

gyroData[2] = (buf[4] << 8) | buf[5];

}

测试程序 main.c


#include "main.h"

#include "dma.h"

#include "i2c.h"

#include "usart.h"

#include "gpio.h"

#include "mpu6050.h"

 

void SystemClock_Config(void);

 

int main(void)

{

  HAL_Init();

 

  int16_t accData[3] = {0};

  int16_t gyroData[3] = {0};

 

  SystemClock_Config();

 

  MX_GPIO_Init();

  MX_DMA_Init();

  MX_I2C1_Init();

  MX_USART1_UART_Init();

  MX_USART2_UART_Init();

 

  MPU6050_Init();

 

  while (1)

  {

MPU6050_ReadAcc(accData);

MPU6050_ReadGyro(gyroData);

 

printf("加速度%8d%8d%8dt", accData[0], accData[1], accData[2]);

printf("陀螺仪%8d%8d%8dtn", gyroData[0], gyroData[1], gyroData[2]);

HAL_Delay(500);

  }

}

 

 

/**

  * @brief System Clock Configuration

  * @retval None

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

  RCC_OscInitStruct.HSEState = RCC_HSE_ON;

  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;

  RCC_OscInitStruct.HSIState = RCC_HSI_ON;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }

 

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

  {

    Error_Handler();

  }

}


测试结果:

关键字:stm32  MPU6050  驱动程序 引用地址:stm32专题二十七:MPU6050 驱动程序

上一篇:stm32专题二十七:MPU6050介绍
下一篇:stm32专题二十八:读写内部Flash

推荐阅读最新更新时间:2024-11-05 17:34

STM32 | TCP通信实例分析
准备相关工程 硬件:小熊派开发板。 软件:STM32+RT-Thread 开发工具:RT-Thread Studio V1.1.0。 实验前提是我们的开发板与我们的PC所处的网络环境在同一网段内。 我们的开发板联网模块时ESP8266。这里需要使用RTT的at_device软件包,这在之前的笔记中已经有介绍:【RT-Thread笔记】onenet软件包的使用。 RT-Thread的网络框架 在编写代码之前有必要先了解一下RT-Thread的网络框架结构(图片来源:RT-Thread官网): 从下往上看: 第 1 层:与硬件相关的一些网络模块,这里我们用的是ESP8266。 第 2~4 层:一些中间层。本次实验中我
[单片机]
<font color='red'>STM32</font> | TCP通信实例分析
在Keil环境编程中发现STM32内存管理存在的问题
非常简单的一个工程,没有用到任何IO操作,与STM32有关的仅仅只有芯片的选择,即其SRAM大小有区别。图1是工程示意图,从图中可以看出,除了自己编写的代码外,仅仅增加了2个文件,即system_stm32f10x.c和startup_stm32f10x_hd.s,其中为了对startup_stm32f10x_hd.s进行修改,将其从库文件夹复制到了项目文件夹中。 图1 代码1 int main() { int a,b,c,d; a=10;b=20; c=a+b; for(;;); } myex1.c(3): warning: #550-D: variable c was set but never used linkin
[单片机]
在Keil环境编程中发现<font color='red'>STM32</font>内存管理存在的问题
第三章 一个LED闪烁
第一节 硬件解读 先看看原理图: 开发板上面芯片为:STM32L071KBU6,其中2号引脚(PC15)控制这一个LED,名为LD5,所以我们只需要控制STM32芯片的2号引脚(PC15)就可以控制LED啦。注意:LED的一侧为VDD_NODE,也就是3.3V,经过510欧姆的电阻之后,到LED的1号脚,所以我们只需要控制STM32的2号脚就可以来控制LED。STM32的2号脚为低电平,LED亮;反之则灭。 第二节 CubeMX配置 第一步:双击打开STM32CubeMX,,如下图,新建项目。注意:新建项目本教程只介绍一次,以后项目的建立不在重复。 第二步:在英文状态下搜索芯片:STM32L071KBU6,选后选择对
[单片机]
第三章 一个LED闪烁
STM32模块化程序】PWM产生
一、STM32的通用定时器介绍 STM32F103ZE 拥有 TIM2、TIM3、TIM4 和 TIM5 共 4 个通用定时器。 STM32F103C8拥有TIM2/TIM3/TIM4这三个通用定时器 通用定时器除了具备基本定时器的向上计数器功能外,还可以向下、向上/向下计数。 此外还具备独立通道,能够实现输入捕获、输出比较、PWM 输出、单脉冲输出的功能。 二、输出比较产生PWM 1、产生PWM的几种方式 ①、硬件实现。比如STM32 自带的 PWM 输出功能。 注意了,硬件实现的时候,外部接线需要接到通用定时器的外部通道上! ②、通用定时器的输出比较实现软件的PWM,这个软件产生的PWM要比定时器模拟产
[单片机]
学习分享STM32时钟系统小结
在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 1、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LS
[单片机]
STM32学习笔记之RTC(实时时钟)和BKP(备份寄存器)
RTC: RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。 RCC_BDCR:备份域控制寄存器。其LSEON、LSEBYP、RTCSEL和RTCEN位处于备份域,在复位后处于写保护状态,只有在电源控制寄存器(PWR_CR)中的DBP位置 1 后才能对这些位进行改动;这些位只能由备份域复位清除。 备份域复位:软件复位,RCC_BDCR 寄存器 BDRST位置1产生; 在VDD和VBAT两者掉电的前提下,VDD或VBAT上电将引发备份区域复位。 系统复位后,对后备寄存器和RTC的访问被禁止,执行以下操作将使能对后备寄存器和RTC的访
[单片机]
<font color='red'>STM32</font>学习笔记之RTC(实时时钟)和BKP(备份寄存器)
STM32学习笔记之点亮LED灯
实验程序: /*******************************led.c*********************************/ #include stm32f4xx.h //在SYSTEM目录下可以找到,把ST官方的部分库抽取出来,组成了一个SYSTEM目录 #include sys.h void LED_Init(void){ RCC- AHB1ENR = 1 5; //使能GPIO端口的F时钟 /* 方法一: */ // GPIOF- ODR |= 0x1 9; // GPIOF- MODER |= 0x1 18; /
[单片机]
<font color='red'>STM32</font>学习笔记之点亮LED灯
STM32红牛开发板非固件库控制LED
摘要 STM32红牛开发板上的5个LED,接在GPIOF6~10脚,输出低电平时,LED亮。这样我们设置GPIOF的相关寄存器,让其输出低电平就可以让LED亮。因为没有用到ST提供的固件库,所以是直接对寄存器的内存地址读写,即对一个指向该地址的指针变量进行读写。并且该变量必须为易变型的,即用volatile定义,这样是为了告诉编译器不要去优化这个变量,导致其它一些寄存器的数据变化。GPIOx是挂载在APB2高速外设总线上的,最大频率是72MHZ,所以我们除了了打开HSE(外部高速时钟)并关闭内部高速时钟(开机默认选择了HSI)外,还要打开APB2总线的时钟。 一、寄存器地址映射 外设的基址PERI
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved