基于CW32系列MCU的MPU6050姿态传感器设计

一、简介
1. mpu6050是一种常用的六轴姿态传感器模块,结合了三轴陀螺仪和三轴加速度计,以及一个可扩展的数字运动处理器dmp(digital motion processor),可用i2c接口连接一个第三方的数字传感器,比如磁力计。mpu6050 对陀螺仪和加速度计分别用了三个16 位的adc(0~65535),将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±500,±1000,±2000°/秒(dps),加速度计可测范围为±2,±4,±8,±16g。并有可编程的低通滤波器。mpu6050模块的应用场景非常广泛,包括但不限于以下几个领域:
(1)姿态感知与控制:通过读取陀螺仪和加速度计的数据,可以实时获取物体的姿态信息,如倾斜角度、旋转角度等。这在飞行器、机器人、无人车等项目中非常常见,用于实现姿态感知和控制。
(2)运动跟踪与手势识别:mpu6050可以用于捕捉人体运动轨迹,如手部的姿态和手势,从而实现运动跟踪、手势识别、虚拟现实交互等应用。
(3)震动检测与防抖:结合加速度计,mpu6050可以检测到物体的震动和冲击,用于防抖技术、硬盘保护、运动检测等。
(4)步态分析与健康监测:mpu6050可以用于分析人体的步态特征和动作,用于健康监测、运动分析、姿势校正等。
    二、所需物料+寄存器说明
.本实验使用到了cw32f030c8小蓝板、gy-521模块、0.96寸oled显示屏keil5开发环境
cw32f030c8小蓝板
gy-521模块
实物展示
【gy-521模块与单片机连线】:vcc+3.3v
gndgnd
sclpb5
sdapb4
【oled显示屏与单片机连线】:vcc+3.3v
gndgnd
sclpa1
sdapa2
注:scl和 sda是连接mcu的 iic接口,mcu通过这个iic 接口来控制mpu6050,另外还有一个 iic 接口: xcl和xda ,这个接口可用来连外部从设备比如磁力计,这样就可以组成一个九轴传感器。ad0是mpu6050的地址控制引脚,该引脚控制的是iic 地址的最低位。mpu6050的默认iic地址是:0x68,如果ad0接vdd,则是0x69。需要注意的是:这里的地址0x68(110 1000)和0x69(110 1001)是不包含最低位的7位数据,通常最低位用于表示iic主机的读取数据/写数据模式。如默认情况下对mpu6050进行写操作,则发送地址0xd0(1101 0000),读操作则发送地址0xd1(1101 0001)。
寄存器说明:
该寄存器是配置陀螺仪输出速率的分频器,用于为mpu-6050生成采样速率。这里有个公式:采样频率=陀螺仪输出频率/(1+采样分频数)。当 dlpf(数字低通滤波器,见寄存器configuration)禁用时,陀螺仪输出频率为8khz;当 dlpf 使能,陀螺仪输出频率=1khz。
该寄存器为陀螺仪和加速度计配置外部帧同步(fsync) 管脚的采样和数字低通滤波(dlpf)设置。其中,数字低通滤波器dlpf由dlpf_cfg配置。根据下表所示的dlpf_cfg值对加速度计和陀螺仪进行滤波。
fs为陀螺仪输出频率。smplrt_div由预设定的采样频率根据上述的公式计算得出。一般情况下,dplf滤波频率为采样频率的一半,如设定采样频率为50hz,由表可知当fs为1khz,smplrt_div的值为1000/50-1=19。
该寄存器是用来触发陀螺仪自检和配置陀螺仪的满量程范围。其中,xg_st、yg_st、zg_st分别用来设置陀螺仪x轴、y轴、z轴自检,置0则不触发自检。fs_sel[1:0]用于设置陀螺仪的满量程,如下表:
我们一般设置为3,即满量程为±2000°/s
该寄存器是用来触发加速度计自检和配置加速度计的满量程范围。同时这个寄存器也可以用于配置数字高通滤波器(dhpf)。其中,xa_st、ya_st、za_st分别用来设置加速度计x轴、y轴、z轴自检,置0则不触发自检。afs_sel[1:0]用于选择加速度计的满量程范围,如下表:
我们一般设置为0,即满量程为±2g
accel_xout :由 2部分组成的 16位数值存储最近x 轴加速度计的测量值。accel_yout :由 2部分组成的 16位数值存储最近y 轴加速度计的测量值。accel_zout :由 2部分组成的 16位数值存储最近z 轴加速度计的测量值。
以accel_xout为例,若倍率设定为2g,则意味着acc_x取最小值-32768时,当前加速度为沿x轴正方向2倍的重力加速度;若设定为4g,取-32768时表示沿x轴正方向4倍的重力加速度,以此类推。显然,倍率越低精度越好,倍率越高表示的范围越大,这要根据具体的应用来设定。以acc_x为例,若当前设定的加速度倍率为4g,那么将acc_x读数换算为加速度的公式为:
g可取当地重力加速度。
该寄存器存储最近加陀螺仪的测量值,构成与加速度计测量值寄存器相同,不做赘述。
以gyr_x为例,若倍率设定为250度/秒,则意味着gyr取正最大值32768时,当前角速度为顺时针250度/秒;若设定为500度/秒,取32768时表示当前角速度为顺时针500度/秒。显然,倍率越低精度越好,倍率越高表示的范围越大。以gyr_x为例,若当前设定的角速度倍率为1000度/秒,那么将gry_x读数换算为角速度(顺时针)的公式为:
该寄存器允许用户配置电源模式和时钟源,还提供了复位整个设备和禁用温度传感器的位。当置sleep位为1时,mpu-60x0 可以进入低功耗睡眠模式。该寄存器的最低三位用于设置系统的时钟源选择,默认值是0(内部8m rc振荡),不过一般设置为1,即选择x轴陀螺仪pll作为时钟源,以获得更高精度的时钟。device_reset该位置 1,重启内部寄存器到默认值。复位完成后该位自动清0。temp_dis该位置 1,禁用温度传感器。
  三、核心代码
