模块学习(二)——MPU6050

这篇具有很好参考价值的文章主要介绍了模块学习(二)——MPU6050。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

去年电赛备赛期间,学的STM32标准库,那一整个繁琐直接给我劝退了,当时学习MPU6050时就非常痛苦,代码也看不懂,无非抄来抄去,然后就是编译,改错,编译无穷尽也。最近参考野火的MPU6050代码,将其移植到了MSP430f5529之上,今天分享出来。

1.重要性

MPU6050模块对于不论平衡车还是四旋翼无人机的开发都是非常重要的一个模块,除此之外,对于四轮小车的转弯闭环控制也是至关重要的,因此备战电赛控制类这是一个不可避开的模块。该模块包含陀螺仪和加速度传感器,可以解算出其x,y,z三个方向的角度和各个方向的角速度,使用十分方便,此次并未采用官方的DMP库。

2.代码

废话不多说,直接上代码,调用即可。

/*
 * MPU6050.c
 *
 *  Created on: 2022年7月17日
 *      Author: S10
 */
#include "driverlib.h"
#include "mpu6050.h"

void ByteWrite6050(unsigned char REG_Address,unsigned char REG_data);
unsigned char ByteRead6050(unsigned char REG_Address);
int Get6050Data(unsigned char REG_Address);
void InitMPU6050();
float Mpu6050AccelAngle(char dir);
float Mpu6050GyroAngle(char dir);

///开启信号
void IIC_start()
{
    SDA_OUT;
    SCL_OUT;
    SCL_HIGH;
    SDA_HIGH;
    __delay_cycles(10);
    SDA_LOW;
    __delay_cycles(10);
    SCL_LOW;
}
///停止信号
void IIC_stop()
{
    SDA_OUT;
    SCL_OUT;
    SDA_LOW;
    SCL_HIGH;
    __delay_cycles(10);
    SDA_HIGH;
    __delay_cycles(10);
}


//发送应答信号(MCU=>||)
void SendACK(unsigned char ack)
{
    SDA_OUT;
    SCL_OUT;
    if(ack==1)
    {
        SDA_HIGH;
    }
    else if(ack==0)
    {
        SDA_LOW;
    }
    else
        return;
    SCL_HIGH;
    __delay_cycles(10);
    SCL_LOW;
    __delay_cycles(10);
}
接收应答信号(||=>MCU)
unsigned char IIC_testACK()
{
    unsigned char a;
    SCL_OUT;
    SDA_IN;
//GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P8, GPIO_PIN2);
    SCL_HIGH;
    __delay_cycles(10);
    if(GPIO_getInputPinValue (GPIO_PORT_P8, GPIO_PIN2)==1)
    {
        a=1;
    }
    else
    {
        a=0;
    }

    SCL_LOW;
    __delay_cycles(10);
    SDA_OUT;
    return a;
}

///向IIC总线发送数据(MCU=>||)
void IIC_writebyte(unsigned char IIC_byte)
{
    unsigned char i;
    SDA_OUT;
    SCL_OUT;
//    SCL_LOW;
        for (i=0; i<8; i++)         //8位计数器
            {
                if((IIC_byte<<i)&0x80)
                {
                    SDA_HIGH;
                }
                else
                {
                    SDA_LOW;
                }

        __delay_cycles(10);
        SCL_HIGH;
        __delay_cycles(10);
        SCL_LOW;
//        __delay_cycles(10);
//        IIC_byte<<=1;
    }

    IIC_testACK();
}


IIC接收一个字节(||——>MCU)
unsigned char IIC_readebyte(void)
{
    unsigned char i,k=0;
    SDA_IN;
    GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P8, GPIO_PIN2);
    SCL_OUT;
    SCL_LOW;
    __delay_cycles(100);
    for(i=0;i<8;i++)
    {
        SCL_HIGH;
        k=k<<1;
        if(SDA)
            k|=1;
        SCL_LOW;
        __delay_cycles(100);
    }
    SDA_OUT;
    __delay_cycles(100);
    return k;
}


