历史上的今天

今天是:2024年10月29日(星期二)

正在发生

2021年10月29日 | stm32专题二十七:MPU6050 驱动程序

发布者:Joyful444Life 来源: 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

推荐阅读

随着国内物联网环境的快速成熟,各类终端厂商、芯片,以及IP厂商也在进行多种市场布局。在此背景下,RT-Thread深入产业合作,吸引越来越多的物联网厂商采用自己物联网操作系统。近期,RT-Thread发布了RT-Thread4.0物联网操作系统,从多方面进行了产品升级,方便了开发者使用,整合了生态资源,优化设计环境。 RT-Thread4.0发布会现场在本次发布会上,RT-T...
近日,在第三季度投资者交流会上,汇顶科技董事长张帆透露,该公司研发的超薄LCD屏幕指纹识别芯片即将量产,有信心在年内推出量产方案。5G时代,手机内部增加了包括天线在内的很多器件,对结构设计也提出了更高的要求,因此超薄屏下光学指纹识别方案将成为新一代的指纹识别方案。对此,张帆表示,汇顶为5G手机的需求而研发的超薄屏下光学指纹识别芯片即将...
10月26日,晋城市光机电产业研究院先进半导体光电器件与系统集成重点实验室项目在晋城开发区正式开工,标志着研究院项目建设朝着“实质性运作”迈出决定性步伐。该实验室项目于5月份启动前期工作、9月份通过专家评审考察、10月份获批建设山西省级重点实验室,创造了山西省级重点实验室建设的晋城开发区速度。实验室聚焦纳米材料与器件、半导体光电材料与器...
2021第十届CCH广州国际餐饮连锁加盟展览会于10月27日至29日在广州广交会琶洲展馆举办。该展会是华南地区最具影响力的餐饮连锁加盟展览会,肩负“行业大发展”使命,以助力连锁餐饮有效拓展加盟市场为己任,优选餐饮品牌,为万千投资加盟者提供“一站式”服务。 展会秉承“助力加盟创业,共享连锁商机”的宗旨,集聚餐饮行业大咖和品牌创始人,剖析疫后...

史海拾趣

问答坊 | AI 解惑

电子密码锁设计

1.实验任务   根据设定好的密码,采用二个按键实现密码的输入功能,当密码输入正确之后,锁就打开,如果输入的三次的密码不正确,就锁定按键3秒钟,同时发现报警声,直到没有按键按下3种后,才打开按键锁定功能;否则在3秒钟内仍有按键按下,就 ...…

查看全部问答∨

Altera 的I2C硬件接口设计(含代码和工程)

Altera 的I2C硬件接口设计(含代码和工程)…

查看全部问答∨

LINUX的makefile问题!!!!

CC = ckcore-elf-gcc AS = ckcore-elf-as LD = ckcore-elf-ld CFLAGS  = -mbig-endian  -c -O2 -g ASFLAGS = -mbig-endian OBJECT = tinyloader.o tiny_spi.o tiny_main.o vectors.o \\         &nb ...…

查看全部问答∨

家用烟感

各位高手,请帮帮忙,需要家用烟感方面的设计,主要用到光敏二极管,射频电路,cc2500 msp430单片机 。。。挥泪大感谢啊 …

查看全部问答∨

怎么应用XBYTE读写DS12B887

总线方式连接51单片机和DS12B8, 其中CS片选段连接到译码器74HC154的Y0, 74HC154的地址线A\\B\\C\\D连接到P2_3、P2_4、P2_5、P2_6; 晶振频率为 6 MHz; 那位高人指导的读写下,用XBYTE 方式读写DS12B887的时、分、秒,谢谢!刚学单片机。…

查看全部问答∨

2410的DMA内存拷贝,如何设置寄存器

我想将内存地址为Addr1开始的2M数据拷贝到Addr2,如何用DMA实现呢?…

查看全部问答∨

加载出现错误,PLA 后缀是啥文件

一个例子,alarm clock,项目有若干个源文件,其中有一个后缀为pla的,用modelsim complie all通过了,可加载仿真的时候提示几个错误:Error: (vsim-3033) F:/hdl_src/mit/tutorial/verilog/CONVERTOR_CKT.v(18): Instantiation of \'CONVERTOR\' f ...…

查看全部问答∨

【为C2000做贡献】CCS及DSP_BIOS的原理--例程

我感觉这个资料不错,有用的同学收一下,别忘了留下个脚印。 我这里有好多资料,全部奉献出来。大家一起进步 CCS代码 [ 本帖最后由 fxw451 于 2011-4-7 09:28 编辑 ]…

查看全部问答∨

关于LM3S系列的运行区间RAM和下载区间ROM FLASH设置

LM3S系列的运行区间RAM和下载区间ROM FLASH设置,请问在KEIL中怎么设置,比如说我要下载到哪个区域去,9B96的RAM和ROM FLASH的基址分别是多少?求助了…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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