国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

學(xué)習(xí)記錄之STM32F103C8T6最小系統(tǒng)板驅(qū)動(dòng)MPU6050串口打印數(shù)據(jù)

這篇具有很好參考價(jià)值的文章主要介紹了學(xué)習(xí)記錄之STM32F103C8T6最小系統(tǒng)板驅(qū)動(dòng)MPU6050串口打印數(shù)據(jù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

學(xué)習(xí)記錄之STM32F103C8T6最小系統(tǒng)板驅(qū)動(dòng)MPU6050串口打印數(shù)據(jù)

1.使用到的工具介紹
2.MPU6050和整體和簡(jiǎn)單介紹
3.程序的介紹

1.使用到的工具介紹
硬件方面:STM32F103C8T6最小系統(tǒng)板核心板,MPU6050模塊三維角度傳感器,經(jīng)典的CH340燒寫和串口作用,和若干個(gè)杜邦線。
學(xué)習(xí)記錄之STM32F103C8T6最小系統(tǒng)板驅(qū)動(dòng)MPU6050串口打印數(shù)據(jù)
軟件方面:keil5編寫程序軟件,燒寫軟件FlyMcu.exe燒寫工具,sscom.exe串口調(diào)試工具。
學(xué)習(xí)記錄之STM32F103C8T6最小系統(tǒng)板驅(qū)動(dòng)MPU6050串口打印數(shù)據(jù)
2.MPU6050和整體和簡(jiǎn)單介紹

MPU6050模塊 Stm32f103c8t6核心板
SCL PB8
SDA PB9
A0 GND
VCC 3.3V
GND GND
CH340燒寫串口模塊
5V 5V
GND GND
RXD PA9
TXD PA10

MPU6050模塊A0接地mpu6050地址0x68,A0為高電平mpu6050的地址為0x69。所以這里選擇的A0接地mpu6050地址0x68。
下載程序時(shí)需要將boot0跳線帽換到vcc去才是下載程序模式,選擇好程序后開始燒寫需要按一下核心板上的復(fù)位按鍵后才會(huì)燒寫進(jìn)去。燒寫完成后打開串口調(diào)試據(jù),選擇號(hào)通訊串口。數(shù)據(jù)會(huì)由單片機(jī)一直發(fā)給電腦串口調(diào)試軟件讀取出mpu6050的數(shù)據(jù)。
學(xué)習(xí)記錄之STM32F103C8T6最小系統(tǒng)板驅(qū)動(dòng)MPU6050串口打印數(shù)據(jù)

3.程序的介紹
程序部分的添加
學(xué)習(xí)記錄之STM32F103C8T6最小系統(tǒng)板驅(qū)動(dòng)MPU6050串口打印數(shù)據(jù)
這里只對(duì)mpuiic.c,mpuiic.h,mpu6050.c,mpu6050.h和man.c 其余的都在這里(源碼)點(diǎn)擊;

mpuiic.c代碼如下

#include "mpuiic.h"
#include "delay.h"

void MPU_SDA_IN(void)
{					     
				 //PB8,PB9 輸出高	
	GPIO_InitTypeDef GPIO_InitStructure;
 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PORTA,PORTE時(shí)鐘

	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_9;//KEY0-KEY1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設(shè)置成上拉輸入
 	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOE4,3
}
void MPU_SDA_OUT(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外設(shè)IO PORTB時(shí)鐘 
		
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;	 // 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽輸出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度為50MHz
  GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根據(jù)設(shè)定參數(shù)初始化GPIO 		
}

  //MPU IIC 延時(shí)函數(shù)
void MPU_IIC_Delay(void)
{
	delay_us(2);
}

//初始化IIC
void MPU_IIC_Init(void)
{					     
  GPIO_InitTypeDef  GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外設(shè)IO PORTB時(shí)鐘 
		
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;	 // 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽輸出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度為50MHz
  GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根據(jù)設(shè)定參數(shù)初始化GPIO 
	
  GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9);						 //PB8,PB9 輸出高	
 
}
//產(chǎn)生IIC起始信號(hào)
void MPU_IIC_Start(void)
{
	MPU_SDA_OUT();     //sda線輸出
	MPU_IIC_SDA=1;	  	  
	MPU_IIC_SCL=1;
	MPU_IIC_Delay();
 	MPU_IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
	MPU_IIC_Delay();
	MPU_IIC_SCL=0;//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) 
}	  
//產(chǎn)生IIC停止信號(hào)
void MPU_IIC_Stop(void)
{
	MPU_SDA_OUT();//sda線輸出
	MPU_IIC_SCL=0;
	MPU_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
 	MPU_IIC_Delay();
	MPU_IIC_SCL=1; 
	MPU_IIC_SDA=1;//發(fā)送I2C總線結(jié)束信號(hào)
	MPU_IIC_Delay();							   	
}
//等待應(yīng)答信號(hào)到來(lái)
//返回值:1,接收應(yīng)答失敗
//        0,接收應(yīng)答成功
u8 MPU_IIC_Wait_Ack(void)
{
	u8 ucErrTime=0;
	MPU_SDA_IN();      //SDA設(shè)置為輸入  
	MPU_IIC_SDA=1;MPU_IIC_Delay();	   
	MPU_IIC_SCL=1;MPU_IIC_Delay();	 
	while(MPU_READ_SDA)
	{
		ucErrTime++;
		if(ucErrTime>250)
		{
			MPU_IIC_Stop();
			return 1;
		}
	}
	MPU_IIC_SCL=0;//時(shí)鐘輸出0 	   
	return 0;  
} 
//產(chǎn)生ACK應(yīng)答
void MPU_IIC_Ack(void)
{
	MPU_IIC_SCL=0;
	MPU_SDA_OUT();
	MPU_IIC_SDA=0;
	MPU_IIC_Delay();
	MPU_IIC_SCL=1;
	MPU_IIC_Delay();
	MPU_IIC_SCL=0;
}
//不產(chǎn)生ACK應(yīng)答		    
void MPU_IIC_NAck(void)
{
	MPU_IIC_SCL=0;
	MPU_SDA_OUT();
	MPU_IIC_SDA=1;
	MPU_IIC_Delay();
	MPU_IIC_SCL=1;
	MPU_IIC_Delay();
	MPU_IIC_SCL=0;
}					 				     
//IIC發(fā)送一個(gè)字節(jié)
//返回從機(jī)有無(wú)應(yīng)答
//1,有應(yīng)答
//0,無(wú)應(yīng)答			  
void MPU_IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
	MPU_SDA_OUT(); 	    
    MPU_IIC_SCL=0;//拉低時(shí)鐘開始數(shù)據(jù)傳輸
    for(t=0;t<8;t++)
    {              
        MPU_IIC_SDA=(txd&0x80)>>7;
        txd<<=1; 	  
		    MPU_IIC_SCL=1;
		    MPU_IIC_Delay(); 
		    MPU_IIC_SCL=0;	
		    MPU_IIC_Delay();
    }	 
} 	    
//讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK   
u8 MPU_IIC_Read_Byte(unsigned char ack)
{
	unsigned char i,receive=0;
	MPU_SDA_IN();//SDA設(shè)置為輸入
    for(i=0;i<8;i++ )
	{
        MPU_IIC_SCL=0; 
        MPU_IIC_Delay();
		MPU_IIC_SCL=1;
        receive<<=1;
        if(MPU_READ_SDA)receive++;   
		MPU_IIC_Delay(); 
    }					 
    if (!ack)
        MPU_IIC_NAck();//發(fā)送nACK
    else
        MPU_IIC_Ack(); //發(fā)送ACK   
    return receive;
}

