基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序

2023-05-16

基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序

目录

基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序

前言

一、实验器材

二、硬件资源

1.usb转ttl

2.串口1(波特率:9600,P2.2/P2.3)

3.MPU6050陀螺仪控制信号线

三.软件架构

四.代码

五.实验现象

六.注意事项  

总结




前言 

最近做电赛申请到了MSP432P401R板子,队友让我开发开发陀螺仪,期间遇到了一些问题,不过都解决了,所以写一篇总结记录一下ouo。不想看代码的同学直接看总结工程链接。



一、实验器材 

MSP432P401R MPU6050陀螺仪



二、硬件资源
1.usb转ttl
2.串口1(波特率:9600,P2.2/P2.3)

3.MPU6050陀螺仪控制信号线

SDA <-------------> P6.4 
 SCL <-------------> P6.5 

VCC <-------------> 3.3V   

GND <-------------> GND

三.软件架构

keil5 CCS

四.代码

//main.c 主要配置
#include  "main.h"
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "systeminit.h"
#include "motor.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
#include  "string.h"
#include "driverlib.h"
#include "delay.h"
#include "usart.h"
#include "uart_calc.h"
#include "motor.h"
//陀螺仪方向设置
static signed char gyro_orientation[9] = { 1, 0, 0,
                                           0, 1, 0,
                                           0, 0, 1};
void Wait_Connection(void)
{
    unsigned char str[8];
    sprintf((char*)str,"sw0.val=1\xff\xff\xff");
    while(keyvalue!=5)
    {
        GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN1);
        USART1PutString(str);
        delay_ms(300);
    }
    GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN1);
}
u8 mpu_dmp_init1(void)
{
	u8 res=0;
            IIC_Init(); 		//初始化IIC总线
            if(1)	//初始化MPU6050
            {	 
            res=mpu_set_sensors(INV_XYZ_GYRO|INV_XYZ_ACCEL);//设置所需要的传感器
            if(res)return 1;
            else
            {
                sprintf((char*)str,"1\r\n");
                USART1PutString(str);
                delay_ms(100);
            }
            res=mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL);//设置FIFO
            if(res)return 2;
            else
            {
                sprintf((char*)str,"2\r\n");
                USART1PutString(str);
                delay_ms(100);
            }
            res=mpu_set_sample_rate(DEFAULT_MPU_HZ);	//设置采样率
            if(res)return 3; 
            else
            {
                sprintf((char*)str,"3\r\n");
                USART1PutString(str);
                delay_ms(100);
            }
            res=dmp_load_motion_driver_firmware();		//加载dmp固件
            if(res)return 4; 
            else
            {
                sprintf((char*)str,"4\r\n");
                USART1PutString(str);
                delay_ms(100);
            }
            res=dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation));//设置陀螺仪方向
            if(res)return 5;
            else
            {
                sprintf((char*)str,"5\r\n");
                USART1PutString(str);
                delay_ms(100);
            }
            res=dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT|DMP_FEATURE_TAP|	//设置dmp功能
                DMP_FEATURE_ANDROID_ORIENT|DMP_FEATURE_SEND_RAW_ACCEL|DMP_FEATURE_SEND_CAL_GYRO|
                DMP_FEATURE_GYRO_CAL);
            if(res)return 6;
            else
            {
                sprintf((char*)str,"6\r\n");
                USART1PutString(str);
                delay_ms(100);
            }
            res=dmp_set_fifo_rate(DEFAULT_MPU_HZ);	//设置DMP输出速率(最大不超过200Hz)
            if(res)return 7;
            else
            {
                sprintf((char*)str,"7\r\n");
                USART1PutString(str);
                delay_ms(100);
            }
            res=run_self_test();		//自检
            if(res)return 8;
            else
            {
                sprintf((char*)str,"8\r\n");
                USART1PutString(str);
                delay_ms(100);
            }
            res=mpu_set_dmp_state(1);	//使能DMP
            if(res)return 9;
            else
            {
                sprintf((char*)str,"9\r\n");
                USART1PutString(str);
                delay_ms(100);
            }
            }
}
int main(void)
{
        u8 report=0;

        float pitch,roll,yaw; 		//欧拉角
		SystemClockInit(HFXT);//系统时钟初始化(系统主时钟)
		SystemClockInit(DCO);//系统时钟初始化(子系统时钟)
        Usart1tInit();
        MPU_Init();
        mpu_dmp_init(); 
        delay_ms(100);
        while(mpu_dmp_get_data(&pitch,&roll,&yaw))
        {
            sprintf((char*)str,"roll=%f,pitch=%f,yaw=%f\r\n",(roll),(pitch),(yaw));
                    USART1PutString(str);
            delay_ms(100);
        }
        while(1)
        {      
                    mpu_dmp_get_data(&pitch,&roll,&yaw);
        			sprintf((char*)str,"roll=%f,pitch=%f,yaw=%f\r\n",(roll),(pitch),(yaw));
                    USART1PutString(str);
                    delay_ms(100);
         }
}
//myiic.h主要配置
#ifndef __MYIIC_H
#define __MYIIC_H
#include "main.h" 
#include "stdio.h"
//IO方向设置
#define SDA_IN()  GPIO_setAsInputPin(GPIO_PORT_P6,GPIO_PIN4)	//SDA输入模式
#define SDA_OUT() GPIO_setAsOutputPin(GPIO_PORT_P6,GPIO_PIN4) //SDA输出模式
//IO操作函数	 
#define IIC_SCL_High()  GPIO_setOutputHighOnPin(GPIO_PORT_P6,GPIO_PIN5) //SCL_High
#define IIC_SCL_Low()   GPIO_setOutputLowOnPin(GPIO_PORT_P6,GPIO_PIN5) //SCL_Low
#define IIC_SDA_High()  GPIO_setOutputHighOnPin(GPIO_PORT_P6,GPIO_PIN4) //SDA_High
#define IIC_SDA_Low()   GPIO_setOutputLowOnPin(GPIO_PORT_P6,GPIO_PIN4) //SDA_Low
#define READ_SDA        GPIO_getInputPinValue(GPIO_PORT_P6,GPIO_PIN4)  //输入SDA 

//IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口				 
void IIC_Start(void);				//发送IIC开始信号
void IIC_Stop(void);	  			//发送IIC停止信号
void IIC_Send_Byte(u8 txd);			//IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void); 				//IIC等待ACK信号
void IIC_Ack(void);					//IIC发送ACK信号
void IIC_NAck(void);				//IIC不发送ACK信号

void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);	  
#endif
//myiic.c主要配置
#include "myiic.h"
#include "delay.h"
#include "oled.h"
#include "usart.h"
//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F407开发板
//IIC 驱动代码	   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2014/5/6
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved									  
// 	

//初始化IIC
void IIC_Init(void)
{			
    GPIO_setAsOutputPin(SCL_PORT,SCL_PIN ); //CLK         
    GPIO_setAsOutputPin(SDA_PORT,SDA_PIN);//DIN
	IIC_SCL_High();
	IIC_SDA_High();
}
//产生IIC起始信号
void IIC_Start(void)//SDA 10 SCL 010
{
	SDA_OUT();     //sda线输出
	IIC_SCL_High();
	IIC_SDA_High();
	delay_us(4);
 	IIC_SDA_Low();//START:when CLK is high,DATA change form high to low 
	delay_us(4);
	IIC_SCL_Low();//钳住I2C总线,准备发送或接收数据 
}	  
//产生IIC停止信号
void IIC_Stop(void)//SDA 01 SCL 01
{
	SDA_OUT();//sda线输出
	IIC_SCL_Low();//STOP:when CLK is high DATA change form low to high
    IIC_SDA_Low();
 	delay_us(4);
    IIC_SCL_High();
	IIC_SDA_High();//发送I2C总线结束信号
	delay_us(4);							   	
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)//
{
	u8 cy;
    SDA_IN();      //SDA设置为输入
    IIC_SCL_High();delay_us(10);
	IIC_SDA_High();delay_us(10);
    if(READ_SDA)
    {
        cy=1;
        IIC_SCL_Low();
        return cy; 
    }      
    else
    {
        cy=0;
    }             
	IIC_SCL_Low();//时钟输出0
	return cy;  
} 
//产生ACK应答
void IIC_Ack(void)
{
    IIC_SCL_Low();
	SDA_OUT();
    IIC_SDA_Low();
	delay_us(2);
    IIC_SCL_High();
    delay_us(2);
	IIC_SCL_Low();
}
//不产生ACK应答		    
void IIC_NAck(void)
{
	IIC_SCL_Low();
	SDA_OUT();
    IIC_SDA_High();
	delay_us(2);
    IIC_SCL_High();
    delay_us(2);
	IIC_SCL_Low();
}					 				     
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
	SDA_OUT(); 
    IIC_SCL_Low();//拉低时钟开始数据传输
    delay_us(2);
    for(t=0;t<8;t++)
    {       
        if(txd&0x80)
        {
            IIC_SDA_High();delay_us(2); 
        }  
        else
        {
            IIC_SDA_Low();delay_us(2);  
        }
        txd<<=1;
		IIC_SCL_High();
		delay_us(4); 
        IIC_SCL_Low();
        delay_us(2); 
    }
        delay_us(2);
    
} 	    
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
    u8 IIC_Read_Byte(unsigned char ack)
{
	unsigned char i,receive=0;
	SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
	{
		IIC_SCL_Low();
        delay_us(2);
        IIC_SCL_High();
        receive<<=1;
        if(READ_SDA)
            receive++;
        delay_us(2);
    }
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}
//mpu6050.c主要配置
#include "mpu6050.h"
#include "main.h"
#include "delay.h"
#include "usart.h"  
#include  "string.h"
#include "oled.h"
#include "stdio.h"
//初始化MPU6050
//返回值:0,成功
//    其他,错误代码
u8 MPU_Init(void)
{ 
	u8 res;
    
	IIC_Init();//初始化IIC总线
    MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);//唤醒MPU6050
    MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);//初始化MPU6050
    delay_ms(100);
    MPU_Write_Byte(MPU_SAMPLE_RATE_REG,0x07);
    MPU_Write_Byte(MPU_CFG_REG,0x06);
    MPU_Write_Byte(MPU_GYRO_CFG_REG,0x18);
    MPU_Write_Byte(MPU_ACCEL_CFG_REG,0x01);
	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(0X75);
    sprintf((char*)str,"res=%d\r\n",res);
    USART1PutString(str);
	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陀螺仪传感器满量程范围
//fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
//返回值:0,设置成功
//    其他,设置失败 
u8 MPU_Set_Gyro_Fsr(u8 fsr)
{
	return MPU_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 MPU_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=3;
	else if(lpf>=20)data=4;
	else if(lpf>=10)data=5;
	else data=6; 
	return MPU_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=MPU_Write_Byte(MPU_SAMPLE_RATE_REG,data);	//设置数字低通滤波器
 	return MPU_Set_LPF(rate/2);	//自动设置LPF为采样率的一半
}

//得到温度值
//返回值:温度值(扩大了100倍)
short MPU_Get_Temperature(void)
{
    u8 buf[2]; 
    short raw;
	float temp;
	MPU_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=MPU_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;;
}
//得到加速度值(原始值)
//gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
//返回值:0,成功
//    其他,错误代码
u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)
{
    u8 buf[6],res;  
	res=MPU_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;;
}
//IIC连续写
//addr:器件地址 
//reg:寄存器地址
//len:写入长度
//buf:数据区
//返回值:0,正常
//    其他,错误代码
u8 MPU_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<len;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 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{ 
 	IIC_Start(); 
	IIC_Send_Byte(MPU_WRITE);//发送器件地址+写命令	
	if(IIC_Wait_Ack())	//等待应答
	{
		IIC_Stop();		 
		return 1;		
	}
    IIC_Send_Byte(reg);	//写寄存器地址
    IIC_Wait_Ack();		//等待应答
    IIC_Start();
	IIC_Send_Byte(MPU_READ);//发送器件地址+读命令	
    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;	
}
//IIC写一个字节 
//reg:寄存器地址
//data:数据
//返回值:0,正常
//    其他,错误代码
u8 MPU_Write_Byte(u8 reg,u8 data) 				 
{ 
    IIC_Start(); 
	IIC_Send_Byte(MPU_WRITE);//发送器件地址+写命令	
	if(IIC_Wait_Ack())	//等待应答
	{
		IIC_Stop();	
        sprintf((char*)str,"error\r\n");
        USART1PutString(str);
        delay_ms(100);
		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 MPU_Read_Byte(u8 reg)
{
	u8 res;
    IIC_Start(); 
	IIC_Send_Byte(MPU_WRITE);//发送器件地址+写命令	
	IIC_Wait_Ack();      
    IIC_Send_Byte(reg);	//写寄存器地址
    IIC_Wait_Ack();
    IIC_Start();
	IIC_Send_Byte(MPU_READ);//发送器件地址+读命令	
    IIC_Wait_Ack(); 
	res=IIC_Read_Byte(0);//读取数据,发送nACK 
    IIC_Stop();			//产生一个停止条件 
	return res;		
}

五.实验现象

串口输出姿态角 ,PC端显示

六.注意事项
  

        1,串口波特率为9600.
        2,MPU6050供电电压为3.3V,测试发现5V的电平跳变速度不够快会对时序产生影响,供电电源越稳定影响越小
        3.使用串口1不要使能串口0







总结

代码是基于STM32F4的,移植过来之后在调试的过程中发现了F4的代码编写存在一些问题,具体表现是MSP432发送读指令0xD1给MPU6050的时候由于SDA变为高电平的时间不够导致最后接受的指令成了0XD0,所以造成了读指令失败的情况。

问题及解决办法:MSP432P401R I2C读取MPU6050的数值为0xff但是 ACK 是正常的解决办法

源码工程已经上传等待审核完成我会放上链接,需要的朋友麻烦点赞关注一下然后在评论区留下邮箱我有空就会私发(大三考研ing比较忙),实在着急要那就直接下载吧。

代码工程:(CCS)基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序.zip

代码工程:(keil5)基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序.zip

代码工程:MSP432-OLED

建议大家使用CCS版本,keil5版本测试有很多小问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序 的相关文章

  • MPU6050 6轴姿态传感器的分析与使用(一)

    一 MPU6050简介 MPU6050是一个6轴姿态传感器 xff08 3轴加速度计和3轴陀螺仪传感器 xff09 xff0c 可以测量芯片自身X Y Z轴的加速度 角度参数 xff0c 通过数据融合 xff0c 可以得到姿态角 二 简介分
  • MPU6050里面还有一个温度传感器

    MPU6050里面还有一个温度传感器 xff0c 是不是因为这个那些飞控考虑恒温 xff1f http www makeru com cn video 16190 35379 html
  • ROS-kinetic下使用MPU6050串口模块发布imu主题

    转载自 xff1a https www jianshu com p 0c9ac4180dfd ROS kinetic下使用MPU6050串口模块发布imu主题 斜月映三星 2018 12 10 16 50 36字数 125阅读 1 450
  • 正点原子mpu6050数据读取失败问题

    如果下载他们官方的程序都读不出来的话 看看你买的是stm32f407的V3版本吗 xff1f 这个版本是只有磁力计的官方代码 你用V3板跑他们的mpu的代码就会读不出来 xff0c 那个mpu6050的代码是已经停产的V2板子的
  • MPU6050介绍及姿态解算

    1 介绍 xff1a MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件 xff0c 相较于多组件方案 xff0c 免除了组合陀螺仪与加速器时之轴间差的问题 xff0c 减少了安装空间 xff08 1 x
  • MPU6050

    简介 xff1a MPU6050是InvenSense 公司的 MPU6050 作为主芯片 xff0c 能同时检测三轴加速度 三轴陀螺仪 三轴角速度 的运动数据以及温度数据 利用 MPU6050 芯片内部的 DMP 模块 xff08 Dig
  • MPU6050-扫盲

    文章部分内容转载于 https blog csdn net zmjames2000 article details 88379640 管脚名称说明VCC3 3 5V xff08 内部有稳压芯片 xff09 GND地线SCLMPU6050作为
  • MPU6050温度计算公式

    Tem为16位数据 Tem 43 12412 340 61 Tem 340 43 36 5 Tem每340对应1摄氏度 12412代表0摄氏度
  • MPU6050软件姿态解算

    我是勤劳的搬运工 转自 http blog sina com cn s blog c5a00db10102wd7d html http mini eastday com mobile 180306210610472 html 使用MPU60
  • MPU6050 +STM32F411RCT6

    今天玩了一个MPU6050模块 xff0c 在这里跟大家分享一下 xff0c 希望对大家有所帮助 我用的控制板是我自己画图打板的 xff0c 使用的MCU是STM32F411RCT6 使用的MPU6050如下图 xff0c 在某宝上买的 M
  • HAL库 MPU6050的使用

    HAL库 amp amp MPU6050 HAL库 MPU6050的使用 xff1a 今天在本教程中 xff0c 我们将使用STM32接口MPU6050 xff08 GY 521 xff09 加速度计陀螺仪 同时 xff0c 我将在PC上利
  • mpu6000、mpu6050陀螺仪加速度计互补滤波数据融合算法原理推导

    时间比较紧 xff0c 就只传照片了
  • MPU6050在ROS中应用

    arduino下读取MPU6050数据 参考 xff1a http diyhacking com arduino mpu 6050 imu sensor tutorial 硬件 arduino uno或arduino mega2560mpu
  • 模块学习(二)——MPU6050

    去年电赛备赛期间 xff0c 学的STM32标准库 xff0c 那一整个繁琐直接给我劝退了 xff0c 当时学习MPU6050时就非常痛苦 xff0c 代码也看不懂 xff0c 无非抄来抄去 xff0c 然后就是编译 xff0c 改错 xf
  • MPU6050 - 陀螺仪 - 技术总结

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • MPU6050

    1 个人总结 常用的MPU6050有八个针脚 xff0c VCC 跟GND 给模块供电 xff0c 模块通讯方式采用IIC通讯 xff0c SCL跟SDA为信号传递通道 xff0c XDA 跟 XCl是用来外接电磁传感器 xff0c 玩过M
  • MPU6050温度计算公式

    Tem为16位数据 Tem 43 12412 340 61 Tem 340 43 36 5 Tem每340对应1摄氏度 12412代表0摄氏度
  • THWATCH-01 陀螺仪 MPU6050 HAL库 正点原子 STM32驱动 计步

    THWATCH 01 陀螺仪 MPU6050 HAL库 正点原子 STM32驱动 计步 一级目录 二级目录 三级目录 一 cubemx配置 1 使用cubemx配置串口 2 配置IIC1 3 配置时钟和SWDIO下载口 二 修改KEIL工程
  • MPU6050 获取角度理论推导(二)---6轴融合算法

    接着上篇文章 https mp csdn net postedit 101777018 姿态角解算 互补滤波算法及理论推导 一般在程序中 姿态解算的方式有两种 一种是欧拉角法 一种是四元数法 这里不介绍欧拉角法 只介绍四元数法 互补滤波算法
  • MPU6050使用心得(简单分享一下)

    前言 选用MPU6050做 倾斜检测 功能 前期准备 开发板 正点原子STM32F103 精英版 STM32F103ZET6 模块 GY 521 MPU6050 其他 杜邦线若干 烧录线 FlyMcu Keil5 正点原子开发板配套的套件

随机推荐

  • OCR(Optical Character Recognition,光学字符识别)问题

    应用场景 xff1a 在这个过程中由于场景的不确定性 xff0c 比如 xff1a 图片背景极其丰富 亮度不均衡 光照不均衡 残缺遮挡 文字扭曲 字体多样等等问题 xff0c 会带来极大的挑战 自然场景中文本具有多样性 xff1a 文本检测
  • OCR-文本检测方法

    基于回归的文本检测 基于回归文本检测方法和目标检测算法的方法相似 xff0c 文本检测方法只有两个类别 xff0c 图像中的文本视为待检测的目标 xff0c 其余部分视为背景 水平文本检测 早期基于深度学习的文本检测算法是从目标检测的方法改
  • C++中使用__FUNCTION__ ,__TIME__ ,__LINE__ ,__FILE__这几个宏的解释

    FUNCTION xff0c 34 TIME 34 xff0c LINE xff0c FILE 这几个宏是编译器自带的 xff0c 不是那个头文件定义的 FUNCION xff1a 函数名 TIME xff1a 文件运行的时间 LINE x
  • UART串口通信协议详解

    UART xff1a 通信异步收发器 xff0c 串行 异步通信总线 xff0c 两条数据线 xff08 收发 xff09 xff0c 全双工 xff08 可以同时接收和发送 xff09 一 UART帧格式 xff08 UART协议 xff
  • 基于FPGA的DDS信号发生器

    之前的博客讲到了DDS的基本原理 xff0c 现在用Verilog代码实现DDS 能够产生四种波形 xff0c 方波 xff0c 三角波 xff0c 正弦波 xff0c 锯齿波 xff0c 用按键来控制频率和选择波形 其中按键消抖模块来自小
  • C++的命名空间详解

    c 43 43 命名空间详解 命名空间的意义命名空间的定义命名空间的使用 命名空间的意义 在C C 43 43 中 xff0c 变量 函数和后面要学到的类都是大量存在的 xff0c 这些变量 函数和类的名称将都存在于全局作用域中 xff0c
  • 基于Verilog的32位并行进位加法器设计

    1 功能概述 xff1a 先行进位加法器是对普通的全加器进行改良而设计成的并行加法器 xff0c 主要是针对普通全加器串联时互相进位产生的延迟进行了改良 超前进位加法器是通过增加了一个不是十分复杂的逻辑电路来做到这点的 设二进制加法器第i位
  • 基于verilog的处理器设计之寄存器堆

    该寄存器堆是CPU中多个寄存器组成的阵列 xff0c 由32个32位的寄存器构成 xff0c 两个读数据口 Ra gt BusA Rb gt BusB 一个写数据口 Rw gt BusW 写数据受使能信号Wen控制 xff0c 在时钟的下降
  • 使用结构体方式访问寄存器的实践

    朱老师单片机课程学习记录 span class token macro property span class token directive keyword ifndef span GPIO H span span class token
  • MIM,MOM和MOS电容的区别

    ic layout经常会遇到这三种电容 xff1a MOS xff0c MOM xff0c MIM MOS 电容 xff1a 两端结构的mos管 xff0c 电容值不精确 xff0c 可以实现随控制电压变化而变 化的容值 xff0c 上下极
  • 折叠共源共栅放大器Cadence仿真

    仿真原理图如下 xff0c 图中M4的宽长比应该和M5一样 xff0c 为4u 150n m nf为1 2 M8和M9的宽长比为4u 500n 完整的电路图如下 xff1a cascode晶体管的L给小一点 xff0c 电流镜晶体管L给大一
  • 二级运放的Cadence仿真

    基于之前做的折叠共源共栅cascode xff0c 在后面加两个管子 xff0c 变成一个简单的二级运放 二级运放的通带内的增益大于80dB xff0c GBW为大于50M xff0c 相位裕度大于60 为了保证运放的相位裕度 xff0c
  • 射频接收机的参数计算

  • 户外系统原理方框图

  • bandgap中简并点理解与仿真

    综合EETOP论坛上的解答以及自己的仿真 xff0c 一般来说一个电路有可能存在一个以上满足KCL KVL电路方程的解 工作点 这些解中有的是稳定解 有的可能是非稳定解 其区别在于 如果电路目前工作在稳定解 当出现扰动时 比如实际电路中的噪
  • GPS卫星定位基本原理

    GPS定位基本原理 GPS测量定位方法分类 定位模式 xff1a 绝对定位 xff08 单点定位 xff09 相对定位 差分定位 定位时接收机天线的运动状态 xff1a 静态定位 xff0d 天线相对于地固坐标系静止 动态定位 xff0d
  • c++缺省参数,函数重载详解

    c 43 43 缺省参数 xff0c 函数重载详解 缺省参数什么是缺省参数 xff1f 缺省参数的分类 1 全缺省参数 2 半缺省参数 规则 xff1a 缺省参数只能从右往左 xff0c 依次给出 xff08 这是规定 xff09 函数重载
  • 和小白一起学数据结构三之c与结构及联合

    和小白一起学数据结构 xff08 三 xff09 今天博主动笔有些晚了哈 xff0c 所以不讲太多废话了 xff0c 直接上干货 xff01 今天我们来复习c语言提供的两种聚合数据类型 xff08 aggregate data type 数
  • 持之以恒(一)位姿转换:姿态 / 四元数 / 旋转矩阵 / 欧拉角 及 位姿矩阵

    文章目录 1 简介1 1 位姿的几种表示形式1 2 姿态转换在线工具 2 位姿转换接口2 1 旋转向量 转 四元数2 2 四元数 转 旋转向量2 3 四元数 与 旋转矩阵 3 机器人相关应用3 1 不同厂家协作机器人的位姿表示形式 1 简介
  • 基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序

    基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序 目录 基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序 前言 一 实验器材 二 硬件资源 1 usb转ttl 2 串口1 波特率 9600 P2 2 P2