(2)創(chuàng)建mpu6050.c文件,輸入以下代碼。
/*********************************************************************************************************
MUP6050 驅(qū) 動(dòng) 程 序
*********************************************************************************************************/
#include "mpu6050.h"
#include "delay.h"
/***************************************************
Name :MPU_IIC_Init
Function :初始化IIC
Paramater :None
Return :None
***************************************************/
void MPU_IIC_Init()
{
RCC->APB2ENR |= 1<<3 ; //先使能PB時(shí)鐘
GPIOB->CRH &= 0xFFFF00FF ; //PB10/11 推挽輸出
GPIOB->CRH |= 0x00003300 ;
GPIOB->ODR |= 3<<10 ; //PB10,11 輸出高
}
/***************************************************
Name :MPU_IIC_Wait_Ack
Function :開(kāi)始時(shí)序
Paramater :None
Return :None
***************************************************/
void MPU_IIC_Start()
{
GPIOB->CRH &= 0xFFFF0FFF ;
GPIOB->CRH |= 0x00003000 ;
MPU_IIC_SDA = 1 ;
MPU_IIC_SCL = 1 ;
delay_us( 2 ) ;
MPU_IIC_SDA = 0 ;
delay_us( 2 ) ;
MPU_IIC_SCL = 0 ;
}
/***************************************************
Name :MPU_IIC_Wait_Ack
Function :停止時(shí)序
Paramater :None
Return :None
***************************************************/
void MPU_IIC_Stop()
{
GPIOB->CRH &= 0xFFFF0FFF ;
GPIOB->CRH |= 0x00003000 ;
MPU_IIC_SCL = 0 ;
MPU_IIC_SDA = 0 ;
delay_us( 2 ) ;
MPU_IIC_SCL = 1 ;
MPU_IIC_SDA = 1 ;
delay_us( 2 ) ;
}
/***************************************************
Name :MPU_IIC_Wait_Ack
Function :應(yīng)答時(shí)序
Paramater :None
Return :
0:成功
1:失敗
***************************************************/
u8 MPU_IIC_Wait_Ack()
{
u8 ucErrTime=0 ;
GPIOB->CRH &= 0xFFFF0FFF ;
GPIOB->CRH |= 0x00008000 ;
MPU_IIC_SDA = 1 ;
delay_us( 2 ) ;
MPU_IIC_SCL = 1 ;
delay_us( 2 ) ;
while( MPU_READ_SDA )
{
ucErrTime ++ ;
if( ucErrTime>250 )
{
MPU_IIC_Stop() ;
return 1 ;
}
}
MPU_IIC_SCL = 0 ; //時(shí)鐘輸出0
return 0 ;
}
/***************************************************
Name :MPU_IIC_Send_Byte
Function :IIC發(fā)送1個(gè)字節(jié)
Paramater :
Ack:應(yīng)答控制
0:不應(yīng)答
1:應(yīng)答
Return :None
***************************************************/
void MPU_IIC_Send_Byte( u8 Byte )
{
u8 i ;
GPIOB->CRH &= 0xFFFF0FFF ;
GPIOB->CRH |= 0x00003000 ;
MPU_IIC_SCL = 0 ; //拉低時(shí)鐘開(kāi)始數(shù)據(jù)傳輸
for( i=0; i<8; i++ )
{
if( ( Byte&0x80 )==0x80 )
MPU_IIC_SDA = 1 ;
else
MPU_IIC_SDA = 0 ;
Byte <<= 1 ;
MPU_IIC_SCL = 1 ;
delay_us( 2 ) ;
MPU_IIC_SCL = 0 ;
delay_us( 2 ) ;
}
}
/***************************************************
Name :MPU_IIC_Read_Byte
Function :IIC讀取1個(gè)字節(jié)
Paramater :
Ack:應(yīng)答控制
0:不應(yīng)答
1:應(yīng)答
Return :讀取的字節(jié)
***************************************************/
u8 MPU_IIC_Read_Byte( u8 Ack )
{
u8 i, Byte=0;
GPIOB->CRH &= 0xFFFF0FFF ;
GPIOB->CRH |= 0x00008000 ;
for( i=0; i<8; i++ )
{
MPU_IIC_SCL = 0 ;
delay_us( 2 ) ;
MPU_IIC_SCL = 1 ;
Byte <<= 1 ;
if( MPU_READ_SDA )
Byte ++ ;
delay_us( 2 ) ;
}
MPU_IIC_SCL = 0 ;
GPIOB->CRH &= 0xFFFF0FFF ;
GPIOB->CRH |= 0x00003000 ;
MPU_IIC_SDA = 1-Ack ;
delay_us( 2 ) ;
MPU_IIC_SCL = 1 ;
delay_us( 2 ) ;
MPU_IIC_SCL = 0 ;
return Byte ;
}
/***************************************************
Name :MPU_Write_Byte
Function :IIC寫(xiě)一個(gè)字節(jié)
Paramater :
reg:寄存器地址
data:數(shù)據(jù)
Return :
0:正常
其他:錯(cuò)誤代碼
***************************************************/
u8 MPU_Write_Byte( u8 reg, u8 data )
{
MPU_IIC_Start() ;
MPU_IIC_Send_Byte( MPU_ADDR<<1 ) ; //發(fā)送器件地址+寫(xiě)命令
//等待應(yīng)答
if( MPU_IIC_Wait_Ack() )
{
MPU_IIC_Stop() ;
return 1 ;
}
MPU_IIC_Send_Byte( reg ) ; //寫(xiě)寄存器地址
MPU_IIC_Wait_Ack() ; //等待應(yīng)答
MPU_IIC_Send_Byte( data ) ; //發(fā)送數(shù)據(jù)
//等待ACK
if( MPU_IIC_Wait_Ack() )
{
MPU_IIC_Stop() ;
return 1 ;
}
MPU_IIC_Stop() ;
return 0 ;
}
/***************************************************
Name :MPU_Read_Byte
Function :IIC讀一個(gè)字節(jié)
Paramater :
reg:寄存器地址
Return :讀到的數(shù)據(jù)
***************************************************/
u8 MPU_Read_Byte( u8 reg )
{
u8 res ;
MPU_IIC_Start() ;
MPU_IIC_Send_Byte( MPU_ADDR<<1 ) ; //發(fā)送器件地址+寫(xiě)命令
MPU_IIC_Wait_Ack() ; //等待應(yīng)答
MPU_IIC_Send_Byte( reg ) ; //寫(xiě)寄存器地址
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 ;
}
/***************************************************
Name :MPU_Read_Byte
Function :設(shè)置MPU6050的采樣率(假定Fs=1KHz)
Paramater :
rate:4~1000(Hz)
Return :
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 ) ; //設(shè)置數(shù)字低通濾波器
//自動(dòng)設(shè)置LPF為采樣率的一半
if( ( rate/2 )>=188 )
data = 1 ;
else if( ( rate/2 )>=98 )
data = 2 ;
else if( ( rate/2 )>=42 )
data = 3 ;
else if( ( rate/2 )>=20 )
data = 4;
else if( ( rate/2 )>=10 )
data = 5 ;
else
data = 6 ;
return MPU_Write_Byte( MPU_CFG_REG, data ) ; //設(shè)置數(shù)字低通濾波器
}
/***************************************************
Name :MPU_Init
Function :初始化MPU6050
Paramater :None
Return :
0:成功
其他:錯(cuò)誤代碼
***************************************************/
u8 MPU_Init()
{
u8 res ;
RCC->APB2ENR |= 1<<2 ; //使能PORTA時(shí)鐘
GPIOA->CRH &= 0x0FFFFFFF ; //PA15設(shè)置成推挽輸出
GPIOA->CRH |= 0x30000000 ;
JTAG_Set( 1 ) ; //禁止JTAG,從而PA15可以做普通IO使用,否則PA15不能做普通IO
MPU_AD0_CTRL = 0 ; //控制MPU6050的AD0腳為低電平,從機(jī)地址為:0X68
//初始化IIC總線
RCC->APB2ENR |= 1<<3 ; //先使能PB時(shí)鐘
GPIOB->CRH &= 0xFFFF00FF ; //PB10/11 推挽輸出
GPIOB->CRH |= 0x00003300 ;
GPIOB->ODR |= 3<<10 ; //PB10,11 輸出高
MPU_Write_Byte( MPU_PWR_MGMT1_REG, 0x80 ) ; //復(fù)位MPU6050
delay_ms( 100 ) ;
MPU_Write_Byte( MPU_PWR_MGMT1_REG, 0x00 ) ; //喚醒MPU6050
MPU_Write_Byte( MPU_GYRO_CFG_REG, 3<<3 ) ; //陀螺儀傳感器,±2000dps
MPU_Write_Byte( MPU_ACCEL_CFG_REG, 0<<3 ) ; //加速度傳感器,±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 ) ;
//器件ID正確
if( res==MPU_ADDR )
{
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 ;
}
/***************************************************
Name :MPU_Write_Len
Function :IIC連續(xù)寫(xiě)
Paramater :
addr:器件地址
reg:寄存器地址
len:寫(xiě)入長(zhǎng)度
buf:數(shù)據(jù)區(qū)
Return :
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 ) ; //發(fā)送器件地址+寫(xiě)命令
if( MPU_IIC_Wait_Ack() ) //等待應(yīng)答
{
MPU_IIC_Stop() ;
return 1 ;
}
MPU_IIC_Send_Byte( reg ) ; //寫(xiě)寄存器地址
MPU_IIC_Wait_Ack() ; //等待應(yīng)答
for( i=0; i
(3)創(chuàng)建1.c文件,輸入以下代碼。
#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "lcd.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
int main()
{
u8 t, Str[ 20 ] ;
float pitch, roll, yaw ; //歐拉角
short aacx, aacy, aacz ; //加速度傳感器原始數(shù)據(jù)
short gyrox, gyroy, gyroz ; //陀螺儀原始數(shù)據(jù)
float temp ; //溫度
STM32_Clock_Init( 9 ) ; //系統(tǒng)時(shí)鐘設(shè)置
SysTick_Init( 72 ) ; //延時(shí)初始化
USART1_Init( 72, 500000 ) ; //串口初始化為500000
LCD_Init() ; //初始化LCD
MPU_Init() ; //初始化MPU6050
while( mpu_dmp_init() ) ;
POINT_COLOR = RED ; //設(shè)置字體為藍(lán)色
while(1)
{
if( mpu_dmp_get_data( &pitch, &roll, &yaw )==0 )
{
temp = ( float )MPU_Get_Temperature()/100 ; //得到溫度值
MPU_Get_Accelerometer( &aacx, &aacy, &aacz ) ; //得到加速度傳感器數(shù)據(jù)
MPU_Get_Gyroscope( &gyrox, &gyroy, &gyroz ) ; //得到陀螺儀數(shù)據(jù)
//轉(zhuǎn)換溫度
sprintf( ( char* )Str, "Temp: %.2f C", temp ) ;
for( t=0; t<20; t++ )
{
if( Str[ t ]=='.' )
{
t += 4 ;
while( t<20 )
{
t ++ ;
Str[ t ] = ' ' ;
}
}
}
LCD_ShowString( 10, 0, Str ) ;
//自轉(zhuǎn)角
sprintf( ( char* )Str, "Pitch: %.1f C", pitch ) ;
for( t=0; t<20; t++ )
{
if( Str[ t ]=='.' )
{
t += 3 ;
while( t<20 )
{
t ++ ;
Str[ t ] = ' ' ;
}
}
}
LCD_ShowString( 10, 30, Str ) ;
//章動(dòng)角
sprintf( ( char* )Str, "Roll: %.1f C", roll ) ;
for( t=0; t<20; t++ )
{
if( Str[ t ]=='.' )
{
t += 3 ;
while( t<20 )
{
t ++ ;
Str[ t ] = ' ' ;
}
}
}
LCD_ShowString( 10, 60, Str ) ;
//旋轉(zhuǎn)角
sprintf( ( char* )Str, "Yaw: %.1f C", yaw ) ;
for( t=0; t<20; t++ )
{
if( Str[ t ]=='.' )
{
t += 3 ;
while( t<20 )
{
t ++ ;
Str[ t ] = ' ' ;
}
}
}
LCD_ShowString( 10, 90, Str ) ;
}
}
}
注:例程使用了網(wǎng)上已經(jīng)移植成功的DMP源碼,直接調(diào)用即可。
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
傳感器
+關(guān)注
關(guān)注
2565文章
52861瀏覽量
766207 -
處理器
+關(guān)注
關(guān)注
68文章
19869瀏覽量
234580 -
MPU6050
+關(guān)注
關(guān)注
39文章
310瀏覽量
72993
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
STM32控制MPU6050之使用說(shuō)明
STM32 控制MPU6050之使用說(shuō)明 mpu6050是陀螺儀、加速計(jì)和一個(gè)可擴(kuò)展的傳根器RM-MPU
發(fā)表于 07-02 08:05
STM32解析MPU6050上位機(jī)與下位機(jī)源碼
STM32解析MPU6050 MPU6050使用說(shuō)明書(shū)V4.pdf 上位機(jī).rar STM32
發(fā)表于 07-02 08:04
STM32控制MPU6050之使用說(shuō)明
STM32 控制MPU6050之使用說(shuō)明 mpu6050是陀螺儀、加速計(jì)和一個(gè)可擴(kuò)展的傳根器RM-MPU
發(fā)表于 07-06 02:25
基于stm32的mpu6050傳感器實(shí)驗(yàn) 精選資料推薦
@TOCMPU6050+STM32學(xué)習(xí)筆記學(xué)習(xí)了差不多兩天的mpu6050,參考了很多篇博客還有看一些資料,今晚終于把這個(gè)東西在我的串口顯示
發(fā)表于 08-17 09:23
如何對(duì)基于stm32的mpu6050傳感器進(jìn)行測(cè)試呢
如何對(duì)基于stm32的mpu6050傳感器進(jìn)行測(cè)試呢?有哪些測(cè)試步驟呢?
發(fā)表于 11-18 06:59
MPU6050六軸傳感器筆記分享
MPU6050六軸傳感器1 自帶數(shù)字運(yùn)動(dòng)處理2 集成可程序控制(陀螺儀)3 集成可程序控制(加速度傳感器)4 自帶數(shù)字溫度傳感器5 可輸出中
發(fā)表于 02-10 06:49
mpu6050六軸傳感器模塊驅(qū)動(dòng)程序源代碼分享
本文為大家分享了mpu6050六軸傳感器模塊驅(qū)動(dòng)程序源代碼,STM32F1讀取MPU6050的加速度和角度傳感器數(shù)據(jù)的初始化步驟,以及
發(fā)表于 12-11 14:26
?3.8w次閱讀

使用STM32單片機(jī)讀取MPU6050傳感器數(shù)據(jù)的程序免費(fèi)下載
本文檔的主要內(nèi)容詳細(xì)介紹的是使用STM32單片機(jī)讀取MPU6050傳感器數(shù)據(jù)的程序免費(fèi)下載。
發(fā)表于 07-26 17:35
?64次下載

MPU6050六軸傳感器實(shí)驗(yàn)的程序和工程文件免費(fèi)下載
本文檔的主要內(nèi)容詳細(xì)介紹的是MPU6050六軸傳感器實(shí)驗(yàn)的程序和工程文件免費(fèi)下載。
發(fā)表于 09-20 08:00
?16次下載

MPU6050六軸陀螺儀傳感器實(shí)驗(yàn)的資料合集免費(fèi)下載
本文檔的主要內(nèi)容詳細(xì)介紹的是MPU6050六軸陀螺儀傳感器實(shí)驗(yàn)的資料合集免費(fèi)下載。
發(fā)表于 06-02 08:00
?29次下載

基于stm32的mpu6050傳感器實(shí)驗(yàn)
@TOCMPU6050+STM32學(xué)習(xí)筆記學(xué)習(xí)了差不多兩天的mpu6050,參考了很多篇博客還有看一些資料,今晚終于把這個(gè)東西在我的串口顯示
發(fā)表于 12-06 11:36
?9次下載

STM32入門學(xué)習(xí)筆記之MPU6050傳感器解析實(shí)驗(yàn)1
MPU6050是InvenSense公司推出的一款6軸運(yùn)動(dòng)處理芯片,內(nèi)置3軸陀螺儀及3軸速度傳感器,內(nèi)置兩組I2C接口,其中一組用于通信,另一組則用于連接外部磁力傳感器,采用自帶的數(shù)字運(yùn)動(dòng)處理

STM32入門學(xué)習(xí)筆記之MPU6050傳感器解析實(shí)驗(yàn)2
MPU6050是InvenSense公司推出的一款6軸運(yùn)動(dòng)處理芯片,內(nèi)置3軸陀螺儀及3軸速度傳感器,內(nèi)置兩組I2C接口,其中一組用于通信,另一組則用于連接外部磁力傳感器,采用自帶的數(shù)字運(yùn)動(dòng)處理
STM32入門學(xué)習(xí)筆記之MPU6050傳感器解析實(shí)驗(yàn)3
MPU6050是InvenSense公司推出的一款6軸運(yùn)動(dòng)處理芯片,內(nèi)置3軸陀螺儀及3軸速度傳感器,內(nèi)置兩組I2C接口,其中一組用于通信,另一組則用于連接外部磁力傳感器,采用自帶的數(shù)字運(yùn)動(dòng)處理
評(píng)論