mpuiic.h代碼如下

#ifndef __MPUIIC_H
#define __MPUIIC_H
#include "sys.h"

//IO操作函數(shù)	 
#define MPU_IIC_SCL    PBout(8) 		//SCL
#define MPU_IIC_SDA    PBout(9) 		//SDA	 
#define MPU_READ_SDA   PBin(9) 		//輸入SDA 

void MPU_SDA_IN(void);
void MPU_SDA_OUT(void);

//IIC所有操作函數(shù)
void MPU_IIC_Delay(void);				//MPU IIC延時(shí)函數(shù)
void MPU_IIC_Init(void);                //初始化IIC的IO口				 
void MPU_IIC_Start(void);				//發(fā)送IIC開始信號(hào)
void MPU_IIC_Stop(void);	  			//發(fā)送IIC停止信號(hào)
void MPU_IIC_Send_Byte(u8 txd);			//IIC發(fā)送一個(gè)字節(jié)
u8 MPU_IIC_Read_Byte(unsigned char ack);//IIC讀取一個(gè)字節(jié)
u8 MPU_IIC_Wait_Ack(void); 				//IIC等待ACK信號(hào)
void MPU_IIC_Ack(void);					//IIC發(fā)送ACK信號(hào)
void MPU_IIC_NAck(void);				//IIC不發(fā)送ACK信號(hào)

