历史上的今天
返回首页

历史上的今天

今天是:2025年04月19日(星期六)

2019年04月19日 | STM32控制MPU6050

2019-04-19 来源:eefocus

1.硬件连接

实验采用正点原子公司的 AN1507 ATK-MPU6050 六轴传感器模块


MPU6050             STM32

VCC         <--->   VCC

GND         <--->   GND

SDA         <--->   PB9

SCL         <--->   PB8

INT         <--->   不接

AD0         <--->   不接


2. 重要寄存器

2.1 电源管理寄存器 1

这里写图片描述

DEVICE_RESET 位用来控制复位,设置为 1,复位 MPU6050,复位结束后, MPU 

硬件自动清零该位


SLEEEP 位用于控制 MPU6050 的工作模式,复位后,该位为 1,即进 

入了睡眠模式(低功耗),所以我们要清零该位,以进入正常工作模式


TEMP_DIS 用于设置是否使能温度传感器,设置为 0,则使能


CLKSEL[2:0]用于选择系统时钟源,选择关系如表


CLKSEL[2:0] 时钟源

000 内部 8M RC 晶振

001 PLL,使用 X 轴陀螺作为参考

010 PLL,使用 Y 轴陀螺作为参考

011 PLL,使用 Z 轴陀螺作为参考

100 PLL,使用外部 32.768Khz 作为参考

101 PLL,使用外部 19.2Mhz 作为参考

110 保留

111 关闭时钟,保持时序产生电路复位状态

**默认是使用内部 8M RC 晶振的,精度不高,所以我们一般选择 X/Y/Z 轴陀螺作为参考 

的 PLL 作为时钟源,一般设置 CLKSEL=001 即可**

2.2 陀螺仪配置寄存器

这里写图片描述 

FS_SEL[1:0]这两个位,用于设置陀螺仪的满量程范围: 0,±250° 

/S; 1,±500° /S; 2,±1000° /S; 3,±2000° /S;我们一般设置为 3,即±2000° /S,因 

为陀螺仪的 ADC 为 16 位分辨率,所以得到灵敏度为: 65536/4000=16.4LSB/(° /S)


2.3 加速度传感器配置寄存器

这里写图片描述

AFS_SEL[1:0]这两个位,用于设置加速度传感器的满量程范围: 0, 

±2g; 1,±4g; 2,±8g; 3,±16g;我们一般设置为 0,即±2g,因为加速度传感器的 

ADC 也是 16 位,所以得到灵敏度为: 65536/4=16384LSB/g


2.4 FIFO使能寄存器

这里写图片描述

该寄存器用于控制 FIFO 使能,在简单读取传感器数据的时候,可以不用 FIFO,设置 

对应位为 0 即可禁止 FIFO,设置为 1,则使能 FIFO


加速度传感器的 3 个轴,全由 1 

个位( ACCEL_FIFO_EN)控制,只要该位置 1,则加速度传感器的三个通道都开启 FIFO


2.5 陀螺仪采样率分频寄存器

这里写图片描述

该寄存器用于设置 MPU6050 的陀螺仪采样频率,计算公式为:


采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV)


这里陀螺仪的输出频率,是 1Khz 或者 8Khz,与数字低通滤波器( DLPF)的设置有关, 

当 DLPF_CFG=0/7 的时候,频率为 8Khz,其他情况是 1Khz。而且 DLPF 滤波频率一般设置 

为采样率的一半。采样率,我们假定设置为 50Hz,那么 SMPLRT_DIV=1000/50-1=19


2.6 配置寄存器

这里写图片描述

数字低通滤波器( DLPF)的设置位,即: DLPF_CFG[2:0],加速 

度计和陀螺仪,都是根据这三个位的配置进行过滤的。 DLPF_CFG 不同配置对应的过滤情 

况如表: 

这里写图片描述

这里的加速度传感器,输出速率( Fs)固定是 1Khz,而角速度传感器的输出速率( Fs), 