//**************************************
//向I2C设备写入一个字节数据
//**************************************
void ByteWrite6050(unsigned char REG_Address,unsigned char REG_data)
{
    IIC_start();                  //起始信号
    IIC_writebyte(SlaveAddress);   //发送设备地址+写信号
    IIC_writebyte(REG_Address);    //内部寄存器地址,
    IIC_writebyte(REG_data);        //内部寄存器数据,
    IIC_stop();                   //发送停止信号
}
//**************************************
//从I2C设备读取一个字节数据
//**************************************
unsigned char ByteRead6050(unsigned char REG_Address)
{
    unsigned char REG_data;
    IIC_start();                   //起始信号
    IIC_writebyte(SlaveAddress);     //发送设备地址+写信号
    IIC_writebyte(REG_Address);      //发送存储单元地址,从0开始
    IIC_start();                   //起始信号
    IIC_writebyte(SlaveAddress+1);  //发送设备地址+读信号
    REG_data=IIC_readebyte();       //读出寄存器数据
    SendACK(1);                //接收应答信号
    IIC_stop();                    //停止信号
    return REG_data;
}
//**************************************
//合成数据
//**************************************
int Get6050Data(unsigned char REG_Address)
{
    char H,L;
    H=ByteRead6050(REG_Address);
    L=ByteRead6050(REG_Address+1);
    return (H<<8)+L;   //合成数据
}
//**************************************
//初始化MPU6050
//**************************************
void InitMPU6050()
{
    ByteWrite6050(PWR_MGMT_1, 0x00);  // 解除休眠状态
    ByteWrite6050(SMPLRT_DIV, 0x07);  // 陀螺仪采样率设置(125HZ)
    ByteWrite6050(CONFIG, 0x06);      // 低通滤波器设置(5HZ频率)
    ByteWrite6050(GYRO_CONFIG, 0x18); // 陀螺仪自检及检测范围设置(不自检,16.4LSB/DBS/S)
    ByteWrite6050(ACCEL_CONFIG, 0x01); // 不自检,量程2g
}

/*
**********************************************
**函数名  :float Mpu6050AccelAngle(int8 dir)
**函数功能:输出加速度传感器测量的倾角值
**            范围为2g时,换算关系:16384 LSB/g
**            角度较小时,x=sinx得到角度(弧度), deg = rad*180/3.14
**            因为x>=sinx,故乘以1.2适当放大
**返回参数:测量的倾角值
**传入参数:dir - 需要测量的方向
**           ACCEL_XOUT - X方向
**           ACCEL_YOUT - Y方向
**           ACCEL_ZOUT - Z方向
**********************************************
*/
float Mpu6050AccelAngle(char dir)
{
    float accel_agle; // 测量的倾角值
    float result; // 测量值缓存变量
    result = (float)Get6050Data(dir); // 测量当前方向的加速度值,转换为浮点数
    accel_agle = (result + MPU6050_ZERO_ACCELL)/16384; // 去除零点偏移,计算得到角度(弧度)
    accel_agle = accel_agle*1.2*180/3.14;     //弧度转换为度

    return accel_agle; // 返回测量值
}

/*
**********************************************
**函数名  :float Mpu6050GyroAngle(int8 dir)
**函数功能:输出陀螺仪测量的倾角加速度
**            范围为2000deg/s时,换算关系:16.4 LSB/(deg/s)
**返回参数:测量的倾角加速度值
**传入参数:dir - 需要测量的方向
**           GYRO_XOUT - X轴方向
**           GYRO_YOUT - Y轴方向
**           GYRO_ZOUT - Z轴方向
**********************************************
*/
float Mpu6050GyroAngle(char dir)
{
    float gyro_angle;
    gyro_angle = (float)Get6050Data(dir);   // 检测陀螺仪的当前值
    gyro_angle = -(gyro_angle + MPU6050_ZERO_GYRO)/16.4;    //去除零点偏移,计算角速度值,负号为方向处理

    return gyro_angle; // 返回测量值
}


/*
 * MPU6050.h
 *
 *  Created on: 2022年7月17日
 *      Author: S10
 */

#ifndef MPU6050_H_
#define MPU6050_H_

