我是靠谱客的博主 风趣芹菜,最近开发中收集的这篇文章主要介绍MPU6050/6500/9250中断读取原始数据(基于STM32F103),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

实验说明:本实验是基于野火的MPU6050读取原始数据进行改编。中断读取数据,可以将数据波形显示在匿名上位机上(V65版本)。需要完整代码可留言
main函数


```c
#include "./mpu6050/mpu6050.h"
#include "./usart/bsp_usart.h"
#include "./i2c/bsp_i2c.h"
#include "delay.h"
/**
* @brief
写数据到MPU6050寄存器
* @param
add:写入的寄存器地址
dat:输入的数据
* @retval
*/
void MPU6050_WriteReg(u8 reg_add,u8 reg_dat)
{
i2c_Start();
i2c_SendByte(MPU6050_SLAVE_ADDRESS);
i2c_WaitAck();
i2c_SendByte(reg_add);
i2c_WaitAck();
i2c_SendByte(reg_dat);//这里是发送一个字节的数据
i2c_WaitAck();
i2c_Stop();
}
/**
* @brief
从MPU6050寄存器读取数据
* @param
* @retval
*/
void MPU6050_ReadData(u8 reg_add,unsigned char*Read,u8 num)
{
unsigned char i;
i2c_Start();
i2c_SendByte(MPU6050_SLAVE_ADDRESS);//因为此时要发生寄存器地址,所以是写方向0x68<<1,最有一位读写位为0,默认是写方向
i2c_WaitAck();
i2c_SendByte(reg_add);
i2c_WaitAck();
i2c_Start();
i2c_SendByte(MPU6050_SLAVE_ADDRESS+1);//最后一位读写位是1,是读方向
i2c_WaitAck();
for(i=0;i<(num-1);i++){
*Read=i2c_ReadByte(1);
Read++;
}
*Read=i2c_ReadByte(0);
i2c_Stop();
}
/**
* @brief
初始化MPU6050芯片
* @param
* @retval
*/
void MPU6050_Init(void)
{
int i=1000,j=0;
//在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错
for(i=0;i<1000;i++)
{
for(j=0;j<1000;j++)
{
;
}
}
//delay_us(100000); //为什么这里用delay函数就无现象???
MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00);
//解除休眠状态
MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07);
//陀螺仪采样率,1KHz = 8k/(7+1)
MPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06);
//低通滤波器的设置,截止频率是1K,带宽是5K
MPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x00);
//配置加速度传感器工作在2G模式,不自检
MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18);
//陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
MPU6050_WriteReg(MPU6050_RA_INT_PIN_CFG,0x9c);
//
MPU6050_WriteReg(MPU6050_RA_INT_ENABLE,0x01);
//数据准备就绪中断
//	MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00);
//解除休眠状态
//	MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07);
//陀螺仪采样率,1KHz
//	MPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06);
//低通滤波器的设置,截止频率是1K,带宽是5K
//	MPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x00);
//配置加速度传感器工作在2G模式,不自检
//	MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18);
//陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
}
/**
* @brief
读取MPU6050的ID
* @param
* @retval
*/
uint8_t MPU6050ReadID(void)
{
unsigned char Re = 0; //re用来存储读出的数据
MPU6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1);
//读器件地址
if(Re != 0x70)
{
printf("MPU6050 dectected error!rn检测不到MPU6050模块,请检查模块与开发板的接线");
return 0;
}
else
{
printf("MPU6050 ID = %drn",Re);
return 1;
}
}
/**
* @brief
读取MPU6050的加速度数据
* @param
* @retval
*/
void MPU6050ReadAcc(short *accData)
{
u8 buf[6];
MPU6050_ReadData(MPU6050_ACC_OUT, buf, 6); //读取0x3B寄存器上的数据 存储在buf中,6个数据
accData[0] = (buf[0] << 8) | buf[1]; //x轴的16位数据
accData[1] = (buf[2] << 8) | buf[3]; //y轴的16位数据
accData[2] = (buf[4] << 8) | buf[5]; //z轴的16位数据
}
/**
* @brief
读取MPU6050的角加速度数据
* @param
* @retval
*/
void MPU6050ReadGyro(short *gyroData)
{
u8 buf[6];
MPU6050_ReadData(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];
}
/**
* @brief
读取MPU6050的原始温度数据
* @param
* @retval
*/
void MPU6050ReadTemp(short *tempData)
{
u8 buf[2];
MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2);
//读取温度值
*tempData = (buf[0] << 8) | buf[1];
}
/**
* @brief
读取MPU6050的温度数据,转化成摄氏度
* @param
* @retval
*/
void MPU6050_ReturnTemp(float *Temperature)
{
short temp3;
u8 buf[2];
MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2);
//读取温度值
temp3= (buf[0] << 8) | buf[1];
*Temperature=((double) temp3/340.0)+36.53;
}

MPU6050.c文件
```c
#include "./mpu6050/mpu6050.h"
#include "./usart/bsp_usart.h"
#include "./i2c/bsp_i2c.h"
#include "delay.h"
/**
* @brief
写数据到MPU6050寄存器
* @param
add:写入的寄存器地址
dat:输入的数据
* @retval
*/
void MPU6050_WriteReg(u8 reg_add,u8 reg_dat)
{
i2c_Start();
i2c_SendByte(MPU6050_SLAVE_ADDRESS);
i2c_WaitAck();
i2c_SendByte(reg_add);
i2c_WaitAck();
i2c_SendByte(reg_dat);//这里是发送一个字节的数据
i2c_WaitAck();
i2c_Stop();
}
/**
* @brief
从MPU6050寄存器读取数据
* @param
* @retval
*/
void MPU6050_ReadData(u8 reg_add,unsigned char*Read,u8 num)
{
unsigned char i;
i2c_Start();
i2c_SendByte(MPU6050_SLAVE_ADDRESS);//因为此时要发生寄存器地址,所以是写方向0x68<<1,最有一位读写位为0,默认是写方向
i2c_WaitAck();
i2c_SendByte(reg_add);
i2c_WaitAck();
i2c_Start();
i2c_SendByte(MPU6050_SLAVE_ADDRESS+1);//最后一位读写位是1,是读方向
i2c_WaitAck();
for(i=0;i<(num-1);i++){
*Read=i2c_ReadByte(1);
Read++;
}
*Read=i2c_ReadByte(0);
i2c_Stop();
}
/**
* @brief
初始化MPU6050芯片
* @param
* @retval
*/
void MPU6050_Init(void)
{
int i=1000,j=0;
//在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错
for(i=0;i<1000;i++)
{
for(j=0;j<1000;j++)
{
;
}
}
//delay_us(100000); //为什么这里用delay函数就无现象???
MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00);
//解除休眠状态
MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07);
//陀螺仪采样率,1KHz = 8k/(7+1)
MPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06);
//低通滤波器的设置,截止频率是1K,带宽是5K
MPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x00);
//配置加速度传感器工作在2G模式,不自检
MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18);
//陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
MPU6050_WriteReg(MPU6050_RA_INT_PIN_CFG,0x9c);
//
MPU6050_WriteReg(MPU6050_RA_INT_ENABLE,0x01);
//数据准备就绪中断
}
/**
* @brief
读取MPU6050的ID
* @param
* @retval
*/
uint8_t MPU6050ReadID(void)
{
unsigned char Re = 0; //re用来存储读出的数据
MPU6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1);
//读器件地址
if(Re != 0x70)
{
printf("MPU6050 dectected error!rn检测不到MPU6050模块,请检查模块与开发板的接线");
return 0;
}
else
{
printf("MPU6050 ID = %drn",Re);
return 1;
}
}
/**
* @brief
读取MPU6050的加速度数据
* @param
* @retval
*/
void MPU6050ReadAcc(short *accData)
{
u8 buf[6];
MPU6050_ReadData(MPU6050_ACC_OUT, buf, 6); //读取0x3B寄存器上的数据 存储在buf中,6个数据
accData[0] = (buf[0] << 8) | buf[1]; //x轴的16位数据
accData[1] = (buf[2] << 8) | buf[3]; //y轴的16位数据
accData[2] = (buf[4] << 8) | buf[5]; //z轴的16位数据
}
/**
* @brief
读取MPU6050的角加速度数据
* @param
* @retval
*/
void MPU6050ReadGyro(short *gyroData)
{
u8 buf[6];
MPU6050_ReadData(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];
}
/**
* @brief
读取MPU6050的原始温度数据
* @param
* @retval
*/
void MPU6050ReadTemp(short *tempData)
{
u8 buf[2];
MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2);
//读取温度值
*tempData = (buf[0] << 8) | buf[1];
}
/**
* @brief
读取MPU6050的温度数据,转化成摄氏度
* @param
* @retval
*/
void MPU6050_ReturnTemp(float *Temperature)
{
short temp3;
u8 buf[2];
MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2);
//读取温度值
temp3= (buf[0] << 8) | buf[1];
*Temperature=((double) temp3/340.0)+36.53;
}

最后

以上就是风趣芹菜为你收集整理的MPU6050/6500/9250中断读取原始数据(基于STM32F103)的全部内容,希望文章能够帮你解决MPU6050/6500/9250中断读取原始数据(基于STM32F103)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部