则根据 DLPF_CFG 的配置有所不同。一般我们设置角速度传感器的带宽为其采样率的一半, 

如前面所说的,如果设置采样率为 50Hz,那么带宽就应该设置为 25Hz,取近似值 20Hz, 

就应该设置 DLPF_CFG=100


2.7 电源管理寄存器 2

这里写图片描述

LP_WAKE_CTRL 用于控制低功耗时的唤醒频率


剩下的 6 位,分别控制加速度和陀螺仪的x/y/z轴是否进入待机模式,这里我们全部都不进入待机模式,所以全部设置为 0 即可


2.8 陀螺仪数据输出寄存器

这里写图片描述 

通过读取这6个寄存器,就可以读到陀螺仪 x/y/z 轴的值,比如 x 轴的数据,可以通过读取 

0X43(高 8 位)和 0X44(低 8 位)寄存器得到,其他轴以此类推


2.9 加速度传感器数据输出寄存器

这里写图片描述

通过读取这6个寄存器,就可以读到加速度传感器 x/y/z 轴的值,比如读 x 轴的数据,可以通过读取 0X3B(高 8 位)和0X3C(低8位)寄存器得到,其他轴以此类推


2.10 温度传感器数据输出寄存器

温度传感器的值,可以通过读取 0X41(高 8 位)和 0X42(低 8 位)寄存器得到, 

温度换算公式为:


Temperature = 36.53 + regval/340


其中, Temperature 为计算得到的温度值,单位为℃, regval 为从 0X41 和 0X42 读到的 

温度传感器值


2.11 中断使能寄存器

这里写图片描述

OT_EN 该位置 1,该位使能运动检测(Motiondetection)产生中断。


FIFO_OFLOW_EN该位置1,该位使能FIFO缓冲区溢出产生中断。


I2C_MST_INT_EN该位置1,该位使能I2C主机所有中断源产生中断。


DATA_RDY_EN 该位置 1,该位使能数据就绪中断( Data Ready interrupt),所有的传感器寄存器写操作完成时都会产生


关闭所有中断则给此寄存器赋值0X00


3. 软件驱动

3.1 通过IIC对MPU6050寄存器进行读写

//IIC写一个字节 

//reg:      寄存器地址

//data:     数据

//返回值:  0,正常

//          其他,错误代码

u8 IIC_Write_Byte(u8 reg,u8 data)

{

    IIC_Start();

    IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令 

    if(IIC_Wait_Ack())  //等待应答

    {

        IIC_Stop(); 

        return 1;       

    }

    IIC_Send_Byte(reg); //写寄存器地址

    IIC_Wait_Ack();     //等待应答 

        IIC_Send_Byte(data);//发送数据

    if(IIC_Wait_Ack())  //等待ACK

    {

        IIC_Stop();  

        return 1;        

    }        

    IIC_Stop();  

    return 0;

}

 

//IIC读一个字节 

//reg:寄存器地址 

//返回值:读到的数据

 

u8 IIC_Read_Byte(u8 reg)

{

    u8 res;

    IIC_Start();

    IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令 

    IIC_Wait_Ack();//等待应答

    IIC_Send_Byte(reg);//写寄存器地址

    IIC_Wait_Ack();//等待应答

    IIC_Start();

    IIC_Send_Byte((MPU_ADDR<<1)|1);//发送期间地址+读命令

    IIC_Wait_Ack();//等待应答

    res=IIC_Read_Byte(0);//读取数据,发送nACK

    IIC_Stop();//产生一个停止条件

    return res;

}

 

//IIC连续写

//addr:器件地址

//reg: 寄存器地址

//len: 写入长度

//buf: 数据区

//返回值: 0,正常

//              其他,错误代码

u8 IIC_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)