//********Mpu6050的零点校准值**************
#define MPU6050_ZERO_ACCELL 378
#define MPU6050_ZERO_GYRO 13
//*************定义MPU6050内部地址*******************
#define SMPLRT_DIV      0x19    //输出8位无符号位,输出分频,用来配置采样频率的寄存器。采样率=陀螺仪的输出率/(1+该寄存器值),低通滤波器使能时陀螺仪输出为8k,反之1k。
#define CONFIG          0x1A    //配置低通滤波器的寄存器
#define GYRO_CONFIG     0x1B    //三个方向角度的自我测试和量程
#define ACCEL_CONFIG    0x1C    //三个方向加速度的自我测试和量程
/***************加速度传感器寄存器******************/
#define ACCEL_XOUT_H            0x3B
#define ACCEL_XOUT_L            0x3C
#define ACCEL_XOUT      ACCEL_XOUT_H    // X轴读取地址,高位为起始位
#define ACCEL_YOUT_H            0x3D
#define ACCEL_YOUT_L            0x3E
#define ACCEL_YOUT      ACCEL_YOUT_H    // Y轴读取地址,高位为起始位
#define ACCEL_ZOUT_H            0x3F
#define ACCEL_ZOUT_L            0x40
#define ACCEL_ZOUT      ACCEL_ZOUT_H    // Z轴读取地址,高位为起始位
/*****************温度传感器寄存器****************/
#define TEMP_OUT_H      0x41
#define TEMP_OUT_L      0x42
#define TEMP_OUT          TEMP_OUT_H    // 温度传感器读取地址,高位为起始位
//
/陀螺仪相关寄存器//
//
#define GYRO_XOUT_H     0x43
#define GYRO_XOUT_L     0x44
#define GYRO_XOUT        GYRO_XOUT_H    // 陀螺仪X轴读取地址,高位为起始位
#define GYRO_YOUT_H     0x45
#define GYRO_YOUT_L     0x46
#define GYRO_YOUT        GYRO_YOUT_H    // 陀螺仪Y轴读取地址,高位为起始位
#define GYRO_ZOUT_H     0x47
#define GYRO_ZOUT_L     0x48
#define GYRO_ZOUT        GYRO_ZOUT_H    // 陀螺仪Z轴读取地址,高位为起始位
///
其它寄存器/
//
#define PWR_MGMT_1      0x6B    //电源管理
#define WHO_AM_I        0x75    //6位iic地址,最后一位A0控制
//
///iic地址设置
/
#define SlaveAddress    0xD0    //A0接地,若接3.3v则0xD1

extern void ByteWrite6050(unsigned char REG_Address,unsigned char REG_data);
extern unsigned char ByteRead6050(unsigned char REG_Address);
extern int Get6050Data(unsigned char REG_Address);
extern void InitMPU6050();
extern float Mpu6050AccelAngle(char dir);
extern float Mpu6050GyroAngle(char dir);

#define    SCL_HIGH    P1OUT|=BIT2
#define    SCL_LOW     P1OUT&=~BIT2
#define    SDA_HIGH    P1OUT|=BIT3
#define    SDA_LOW     P1OUT&=~BIT3
#define    SDA_OUT     P1DIR|=BIT3
#define    SDA_IN      P1DIR&=~BIT3
#define    SCL_OUT     P1DIR|=BIT2
#define    SDA         P1IN&BIT3

void IIC_start();//开始
void IIC_stop();//停止
void SendACK(unsigned char ack);//向iic发送标志
void IIC_writebyte(unsigned char IIC_byte);///接收iic标志
unsigned char IIC_testACK();///发送数据
unsigned char IIC_readebyte();///接收数据

#endif /* MPU6050_H_ */

直接根据自己的需求更改模拟IIC的SCL和SDA引脚即可
需要注意的是IIC时序中的延时,以上代码是在主频为16MHZ的条件下完成的。
文章来源地址https://www.toymoban.com/news/detail-576754.html