void IMPU_IC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 MPU_IIC_Read_One_Byte(u8 daddr,u8 addr);	 

#endif

mpu6050.c代碼如下

#include "mpu6050.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"   



 
//初始化MPU6050
//返回值:0,成功
//    其他,錯(cuò)誤代碼
u8 MPU_Init(void)
{ 
	u8 res;
	
	MPU_IIC_Init();//初始化IIC總線
	MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);	//復(fù)位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);						//設(shè)置采樣率50Hz
	MPU_Write_Byte(MPU_INT_EN_REG,0X00);	//關(guān)閉所有中斷
	MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);	//I2C主模式關(guān)閉
	MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);	//關(guān)閉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);	//設(shè)置CLKSEL,PLL X軸為參考
		MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);	//加速度與陀螺儀都工作
		MPU_Set_Rate(50);						//設(shè)置采樣率為50Hz
 	}else return 1;
	return 0;
}
//設(shè)置MPU6050陀螺儀傳感器滿量程范圍
//fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
//返回值:0,設(shè)置成功
//    其他,設(shè)置失敗 
u8 MPU_Set_Gyro_Fsr(u8 fsr)
{
	return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//設(shè)置陀螺儀滿量程范圍  
}
//設(shè)置MPU6050加速度傳感器滿量程范圍
//fsr:0,±2g;1,±4g;2,±8g;3,±16g
//返回值:0,設(shè)置成功
//    其他,設(shè)置失敗 
u8 MPU_Set_Accel_Fsr(u8 fsr)
{
	return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//設(shè)置加速度傳感器滿量程范圍  
}
//設(shè)置MPU6050的數(shù)字低通濾波器
//lpf:數(shù)字低通濾波頻率(Hz)
//返回值:0,設(shè)置成功
//    其他,設(shè)置失敗 
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);//設(shè)置數(shù)字低通濾波器  
}
//設(shè)置MPU6050的采樣率(假定Fs=1KHz)
//rate:4~1000(Hz)
//返回值:0,設(shè)置成功
//    其他,設(shè)置失敗 
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);	//設(shè)置數(shù)字低通濾波器
 	return MPU_Set_LPF(rate/2);	//自動(dòng)設(shè)置LPF為采樣率的一半
}