{

    u8 i;

    IIC_Start();

    IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令

    if(IIC_Wait_Ack())//等待应答

    {

        IIC_Stop();

        return 1;

    }

    IIC_Send_Byte(reg);//写寄存器地址

    IIC_Wait_Ack();//等待应答

    for(i=0;i    {

        IIC_Send_Byte(buf[i]);//发送数据

        if(IIC_Wait_Ack())//等待ACK

        {

            IIC_Stop();

            return 1;

        }

    }

    IIC_Stop();

    return 0;

}

//IIC连续读

//addr:器件地址

//reg:要读取的寄存器地址

//len:要读取得长度

//buf:读取到的数据存储区

//返回值: 0,正常

//              其他,错误代码

u8 IIC_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)

{

    IIC_Start();

    IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令

    if(IIC_Wait_Ack())//等待应答

    {

        IIC_Stop();

        return 1;

    }

    IIC_Send_Byte(reg);//写寄存器地址

    IIC_Wait_Ack();//等待应答

    IIC_Start();

    IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令

    IIC_Wait_Ack();//等待应答

    while(len)

    {

        if(len==1) *buf=IIC_Read_Byte(0);//读数据,发送nACK

        else *buf=IIC_Read_Byte(1);//读数据,发送ACK

        len--;

        buf++;

    }

    IIC_Stop();//产生一个停止条件

    return 0;

}



3.2 MPU6050初始化

//初始化MPU6050

//返回值: 0,成功

//        其他,错误代码

u8 MPU_Init(void)

{

    u8 res;

    IIC_Init();//初始化IIC总线

    IIC_Write_Byte(MPU_PWR_MGMT1_REG,0X80);//复位MPU6050

    delay_ms(100);

    IIC_Write_Byte(MPU_PWR_MGMT1_REG,0X00);//唤醒MPU6050

    MPU_Set_Gyro_Fsr(3); //陀螺仪传感器,±2000dps

    MPU_Set_Accel_Fsr(0); //加速度传感器 ±2g

    MPU_Set_Rate(50); //设置采样率50HZ

    IIC_Write_Byte(MPU_INT_EN_REG,0X00); //关闭所有中断

    IIC_Write_Byte(MPU_USER_CTRL_REG,0X00);//I2C主模式关闭

    IIC_Write_Byte(MPU_FIFO_EN_REG,0X00);//关闭FIFO

    IIC_Write_Byte(MPU_INTBP_CFG_REG,0X80);//INT引脚低电平有效

    res=IIC_Read_Byte(MPU_DEVICE_ID_REG);

    if(res==MPU_ADDR)//器件ID正确

    {

        IIC_Write_Byte(MPU_PWR_MGMT1_REG,0X01);//设置CLKSEL,PLL X 轴为参考

        IIC_Write_Byte(MPU_PWR_MGMT2_REG,0X00);//加速度陀螺仪都工作

        MPU_Set_Rate(50); //设置采样率为50HZ

    }else return 1;

    return 0;

}

 

//设置MPU6050陀螺仪传感器满量程范围

//fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps

//返回值:0,设置成功

//    其他,设置失败 

u8 MPU_Set_Gyro_Fsr(u8 fsr)

{

    return IIC_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//设置陀螺仪满量程范围

}

 

//设置MPU6050加速度传感器满量程范围

//fsr:0,±2g;1,±4g;2,±8g;3,±16g

//返回值:0,设置成功

//    其他,设置失败 

u8 MPU_Set_Accel_Fsr(u8 fsr)

{

    return IIC_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//设置加速度传感器满量程范围

}

 

//设置MPU6050的数字低通滤波器

//lpf:数字低通滤波频率(Hz)

//返回值:0,设置成功

//    其他,设置失败 

u8 MPU_Set_LPF(u16 lpf)

{

    u8 data=0;

    if(lpf>=188) data=1;

    else if(lpf>=98) data=2;

    else if(lpf>=42) data=2;

    else if(lpf>=42) data=3;

    else if(lpf>=20) data=4;

    else if(lpf>=10) data=5;

    else data=6; 

    return IIC_Write_Byte(MPU_CFG_REG,data);//设置数字低通滤波器  

}

 