main.c:#include main.h#include oled.h#include gy_521.h#include myi2c.h#include delay.htypedef struct{ int16_t ax; int16_t ay; int16_t az; }mpu6050_adata; //mpu6050加速度计三轴数据typedef struct{ int16_t gx; int16_t gy; int16_t gz; }mpu6050_gdata; //mpu6050陀螺仪三轴数据mpu6050_adata adata; //结构体变量mpu6050_gdata gdata;void gy_521_init(void) //gy-521初始化{ gy521_gpio_init(); //gpio初始化 //解除睡眠,失能温度传感器,选择x轴的陀螺仪时钟 writedata(gy521_addr, mpu6050_pwr_mgmt_1, 0x09); writedata(gy521_addr, mpu6050_config, 0x06); //低通滤波 writedata(gy521_addr, mpu6050_smprt_div, 0x09); //1khz十分频为100hz writedata(gy521_addr, mpu6050_gyro_config, 0x18);//陀螺仪最大量程 writedata(gy521_addr, mpu6050_accel_config, 0x18);//加速度计最大量程}void mpu6050_getdata() //获取mpu6050六轴数据{ uint8_t mpu6050_raw_data[14]={0}; //以mpu6050_accel_xout_h为起始地址,连续读取14字节的数据 readdata(gy521_addr,mpu6050_accel_xout_h,mpu6050_raw_data,14); //数据处理 adata.ax=(mpu6050_raw_data[0]<<8)|mpu6050_raw_data[1]; adata.ay=(mpu6050_raw_data[2]<<8)|mpu6050_raw_data[3]; adata.az=(mpu6050_raw_data[4]<<8)|mpu6050_raw_data[5]; gdata.gx=(mpu6050_raw_data[8]<<8)|mpu6050_raw_data[9]; gdata.gy=(mpu6050_raw_data[10]<<8)|mpu6050_raw_data[11]; gdata.gz=(mpu6050_raw_data[12]<<8)|mpu6050_raw_data[13];}int main(){ oled_init(); //oled初始化 gy_521_init(); //gy-521初始化 oled_showstring(1,1,a: g:);//提示:左列显示加速度计数据;右列显示陀螺仪数据 while(1) { mpu6050_getdata(); //获取六轴数据 oled_showsignednum(2,1,adata.ax,5); oled_showsignednum(3,1,adata.ay,5); oled_showsignednum(4,1,adata.az,5); oled_showsignednum(2,9,gdata.gx,5); oled_showsignednum(3,9,gdata.gy,5); oled_showsignednum(4,9,gdata.gz,5); delay_ms(100); //延时刷新 }}  
  四、效果演示
平放
向下倾斜
左倾斜向
直立
读到的原始数据还不能直接使用,要转化成四元数,欧拉角后,获得器件的姿态角才有用,而 mpu6050 自带了数字运动处理器,即 dmp,并且,invensense 提供了一个 mpu6050 的嵌入式运动驱动库,结合 mpu6050 的 dmp,可以将我们的原始数据,直接转换成四元数输出,而得到四元数之后,就可以很方便的计算出欧拉角,从而得到yaw、roll和pitch。


谷歌开源VR180格式 探索其更多可能性
专注工业产品开发的瑞米派强势来袭
南方电网发布招标公告 智能电表市场继续稳步增长
自动白平衡算法
量身定制的LVDS连接器的好处
基于CW32系列MCU的MPU6050姿态传感器设计
苹果新ipadpro配置曝光 超强性能,或成最强平板电脑
苹果公司与芯片初创公司Rivos和解谈判中
基本图像处理技术的数据增强方法介绍
华为Mate 40 Pro的内部设计到底如何呢?
在可调降压型DC-DC转换器设计中使用数字电位器
UMTS通信技术特性及技术分析
问界M9发布!余承东称1000万以内最好的SUV,正加速提升产能
静电对策和ESD对策
推荐一款集成电压控制振荡器HMC765LP6CE
海信新专利曝光 背面设计形如专业相机
新唐科技W584B031主板介绍
引入LIPO屏,苹果iPhone 15恐延至10月
香蕉派(Banana Pi)BPI-F2S ,四核Linux工业级应用的开源硬件开发板
TCLACTV100运动耳机评测 售价便宜并且性能上又不缩水