基于stm32的mpu6050传感器实验

您所在的位置:网站首页 mpu6050采样率怎么改 基于stm32的mpu6050传感器实验

基于stm32的mpu6050传感器实验

2023-07-13 21:31| 来源: 网络整理| 查看: 265

@TOCMPU6050+STM32学习笔记

学习了差不多两天的mpu6050,参考了很多篇博客还有看一些资料,今晚终于把这个东西在我的串口显示出来了,下面就废话不多说,开始我的笔记啦。 开发环境:uv5 实验注意点: 1.mpu6050是采用的I2C通信,所以我们需要将BOOT1和BOOT0置于0**才可正常通信,不可使用SPI模式进行,否则不可正常显示。实验mpu6050采用的是5v的供电电压,采用3.3v其实也可以。 2.实验下载采用的是串口1,而实验所测得的数据是采用的串口2通信。注意区分。

实验所需器材:STM32最小系统版、CH340下载器、MPU6050六轴传感器、杜邦线、USB接口

在这里插入图片MPU描述MPU6050图片 STM32最小系统板

CH340 实验接线: STM32 CH340(2个) MPU6050 | PA2 | RX | |PA3–|- TX -| |PA15 | | AD0 |PA9 | RX | |-PA10-|- TX -| | PB10 | | SCL |PB11 | | SDA

总体连接图

代码简介:

int main(void) { u8 t=0,report=1; //默认开启上报 u8 key; float pitch,roll,yaw; //欧拉角 short aacx,aacy,aacz; //加速度传感器原始数据 short gyrox,gyroy,gyroz; //陀螺仪原始数据 short temp; //温度 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(500000); //串口初始化为500000 delay_init(); //延时初始化 MPU_Init(); //初始化MPU6050 USART2_Init(115200); while(mpu_dmp_init()) { delay_ms(200); } while(1) { if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0) { temp=MPU_Get_Temperature(); //得到温度值 MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据 MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据 if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据 if(report){ u2_printf("ax:%d ,ay:%d ,az:%d ,gx:%d ,gy:%d ,gz:%d ,翻滚角度:%d ,俯仰角度:%d ,航向角度:%d \n" ,\ aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10)); } delay_ms(2000); } } }

以上是我的main函数,主要是输出加速度和陀螺仪所测得的空间xyz轴数据,和根据这几个数据进行一些算法的转换而形成的 //roll:翻滚角.单位0.01度。 -18000 -> 18000 对应 -180.00 -> 180.00度 //pitch:俯仰角.单位 0.01度。-9000 - 9000 对应 -90.00 -> 90.00 度 //yaw:航向角.单位为0.1度 0 -> 3600 对应 0 -> 360.0度 这三个角度。 角度概念和具体的寄存器解释可以参考链接(我个人觉得总结的还不错): 角度寄存器解释链接

MPU6050初始化设置:

//初始化MPU6050 //返回值:0,成功 // 其他,错误代码 //PA15 ADO控制脚 u8 MPU_Init(void) { u8 res; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//先使能外设IO PORTA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; // 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁止JTAG,从而PA15可以做普通IO使用,否则PA15不能做普通IO!!! MPU_AD0_CTRL=0; //控制MPU6050的AD0脚为低电平,从机地址为:0X68 MPU_IIC_Init();//初始化IIC总线 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //复位MPU6050 delay_ms(100); MPU_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 MPU_Write_Byte(MPU_INT_EN_REG,0X00); //关闭所有中断 MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C主模式关闭 MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //关闭FIFO MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT引脚低电平有效 res=MPU_Read_Byte(MPU_DEVICE_ID_REG); if(res==MPU_ADDR)//器件ID正确 { MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); //设置CLKSEL,PLL X轴为参考 MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //加速度与陀螺仪都工作 MPU_Set_Rate(50); //设置采样率为50Hz }else return 1; return 0; }

MPU6050 I2C读写设置:

//IIC连续写 //addr:器件地址 //reg:寄存器地址 //len:写入长度 //buf:数据区 //返回值:0,正常 // 其他,错误代码 u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf) { u8 i; MPU_IIC_Start(); MPU_IIC_Send_Byte((addr


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3