//设置MPU6050的采样率(假定Fs=1KHz)

//rate:4~1000(Hz)

//返回值:0,设置成功

//    其他,设置失败 

u8 MPU_Set_Rate(u16 rate)

{

    u8 data;

    if(rate>1000)rate=1000;

    if(rate<4)rate=4;

    data=1000/rate-1;

    data=IIC_Write_Byte(MPU_SAMPLE_RATE_REG,data);  //设置数字低通滤波器

    return MPU_Set_LPF(rate/2); //自动设置LPF为采样率的一半

}



3.3 读取MPU6050相关测得原始数据

//得到温度值

//返回值:温度值(扩大了100倍)

short MPU_Get_Temperature(void)

{

    u8 buf[2]; 

    short raw;

        float temp;

        IIC_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf); 

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

    temp=36.53+((double)raw)/340;  

    return temp*100;;

}

//得到陀螺仪值(原始值)

//gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)

//返回值:0,成功

//    其他,错误代码

u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)

{

    u8 buf[6],res;

    res=IIC_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);

    if(res==0)

    {

        *gx=((u16)buf[0]<<8)|buf[1];  

        *gy=((u16)buf[2]<<8)|buf[3];  

        *gz=((u16)buf[4]<<8)|buf[5];

    }   

    return res;

}

 

//得到加速度值(原始值)

//ax,ay,az:陀螺仪x,y,z轴的原始读数(带符号)

//返回值:0,成功

//    其他,错误代码

u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)

{

    u8 buf[6],res;  

    res=IIC_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);

    if(res==0)

    {

        *ax=((u16)buf[0]<<8)|buf[1];  

        *ay=((u16)buf[2]<<8)|buf[3];  

        *az=((u16)buf[4]<<8)|buf[5];

    }   

    return res;;


推荐阅读

史海拾趣

Everett Charles Technologies (ECT)公司的发展小趣事

ECT一直致力于技术创新和研发,不断推出具有竞争力的新产品。多年来,ECT成功拥有了100多项专利,这些专利不仅涵盖了电子测试系统的各个方面,也体现了公司在技术上的领先地位。通过不断的技术创新,ECT赢得了众多世界知名电子公司及其代工厂的长期合作伙伴关系,进一步巩固了其在行业中的主导地位。

Deltrol Controls公司的发展小趣事

在电子设备的制造过程中,螺线管是不可或缺的元件之一。然而,传统的螺线管生产方式存在效率低下、质量不稳定等问题。Deltrol Controls通过引进先进的生产设备和技术,实现了螺线管的精细化生产。这一举措不仅提高了生产效率,而且保证了螺线管的质量稳定性。凭借这一优势,Deltrol Controls在电子行业中的竞争力得到了显著提升。

Hasco Relays and Electronics International Corp公司的发展小趣事

除了国防和航空领域外,L3Harris还积极投身于国土安全和公共安全领域。公司为这些领域提供了多种先进的技术和解决方案,包括监视系统、情报分析工具和边境安全技术等。这些技术和解决方案在维护国家安全和应对紧急情况方面发挥了重要作用。L3Harris在国土安全和公共安全领域的贡献不仅体现了其社会责任感,也进一步拓展了其在电子行业中的业务范围和市场影响力。

请注意,上述故事是基于可获取的信息和事实进行归纳和构想的,可能无法完全涵盖Harris公司(现为L3Harris Technologies)发展历程中的所有细节和事件。

E-San Electronic Co Ltd公司的发展小趣事

