网站建设288网站介绍模板

当前位置: 首页 > news >正文

网站建设288,网站介绍模板,南京注册公司多少钱,软装公司网站建设简介前言一、MPU6050简介MPU6050是一款性价比很高的陀螺仪#xff0c;可以读取X Y Z 三轴角度#xff0c;X Y Z 三轴加速度#xff0c;还有内置的温度传感器#xff0c;在姿态解析方面应用非常广泛。下面是它在淘宝上的参数图产品尺寸产品参数产品原理图#xff1a;二、硬…简介前言一、MPU6050简介MPU6050是一款性价比很高的陀螺仪可以读取X Y Z 三轴角度X Y Z 三轴加速度还有内置的温度传感器在姿态解析方面应用非常广泛。下面是它在淘宝上的参数图产品尺寸产品参数产品原理图二、硬件连接由于采用IIC通信最基本的只需要采用四根线就可以了。分别VCC,GND,SCL,SDA连接到单片机 SCL—–PB6 SDA—–PB7GND—–GND VCC接3V或者5V都行。三、工作原理MPU6050内部整合了三轴MEMS陀螺仪、三轴MEMS加速度计以及一个可扩展的数字运动处理器DMP(Digital Motion Processor)而且还可以连接一个第三方数字传感器(如磁力计)这样的话就可以通过IIC接口输出一个9轴信号(链接第三方数字传感器才可以输出九轴信号否则只有六轴信号)。更加方便的是有了DMP可以结合InvenSense公司提供的运动处理资料库实现姿态解算。通过自带的DMP可以通过IIC接口输出9轴融合演算的数据大大降低了运动处理运算对操作系统的负荷同时也降低了开发难度。其实简单一句话说陀螺仪就是测角速度的加速度传感器就是测角加速度的二者数据通过算法就可以得到PITCH、YAW、ROLL角了。特点 以数字形式输出 6 轴或 9 轴需外接磁传感器的旋转矩阵、四元数(quaternion)、欧拉角格式(Euler Angle forma)的融合演算数据需 DMP 支持 具有 131 LSBs/° /sec 敏感度与全格感测范围为±250、±500、±1000 与±2000° /sec的 3 轴角速度感测器(陀螺仪) 集成可程序控制范围为±2g、±4g、±8g 和±16g 的 3 轴加速度传感器 移除加速器与陀螺仪轴间敏感度降低设定给予的影响与感测器的飘移 自带数字运动处理(DMP: Digital Motion Processing)引擎可减少 MCU 复杂的融合演算数据、感测器同步化、姿势感应等的负荷 内建运作时间偏差与磁力感测器校正演算技术免除了客户须另外进行校正的需求 自带一个数字温度传感器 带数字输入同步引脚(Sync pin)支持视频电子影相稳定技术与 GPS 可程序控制的中断(interrupt)支持姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、 high-G 中断、零动作感应、触击感应、摇动感应功能 VDD 供电电压为 2.5V±5%、 3.0V±5%、 3.3V±5% VLOGIC 可低至 1.8V± 5% 陀螺仪工作电流 5mA陀螺仪待机电流 5uA 加速器工作电流500uA加速器省电模式电流 40uA10Hz 自带 1024 字节 FIFO有助于降低系统功耗 高达 400Khz 的 IIC 通信接口 超小封装尺寸 4x4x0.9mmQFNMPU6050三轴角(姿态角)绕向即为正方向可根据右手螺旋定则确定方向。MPU6050框图在这里插入图片描述可以很清晰地观察到MPU6050芯片中内置了三轴加速度传感器、三轴陀螺仪和一个温度传感器。右侧INT为中断输出脚TCS为片选脚、AD0为设置地址脚、SCL和SDA为主IIC接口、AUX_CL和AUX_DA为从IIC接口主要用到的是AD0、SCL、SDA。可以很清晰地观察到MPU6050芯片中内置了三轴加速度传感器、三轴陀螺仪和一个温度传感器。右侧INT为中断输出脚TCS为片选脚、AD0为设置地址脚、SCL和SDA为主IIC接口、AUX_CL和AUX_DA为从IIC接口主要用到的是AD0、SCL、SDA。 相关寄存器这部分就比较多了不想看的也可以直接跳过一样可以使用想深入了解的朋友可以看一下。1、电源管理寄存器DEVICE_RESE1复位MPU6050复位完成后自动清零。SLEEP1进入睡眠模式SLEEP0正常工作模式。TEMP_DIS用于设置是否使能温度传感器设置为0则使能CLKSEL[2:0]用于选择系统时钟源如下所示总之电源管理寄存器就是复位MPU6050该寄存器的LP_WAKE_CTRL用于控制低功耗时的唤醒频率用不到。剩下的6位分别控制加速度和陀螺仪的x/y/z轴是否进入待机模式这里我们全部都不进入待机模式所以全部设置为0 即可。总之电源管理寄存器2就是用于设置加速度传感器和陀螺仪的X/Y/Z轴是进入休眠还是正常工作。2、陀螺仪配置寄存器该寄存器我们只关心FS_SEL[1:0]这两个位用于设置陀螺仪的满量程范围0±250°/s1±500°/s2±1000°/s3±2000°/s我们一般设置为3即±2000°/S因为陀螺仪的ADC为16位分辨率所以得到灵敏度为65536/400016.4LSB/(°/S)。总之陀螺仪配置寄存器就是配置陀螺仪满量程范围设置最大3、加速度配置寄存器该寄存器我们只关心AFS_SEL[1:0]这两个位用于设置加速度传感器的满量程范围0±2g1±4g2±8g3±16g我们一般设置为0即±2g因为加速度传感器的ADC也是16位所以得到灵敏度为65536/416384LSB/g。总之加速度传感器配置寄存器就是配置加速度传感器满量程范围不宜过大4、FIFO使能寄存器该寄存器用于控制FIFO使能在简单读取传感器数据的时候可以不用FIFO设置对应位为0即可禁止FIFO设置为1则使能FIFO。加速度传感器的三个轴全由一个位(ACCEL_FIFO_EN)控制只要该位为1则加速度传感器三个通道都开启FIFO但是陀螺仪传感器的三个轴需要一个一个设置即XYZ轴分别配置。总之FIFO使能寄存器用于控制使能FIFO(First Input First Output)5、陀螺仪采样率分频寄存器该寄存器用于设置MPU6050的陀螺仪采样频率计算公式为采样频率 陀螺仪输出频率 / (1SMPLRT_DIV)。这里陀螺仪的输出频率是1Khz或者8Khz与数字低通滤波器DLPF的设置有关当DLPF_CFG0或7的时候频率为8Khz其他情况是1Khz。而且DLPF滤波频率一般设置为采样率的一半。采样率我们假定设置为50Hz那么SMPLRT_DIV1000/50-119。总之陀螺仪采样率分频寄存器就是用于设置陀螺仪的采样频率如果采样频率为50Hz那么采样周期就为1/5020ms即20ms采集一次陀螺仪的数据。6、配置寄存器总之配置寄存器就是设置数字低通滤波器的DLPF_CFG位来结合陀螺仪采样分频寄存器来共同设置采样周期。7、陀螺仪数据输出寄存器陀螺仪数据输出寄存器总共由6个寄存器组成输出X/Y/Z三个轴的陀螺仪传感器数据高字节在前低字节在后。总之陀螺仪数据输出寄存器就是把陀螺仪测量到的数据输出出来。8、加速度传感器数据输出寄存器加速度传感器数据输出寄存器总共由6个寄存器组成输出X/Y/Z三个轴的加速度传感器值高字节在前低字节在后。总之加速度传感器数据输出寄存器就是把加速度传感器测量到的数据输出出来。9、温度传感器数据输出寄存器通过读取0X41高8位和0X42低8位寄存器得到温度换算公式为Temperature 36.53 regval/340。其中Temperature为计算得到的温度值单位为℃regval为从0X41和0X42读到的温度传感器值。总之温度传感器数据输出寄存器就是把温度寄存器测量到的数据处处出来。工程创建总配置如下1 高速时钟选择外部8Mhz的晶振2 开启debug调试功能3 时钟树4 打开串口设置5 并且使能串口中断6 打开IIC设置7 打开IIC中断代码讲解代码重点是讲解我们的dmp库的移植一、首先我们要先去移植DMP的几个文件这几个文件网上都可以找了但是为了方便你们我也就放在这里了。 https://download.csdn.net/download/DOF526570/87588566里面打开是这样的一个文件把里面的.c和.h文件分别放在对应的Src和Inc里面就好了然后去工程里面记得添加一下文件就好了也不用去添加路径了。接下来讲解一下主函数的示例代码首先是我们的日常重写一下我们的串口打印函数/*** 函数功能: 重定向c库函数printf到DEBUG_USARTx* 输入参数: 无* 返 回 值: 无* 说 明无*/ int fputc(int ch, FILE *f) {HAL_UART_Transmit(huart1, (uint8_t )ch, 1, 0xffff);return ch; }/** 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx* 输入参数: 无* 返 回 值: 无* 说 明无*/ int fgetc(FILE f) {uint8_t ch 0;HAL_UART_Receive(huart1, ch, 1, 0xffff);return ch; }然后添加变量来获取mpu6050返回的信息float pitch,roll,yaw; //欧拉角 short aacx,aacy,aacz; //加速度传感器原始数据 short gyrox,gyroy,gyroz; //陀螺仪原始数据 short temp; //温度接下来是初始化一下我们的MPU6050还有dmp库 while(MPU_Init()); //初始化MPU6050printf(%s\r\n,Mpu6050 Init ok!);while(mpu_dmp_init()){HAL_Delay(200);printf(%s\r\n,Mpu6050 Init Wrong!);}printf(%s\r\n,Mpu6050 Init OK!);最后在我们主函数的while里面打印出来获取的数量这里为了我们方便看到变化我就延时就了一点 while (1){/ USER CODE END WHILE /if(mpu_dmp_get_data(pitch,roll,yaw)0){tempMPU_Get_Temperature(); //得到温度值MPU_Get_Accelerometer(aacx,aacy,aacz); //得到加速度传感器数据MPU_Get_Gyroscope(gyrox,gyroy,gyroz); //得到陀螺仪数据printf(三轴角度%f-%f-%f\r\n,pitch,roll,yaw);printf(三轴加速度%d-%d-%d\r\n,aacx,aacy,aacz);printf(三轴角角度%d-%d-%d\r\n,gyrox,gyroy,gyroz);}HAL_Delay(1000);/ USER CODE BEGIN 3 */}到这里就基本搞定了。串口助手显示如下