//得到溫度值
//返回值:溫度值(擴(kuò)大了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軸的原始讀數(shù)(帶符號(hào))
//返回值:0,成功
//    其他,錯(cuò)誤代碼
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軸的原始讀數(shù)(帶符號(hào))
//返回值:0,成功
//    其他,錯(cuò)誤代碼
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連續(xù)寫
//addr:器件地址 
//reg:寄存器地址
//len:寫入長(zhǎng)度
//buf:數(shù)據(jù)區(qū)
//返回值:0,正常
//    其他,錯(cuò)誤代碼
u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{
	u8 i; 
    MPU_IIC_Start(); 
	MPU_IIC_Send_Byte((addr<<1)|0);//發(fā)送器件地址+寫命令	
	if(MPU_IIC_Wait_Ack())	//等待應(yīng)答
	{
		MPU_IIC_Stop();		 
		return 1;		
	}
    MPU_IIC_Send_Byte(reg);	//寫寄存器地址
    MPU_IIC_Wait_Ack();		//等待應(yīng)答
	for(i=0;i<len;i++)
	{
		MPU_IIC_Send_Byte(buf[i]);	//發(fā)送數(shù)據(jù)
		if(MPU_IIC_Wait_Ack())		//等待ACK
		{
			MPU_IIC_Stop();	 
			return 1;		 
		}		
	}    
    MPU_IIC_Stop();	 
	return 0;	
} 
//IIC連續(xù)讀
//addr:器件地址
//reg:要讀取的寄存器地址
//len:要讀取的長(zhǎng)度
//buf:讀取到的數(shù)據(jù)存儲(chǔ)區(qū)
//返回值:0,正常
//    其他,錯(cuò)誤代碼
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{ 
 	MPU_IIC_Start(); 
	MPU_IIC_Send_Byte((addr<<1)|0);//發(fā)送器件地址+寫命令	
	if(MPU_IIC_Wait_Ack())	//等待應(yīng)答
	{
		MPU_IIC_Stop();		 
		return 1;		
	}
    MPU_IIC_Send_Byte(reg);	//寫寄存器地址
    MPU_IIC_Wait_Ack();		//等待應(yīng)答
    MPU_IIC_Start();
	MPU_IIC_Send_Byte((addr<<1)|1);//發(fā)送器件地址+讀命令	
    MPU_IIC_Wait_Ack();		//等待應(yīng)答 
	while(len)
	{
		if(len==1)*buf=MPU_IIC_Read_Byte(0);//讀數(shù)據(jù),發(fā)送nACK 
		else *buf=MPU_IIC_Read_Byte(1);		//讀數(shù)據(jù),發(fā)送ACK  
		len--;
		buf++; 
	}    
    MPU_IIC_Stop();	//產(chǎn)生一個(gè)停止條件 
	return 0;	
}
//IIC寫一個(gè)字節(jié) 
//reg:寄存器地址
//data:數(shù)據(jù)
//返回值:0,正常
//    其他,錯(cuò)誤代碼
u8 MPU_Write_Byte(u8 reg,u8 data) 				 
{ 
    MPU_IIC_Start(); 
	MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//發(fā)送器件地址+寫命令	
	if(MPU_IIC_Wait_Ack())	//等待應(yīng)答
	{
		MPU_IIC_Stop();		 
		return 1;		
	}
    MPU_IIC_Send_Byte(reg);	//寫寄存器地址
    MPU_IIC_Wait_Ack();		//等待應(yīng)答 
	MPU_IIC_Send_Byte(data);//發(fā)送數(shù)據(jù)
	if(MPU_IIC_Wait_Ack())	//等待ACK
	{
		MPU_IIC_Stop();	 
		return 1;		 
	}		 
    MPU_IIC_Stop();	 
	return 0;
}
//IIC讀一個(gè)字節(jié) 
//reg:寄存器地址 
//返回值:讀到的數(shù)據(jù)
u8 MPU_Read_Byte(u8 reg)
{
	u8 res;
    MPU_IIC_Start(); 
	MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//發(fā)送器件地址+寫命令	
	MPU_IIC_Wait_Ack();		//等待應(yīng)答 
    MPU_IIC_Send_Byte(reg);	//寫寄存器地址
    MPU_IIC_Wait_Ack();		//等待應(yīng)答
    MPU_IIC_Start();
	MPU_IIC_Send_Byte((MPU_ADDR<<1)|1);//發(fā)送器件地址+讀命令	
    MPU_IIC_Wait_Ack();		//等待應(yīng)答 
	res=MPU_IIC_Read_Byte(0);//讀取數(shù)據(jù),發(fā)送nACK 
    MPU_IIC_Stop();			//產(chǎn)生一個(gè)停止條件 
	return res;		
}

mpu6050.h代碼如下

#ifndef __MPU6050_H
#define __MPU6050_H
#include "mpuiic.h"   												  	  