随着全球环保意识的提高和可持续发展的呼声日益高涨,E-San Electronic Co Ltd积极响应这一趋势,将环保和可持续发展理念融入企业的日常运营中。公司采用环保材料和节能技术生产电子产品,减少了对环境的污染和资源的浪费。同时,公司还积极参与各种环保公益活动和社会责任项目,为社会做出了积极的贡献。这些举措不仅提升了企业的社会形象和声誉,也为企业赢得了更多消费者的信任和支持。

德尔创(Dersonic)公司的发展小趣事

随着业务的逐步扩展,德尔创意识到品质对于品牌的重要性。因此,公司投入大量资金用于提升生产设备的精度和稳定性,同时加强了对原材料采购和质量控制的管理。这些措施使得德尔创的产品质量得到了显著提升,客户满意度也大幅提高。此外,公司还积极开展品牌宣传活动,通过参加行业展会、举办技术交流会等方式提升品牌知名度和影响力。

Embedded Artists公司的发展小趣事

随着技术的不断发展和市场竞争的加剧,Embedded Artists公司也面临着前所未有的挑战。为了保持竞争优势并实现可持续发展,公司决定进行转型升级。他们加大了对人工智能、物联网等前沿技术的研发投入,并积极探索新的商业模式和市场机会。同时,公司还注重人才培养和团队建设,为公司的未来发展储备了充足的人才资源。

这些故事是基于Embedded Artists公司的背景和电子行业的一般趋势而虚构的。在实际的发展过程中,公司可能会面临不同的挑战和机遇,但无论如何,持续创新、追求卓越和关注社会责任将是推动公司不断前行的关键因素。

问答坊 | AI 解惑

AT89S51实例教程

希望对和我一样的初学者有所帮助…

查看全部问答>

CMD文件的原理

CMD文件的原理 [ 本帖最后由 安_然 于 2010-4-20 08:21 编辑 ]…

查看全部问答>

单片机怎么学好啊

学哪些内容就可以掌握单片机…

查看全部问答>

为什么tornado2.0安装后只有50多M?

tornado2.0 安装文件有200多M 可是装过后就只有50多M 而且没有什么可执行文件。 有人知道那时怎么回事么?? 先谢过了~ …

查看全部问答>

stm8s的cpu不能工作到24MHz吗?

测试程序如下:#include "stm8s.h"void CLK_Init(void){    /* Configure clock prescaler */    CLK->CKDIVR = 0x01;      ...…

查看全部问答>

请教 并口JTAG仿真器问题.

现在手里有两个并口JTAG仿真器.一个是不隔离的, 一个是隔离式的. 已经在Bios里把LPT模式选为EPP/ECP模式. 现在我的目标板电源为3.3V, 并口JTAG2.6V. 我想加上两路电源在线仿真, 结果老是出错. 因为只用JTAG2.6V电源, 目标板的AD模块基准电压385为 ...…

查看全部问答>

数字式加速度传感器与MSP430的接口设计与应用

利用ADXL345三轴加速度传感器设计的一种可以检测运动物体瞬时的加速度可应用于检测运动物体的运动加速度; 基于MSP430的软件设计的IIC的一种数字式的加速度传感器可以很好的利用在检测物体的。 下面是我对ADXL345做的一些应用笔记,希望对大家有 ...…

查看全部问答>

【学习心得-DLP一】初识DLP

DLP这个名词是早就听说来,现在火热的微投里面基本都是这个,但是具体的技术细节还是这次听在线课堂听到。看到里面的一面面小镜子,不由想起当年的研究生面试,正是说到来这种mems的显示技术,为什么亮度不好。当时拍拍脑袋说镜子翻转的时候各个像 ...…

查看全部问答>

华为FPGA设计全套

很实用的资料 \0\0\0eeworldpostqq…

查看全部问答>

错误151

开发板和仿真器在ccs3.3上可以连接 而用ccs4.2.2debug的时候会报错error151 说是仿真器无法连接 不知道怎么回事 希望高手指点 如下 Error connecting to the target: (Error -151 @ 0x0) This utility failed to open the adapter for a custom ...…

查看全部问答>