到了这里,关于模块学习(二)——MPU6050的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【嵌入式模块】MPU6050

      作为惯性传感器中入门级别的器件,MPU6050凭借它出色的性价比成为一款非常常用的角度姿态传感器,在很多科创项目中被使用。我之前也接触过很多次这个器件,也收集了不少资料,趁此机会总结一下学习笔记。   MPU6050包含3轴陀螺仪和3轴加速度计,其中陀螺仪的主

    2024年01月25日
    浏览(37)
  • 单片机开发教程3——串口发送MPU6050姿态角

    MPU6050 是 InvenSense 公司推出的整合性 6 轴运动处理组件,其内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个IIC 接口, 可用于连接外部磁力传感器,并利用自带的数字运动处理器(DMP: Digital Motion Processor) 硬件加速引擎,通过主 IIC 接口,向应用端输出完整的 9 轴融

    2024年02月14日
    浏览(44)
  • 【STM32】STM32学习笔记-软件I2C读写MPU6050(33)

    I2C(Inter-Integrated Circuit)总线 是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 串行的 8 位双向数据传输位速率在标准模式下可

    2024年01月21日
    浏览(64)
  • 【STM32】STM32学习笔记-硬件I2C读写MPU6050(35)

    I2C(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 串行的 8 位双向数据传输位速率在标准模式下可

    2024年01月25日
    浏览(63)
  • 【ESP32Arduino+MPU6050姿态解算】自制无人机学习笔记2 PLatformIO 下载即可使用

    本人之前发表过一篇关于esp32读取mpu6050数据的文章,链接:http://t.csdn.cn/AwzSZ,但其存在一些漏洞,具体表现在输出数据存在不连贯和错误,在mpu6050高速运动时存在较大误差等。仅作为参考。故在此重发作为修正。当前该篇文章中所述的模块,已经过无人机稳定性控制的测试

    2024年02月16日
    浏览(44)
  • 【stm32】stm32学习笔记(江科大)-详解stm32获取Mpu6050陀螺仪和加速度

    目录 I2C 起始条件: 终止条件:  发送一个字节 接收一个字节  接收发送应答  代码 I2C I2C.C I2C.h Mpu6050 Mpu6050.c Mpu6050.h Mpu6050Reg.h main.c 结果   要想获取Mpu6050陀螺仪和加速度那就需要了解一下Mpu6050。Mpu6050使用的是I2C通讯 先了解一下 起始条件: SCL高电平期间,SDA从高电平切换

    2024年02月16日
    浏览(67)
  • (Rockpi 4b使用心得),Python的smbus模块,mpu6050等模块的使用

    大家好,关于有些新手们买了rockpi4b,或者使用过树莓派的在转rockpi4b的过程中,使用Python中的smbus模块会遇到很多错误,而Python又因为其中的语法特别简单的关系,所以受到了众多程序员的拥戴,而这篇文章主要讲的是使用rockpi4b的时候,和树莓派之间又有什么不同。本人也

    2023年04月12日
    浏览(40)
  • STM32学习笔记(十)丨I2C通信(使用I2C实现MPU6050和STM32之间通信)

    ​  本次课程采用单片机型号为STM32F103C8T6。(鉴于笔者实验时身边只有STM32F103ZET6,故本次实验使基于ZET6进行的) ​  课程链接:江协科技 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试

    2024年01月19日
    浏览(59)
  • 【STM32学习】——I2C通信协议&MPU6050姿态传感器&软件I2C读写MPU6050

    ​   目录 前言 一、I2C通信协议 1.简介 2.硬件电路设计 3.I2C时序(软件)

    2024年02月16日
    浏览(56)
  • STM32入门笔记(02):MPU6050、MPU9250、ICM20948及姿态解算(SPL库函数版)

    【正点原子】 手把手教你学STM32 系列视频之 STM32F4-基于探索者F407 DMP 读取MPU6050角度数据以及匿名四轴飞控上位机介绍 STM32F103 DMP读取MPU6050角度数据 MPU6050是InvenSense公司( Invensense公司成立于2003年6月,总部位于美国Sunnyvale,主要生产的产品为运动感测追踪组件。) 推出的全球首

    2024年02月01日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包