//#define MPU_ACCEL_OFFS_REG		0X06	//accel_offs寄存器,可讀取版本號(hào),寄存器手冊(cè)未提到
//#define MPU_PROD_ID_REG			0X0C	//prod id寄存器,在寄存器手冊(cè)未提到
#define MPU_SELF_TESTX_REG		0X0D	//自檢寄存器X
#define MPU_SELF_TESTY_REG		0X0E	//自檢寄存器Y
#define MPU_SELF_TESTZ_REG		0X0F	//自檢寄存器Z
#define MPU_SELF_TESTA_REG		0X10	//自檢寄存器A
#define MPU_SAMPLE_RATE_REG		0X19	//采樣頻率分頻器
#define MPU_CFG_REG				0X1A	//配置寄存器
#define MPU_GYRO_CFG_REG		0X1B	//陀螺儀配置寄存器
#define MPU_ACCEL_CFG_REG		0X1C	//加速度計(jì)配置寄存器
#define MPU_MOTION_DET_REG		0X1F	//運(yùn)動(dòng)檢測(cè)閥值設(shè)置寄存器
#define MPU_FIFO_EN_REG			0X23	//FIFO使能寄存器
#define MPU_I2CMST_CTRL_REG		0X24	//IIC主機(jī)控制寄存器
#define MPU_I2CSLV0_ADDR_REG	0X25	//IIC從機(jī)0器件地址寄存器
#define MPU_I2CSLV0_REG			0X26	//IIC從機(jī)0數(shù)據(jù)地址寄存器
#define MPU_I2CSLV0_CTRL_REG	0X27	//IIC從機(jī)0控制寄存器
#define MPU_I2CSLV1_ADDR_REG	0X28	//IIC從機(jī)1器件地址寄存器
#define MPU_I2CSLV1_REG			0X29	//IIC從機(jī)1數(shù)據(jù)地址寄存器
#define MPU_I2CSLV1_CTRL_REG	0X2A	//IIC從機(jī)1控制寄存器
#define MPU_I2CSLV2_ADDR_REG	0X2B	//IIC從機(jī)2器件地址寄存器
#define MPU_I2CSLV2_REG			0X2C	//IIC從機(jī)2數(shù)據(jù)地址寄存器
#define MPU_I2CSLV2_CTRL_REG	0X2D	//IIC從機(jī)2控制寄存器
#define MPU_I2CSLV3_ADDR_REG	0X2E	//IIC從機(jī)3器件地址寄存器
#define MPU_I2CSLV3_REG			0X2F	//IIC從機(jī)3數(shù)據(jù)地址寄存器
#define MPU_I2CSLV3_CTRL_REG	0X30	//IIC從機(jī)3控制寄存器
#define MPU_I2CSLV4_ADDR_REG	0X31	//IIC從機(jī)4器件地址寄存器
#define MPU_I2CSLV4_REG			0X32	//IIC從機(jī)4數(shù)據(jù)地址寄存器
#define MPU_I2CSLV4_DO_REG		0X33	//IIC從機(jī)4寫數(shù)據(jù)寄存器
#define MPU_I2CSLV4_CTRL_REG	0X34	//IIC從機(jī)4控制寄存器
#define MPU_I2CSLV4_DI_REG		0X35	//IIC從機(jī)4讀數(shù)據(jù)寄存器

#define MPU_I2CMST_STA_REG		0X36	//IIC主機(jī)狀態(tài)寄存器
#define MPU_INTBP_CFG_REG		0X37	//中斷/旁路設(shè)置寄存器
#define MPU_INT_EN_REG			0X38	//中斷使能寄存器
#define MPU_INT_STA_REG			0X3A	//中斷狀態(tài)寄存器

#define MPU_ACCEL_XOUTH_REG		0X3B	//加速度值,X軸高8位寄存器
#define MPU_ACCEL_XOUTL_REG		0X3C	//加速度值,X軸低8位寄存器
#define MPU_ACCEL_YOUTH_REG		0X3D	//加速度值,Y軸高8位寄存器
#define MPU_ACCEL_YOUTL_REG		0X3E	//加速度值,Y軸低8位寄存器
#define MPU_ACCEL_ZOUTH_REG		0X3F	//加速度值,Z軸高8位寄存器
#define MPU_ACCEL_ZOUTL_REG		0X40	//加速度值,Z軸低8位寄存器

#define MPU_TEMP_OUTH_REG		0X41	//溫度值高八位寄存器
#define MPU_TEMP_OUTL_REG		0X42	//溫度值低8位寄存器

