mpu6050GY521+msp4305529组成的温度角度传感器

本篇文章会参考知乎一位大佬的结果(希望他本人看到后不要介意),我只是了解了在静态时的测量角度方法,对于动态测量角度后期在我学习了之后,会给大家整理出来。

知乎大佬:

废话不多说,先上代码! 

#include "driverlib.h"
#include "GY521.h"
#include "math.h"
int a,b,c,d;
double angle;
float temp;
unsigned char MPU_Read_Len(unsigned char addr,unsigned char reg,unsigned char len,unsigned char *buf)
{
    MPU_IIC_Start();
    MPU_IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令
    if(MPU_IIC_Wait_Ack())  //等待应答
    {
        MPU_IIC_Stop();
        return 1;
    }
    MPU_IIC_Send_Byte(reg); //写寄存器地址
    MPU_IIC_Wait_Ack();     //等待应答
    MPU_IIC_Start();
    MPU_IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令
    MPU_IIC_Wait_Ack();     //等待应答
    while(len)
    {
        if(len==1)*buf=MPU_IIC_Read_Byte(0);//读数据,发送nACK
        else *buf=MPU_IIC_Read_Byte(1);     //读数据,发送ACK
        len--;
        buf++;
    }
    MPU_IIC_Stop(); //产生一个停止条件
    return 0;
}
//
float MPU_Get_Temperature(void)
{
    unsigned char buf[2];//定义一个无符号字符型数组,buf[0]存TEMP_OUT_H,buf[1]存TEMP_OUT_L。
    short raw;//raw为高八位和第八位和
    float temp;//temp显示温度值
    MPU_Read_Len(0X68,0X41,2,buf);//将TEMP_OUT_H和TEMP_OUT_L里面的值分别存到buf[0]和buf[1]。
    raw=((unsigned int)buf[0]<<8)|buf[1];//buf[0]左移八位和buf[1]或运算
    temp=36.53+((double)raw)/340;//温度转换公式,上网查的。
    return temp;//返回温度值
}
void main(void) {

    WDT_A_hold(WDT_A_BASE);//关闭看门狗
    InitMPU6050();//初始化mpu6050
    while(1){//while循环一直计算温度和角度值
    a=GetData(ACCEL_ZOUT_H);//获取ACCEL_ZOUT_H值,要注意的是GetData()函数已经自动把ACCEL_ZOUT_H左移八位和ACCEL_ZOUT_L或运算。
    b=GetData(ACCEL_XOUT_H);
    temp=MPU_Get_Temperature();
    angle = atan2((double)b,(double)a)*180/3.14;//角度转化公式,具体原理我会在文章中详细讲解。
    }
}
///
//作者:DON njw   QQ:1504012979
//glut

 第一点对于静态(注意是静态)角度的测量

mpu6050的xyz轴图像:

preview

 我们可以这样理解,我们读取的寄存器(像ACCEL_ZOUT_H和ACCEL_ZOUT_L这些)中的值可以线性的表现出XYZ轴的加速度,在静态环境下,mpu6050只受到重力加速度的作用,且方向垂直向下,当mpu6050沿着某一个方向旋转时(我们以沿着X轴旋转为例),此时的重力加速度可以被分解成Z轴和Y轴的分量,我们在利用寄存器读取的值对应加速度的线性关系,可以算得该旋转角的tan值,通过调用atan2函数(反正切)可以算得此时对应的角度。(具体程序和计算公式,代码段有详细注释)

第二点对于温度的测量

对于温度的测量,第一步我们首先要做的就是通过iic协议读取TEMP_OUT_H和TEMP_OUT_L值(对于iic协议的应用和理解,建议大家查找和阅读一下网上的iic协议基本原理),读取完毕之后,利用移位或运算(具体过程我在代码段有详细注释)得到了TEMP_OUT值,利用公式temp=36.53+((double)raw)/340(raw就是TEMP_OUT值)计算出温度,这个公式是我在网上找的,具体原理不得而知(博主还是比较菜的)。

对于发csdn的初衷:

       第一点是我觉得现在网上大多数的知识资源和素材杂而乱,不能够有效快速的查找到自己想要的知识,往往是查资料两小时,学习五分钟。我不希望往后的学者们浪费太多的时间在查找资料上,从而严重影响他们对于学习的耐心和信心。

       第二点是通过写博客,把我会的东西展示给大家,在写的过程中我也可以发现很多自己的许多问题,为了给大家展示较为全面和严谨的结果,我也会去查许多资料,从而可以加深自己对于知识理解的深度和广度。

       如果有读者发现文章中的结论和代码有歧义或者是描述有任何问题的,欢迎指正。

具体联系方式放在代码段。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值