#define MPU_GYRO_XOUTH_REG		0X43	//陀螺儀值,X軸高8位寄存器
#define MPU_GYRO_XOUTL_REG		0X44	//陀螺儀值,X軸低8位寄存器
#define MPU_GYRO_YOUTH_REG		0X45	//陀螺儀值,Y軸高8位寄存器
#define MPU_GYRO_YOUTL_REG		0X46	//陀螺儀值,Y軸低8位寄存器
#define MPU_GYRO_ZOUTH_REG		0X47	//陀螺儀值,Z軸高8位寄存器
#define MPU_GYRO_ZOUTL_REG		0X48	//陀螺儀值,Z軸低8位寄存器

#define MPU_I2CSLV0_DO_REG		0X63	//IIC從機(jī)0數(shù)據(jù)寄存器
#define MPU_I2CSLV1_DO_REG		0X64	//IIC從機(jī)1數(shù)據(jù)寄存器
#define MPU_I2CSLV2_DO_REG		0X65	//IIC從機(jī)2數(shù)據(jù)寄存器
#define MPU_I2CSLV3_DO_REG		0X66	//IIC從機(jī)3數(shù)據(jù)寄存器

#define MPU_I2CMST_DELAY_REG	0X67	//IIC主機(jī)延時(shí)管理寄存器
#define MPU_SIGPATH_RST_REG		0X68	//信號(hào)通道復(fù)位寄存器
#define MPU_MDETECT_CTRL_REG	0X69	//運(yùn)動(dòng)檢測(cè)控制寄存器
#define MPU_USER_CTRL_REG		0X6A	//用戶控制寄存器
#define MPU_PWR_MGMT1_REG		0X6B	//電源管理寄存器1
#define MPU_PWR_MGMT2_REG		0X6C	//電源管理寄存器2 
#define MPU_FIFO_CNTH_REG		0X72	//FIFO計(jì)數(shù)寄存器高八位
#define MPU_FIFO_CNTL_REG		0X73	//FIFO計(jì)數(shù)寄存器低八位
#define MPU_FIFO_RW_REG			0X74	//FIFO讀寫寄存器
#define MPU_DEVICE_ID_REG		0X75	//器件ID寄存器
 
//如果AD0腳(9腳)接地,IIC地址為0X68(不包含最低位).
//如果接V3.3,則IIC地址為0X69(不包含最低位).
#define MPU_ADDR				0X68


因?yàn)槟KAD0默認(rèn)接GND,所以轉(zhuǎn)為讀寫地址后,為0XD1和0XD0(如果接VCC,則為0XD3和0XD2)  
//#define MPU_READ    0XD1
//#define MPU_WRITE   0XD0

u8 MPU_Init(void); 								//初始化MPU6050
u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf);//IIC連續(xù)寫
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf); //IIC連續(xù)讀 
u8 MPU_Write_Byte(u8 reg,u8 data);				//IIC寫一個(gè)字節(jié)
u8 MPU_Read_Byte(u8 reg);						//IIC讀一個(gè)字節(jié)

u8 MPU_Set_Gyro_Fsr(u8 fsr);
u8 MPU_Set_Accel_Fsr(u8 fsr);
u8 MPU_Set_LPF(u16 lpf);
u8 MPU_Set_Rate(u16 rate);
u8 MPU_Set_Fifo(u8 sens);


short MPU_Get_Temperature(void);
u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz);
u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az);

#endif

main.c代碼如下

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h" 


int main(void)
{	 
	u8 t=0;
	float pitch,roll,yaw; //歐拉角
	short temp;	//溫度	 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
	uart_init(115200);	 	//串口初始化為115200
	delay_init();	//延時(shí)初始化 
	MPU_Init();					//初始化MPU6050
	 
	while(mpu_dmp_init())
 	{
		printf("初始化失敗\r\n");
		delay_ms(400);
	}  

	 printf("初始化成功\r\n");
	
 	while(1)
	{
		
		if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
		{ 
			temp=MPU_Get_Temperature();	//得到溫度值
			if((t%10)==0)
			{ 
				
				printf("溫度:");
				printf("%d\r\n",temp/100);
				
				temp=pitch;			
				printf("pitch俯仰角:");
        printf("%d\r\n",temp);
				
				temp=roll;
				printf("roll橫滾角:");
        printf("%d\r\n",temp);
				
				temp=yaw;
				printf("yaw航向角:");
				printf("%d\r\n",temp);
				
				t=0;
			}
		}
		t++; 
	} 	
}

《全部的源碼在這點(diǎn)擊》文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-405988.html

到了這里,關(guān)于學(xué)習(xí)記錄之STM32F103C8T6最小系統(tǒng)板驅(qū)動(dòng)MPU6050串口打印數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Altium designer—STM32F103C8T6最小系統(tǒng)原理圖

    Altium designer—STM32F103C8T6最小系統(tǒng)原理圖

    分享使用Altium designer軟件繪制的STM32F103C8T6最小系統(tǒng)電路原理圖 親測(cè)可用,完整電路文件資源見(jiàn)文末鏈接 一、電路原理圖 STM32F103C8T6是STM32入門級(jí)的芯片,性價(jià)比很高,資源相對(duì)比較豐富,該最小系統(tǒng)包括STM32F103C8T6芯片、晶振電路、復(fù)位電路、供電電源電路、SWD下載電路、B

    2024年02月11日
    瀏覽(30)
  • 【單片機(jī)】STM32F103C8T6 最小系統(tǒng)板原理圖

    【單片機(jī)】STM32F103C8T6 最小系統(tǒng)板原理圖

    STM32F103C8T6是一款基于ARM Cortex-M3內(nèi)核的32位微控制器,由STMicroelectronics(ST)公司生產(chǎn)。它是STMicroelectronics的STM32系列微控制器中的一員,被廣泛應(yīng)用于嵌入式系統(tǒng)和電子設(shè)備中。 STM32F103C8T6單片機(jī)的主要特點(diǎn)和資源包括: 內(nèi)存資源: Flash存儲(chǔ)器:64 KB SRAM(靜態(tài)隨機(jī)訪問(wèn)存儲(chǔ)器

    2024年02月12日
    瀏覽(30)
  • STM32F103C8T6最小系統(tǒng)板實(shí)現(xiàn)蜂鳴器報(bào)警

    STM32F103C8T6最小系統(tǒng)板實(shí)現(xiàn)蜂鳴器報(bào)警

    SWD方式下載程序,4線,VCC,GND。 SWDIO:Serial Wire Data Input Output,串行數(shù)據(jù)輸入輸出引腳,作為仿真信號(hào)的雙向數(shù)據(jù)信號(hào)線,建議上拉。 SWCLK:Serial Wire Clock,串行線時(shí)鐘引腳,作為仿真信號(hào)的時(shí)鐘信號(hào)線,建議下拉; 蜂鳴器的IO口接在了最小系統(tǒng)板的PB12引腳上。 蜂鳴器的操作

    2024年02月01日
    瀏覽(20)
  • 使用串口燒寫程序到STM32F103C8T6最小板(CH340)

    使用串口燒寫程序到STM32F103C8T6最小板(CH340)

    商家沒(méi)給ST‐LINK V2下載器,故使用串口將程序燒錄到最小板,使用仿真軟件Flymcu進(jìn)行。(默認(rèn)安裝過(guò)CH340的驅(qū)動(dòng)) 聯(lián)機(jī)下載時(shí)的程序文件:編譯生成的.hex文件; 編程前重裝文件:當(dāng)選中該項(xiàng)后,flymcu會(huì)在每次編程之前將Hex文件重新裝載一遍,這對(duì)于代碼調(diào)試的時(shí)候比較有用

    2024年02月01日
    瀏覽(190)
  • STM32F103C8T6的學(xué)習(xí)(4)——外部中斷

    STM32F103C8T6的學(xué)習(xí)(4)——外部中斷

    :? 本教程基于up主江科大自化協(xié)——“STM32入門教程”記錄的個(gè)人學(xué)習(xí)筆記 跳轉(zhuǎn)鏈接: STM32入門教程-2022持續(xù)更新中_嗶哩嗶哩_bilibili ?中斷: 在主程序運(yùn)行過(guò)程中,出現(xiàn)了特定的中斷觸發(fā)條件(中斷源),使得CPU暫停當(dāng)前正在運(yùn)行的程序,轉(zhuǎn)而去處理中斷程序,處理完成后

    2024年02月02日
    瀏覽(22)
  • [初學(xué)單片機(jī)]stm32f103C8T6最小系統(tǒng)板快速完成點(diǎn)亮led燈

    [初學(xué)單片機(jī)]stm32f103C8T6最小系統(tǒng)板快速完成點(diǎn)亮led燈

    目錄 一、準(zhǔn)備工作 二、建立工程模板 三、配置keil5 四、程序 五、程序下載(燒錄) ?六、總結(jié) ① keil5,自行下載安裝; ② 庫(kù)函數(shù)包,這里我上傳了一個(gè)F1xx的庫(kù)函數(shù)包,可以在建立工程模板的時(shí)候用到;1,STM32F1xx固件庫(kù).rar - 藍(lán)奏云 ③ STM32F103C8T6最小系統(tǒng)班,淘寶十幾塊;

    2024年02月01日
    瀏覽(17)
  • 初步了解STM32的學(xué)習(xí)筆記(以STM32F103C8T6為例)

    初步了解STM32的學(xué)習(xí)筆記(以STM32F103C8T6為例)

    ? STM32F103C8T6屬于主流系列STM32F1 內(nèi)核是ARM Cortex-Mex3 主頻為72Hz RAM:20K(SRAM) ROM:64K(Flash) 封裝:LQFP48 供電:2~3.6V(一般為3.3) (注意:以前51用的是5V,而USB也是5V,所以直接插上,而stm32會(huì)加上一個(gè)穩(wěn)壓芯片,讓電壓為3.3V) (所有圖都是用的是B站上整理過(guò)的) ?表里面

    2024年02月05日
    瀏覽(53)
  • Stm32f103c8t6(proteus仿真)學(xué)習(xí)——3.按鍵控制LED燈

    Stm32f103c8t6(proteus仿真)學(xué)習(xí)——3.按鍵控制LED燈

    按鍵:button 電阻:res 先配置LED燈的GPIO 編寫LED亮滅的函數(shù) 實(shí)現(xiàn)按下按鍵LED燈的狀態(tài)取反 led.c總代碼 先配置按鍵的GPIO 獲取當(dāng)前按鍵鍵值的函數(shù) key.c總代碼 5.1 按鍵按下實(shí)現(xiàn)LED亮或者滅 仿真效果圖: 5.2 按鍵按下實(shí)現(xiàn)LED狀態(tài)取反 仿真效果圖: 百度網(wǎng)盤 鏈接:https://pan.baidu.co

    2024年02月07日
    瀏覽(21)
  • 使用USB轉(zhuǎn)TTL下載器將固件燒寫到STM32F103C8T6最小系統(tǒng)板中

    使用USB轉(zhuǎn)TTL下載器將固件燒寫到STM32F103C8T6最小系統(tǒng)板中

    ch340驅(qū)動(dòng)下載地址: https://www.wch.cn/download/CH341SER_EXE.html mcuisp下載地址: 百度云盤資源: 鏈接:https://pan.baidu.com/s/1TuecWD0T1HTMkEpobuesFw 提取碼:visk Flymcu下載地址: 百度云盤資源 鏈接:https://pan.baidu.com/s/1VxMUZFOVvpAf-L_YbATMag 提取碼:fasf usb轉(zhuǎn)TTL下載器的跳線帽接3V3 開發(fā)板BOOT0跳線

    2024年01月18日
    瀏覽(19)
  • 舵機(jī)控制(STM32F103C8T6)

    舵機(jī)控制(STM32F103C8T6)

    ? ? ? ? 本文是以 STM32F103C8T6 作為主控芯片,通過(guò)PB6端口輸出PWM,實(shí)現(xiàn)控制180°舵機(jī)。 (一)概述 ? ? ? ? 舵機(jī)是一種位置伺服驅(qū)動(dòng)器器,是一種帶有輸出軸的小裝置。當(dāng)我們向伺服器發(fā)送一個(gè)控制信號(hào)時(shí),輸出軸就可以轉(zhuǎn)到特定的位置。只在控制信號(hào)持續(xù)不變,伺服機(jī)構(gòu)就

    2023年04月09日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包