STM32—驱动GY85-IMU模块

本文介绍了如何使用STM32通过软件IIC协议驱动GY85惯性测量模块,该模块包含三轴加速度计、陀螺仪、电子罗盘和气压传感器。代码实现读取各传感器数据并存储为全局变量。GY85能够提供设备速度、方向和重力信息,可用于惯导算法融合。
摘要由CSDN通过智能技术生成

GY85是一个惯性测量模块,内部集成了三轴加速度计、三轴陀螺仪、电子罗盘、气压传感器等芯片,用于测量和报告设备速度、方向、重力,模块可以将加速度计、陀螺仪、电子罗盘等传感器的数据进行综合,在上位机可以结合各种数据进行惯导算法融合。
这里介绍一下STM32驱动GY85的代码,模块与STM32的通信接口是IIC协议,我们采用软件IO口模拟IIC时序进行通信,读取到各个芯片的数据存放在全局变量,关于GY85的介绍以及一些基础知识可以参考这篇博客:点击跳转

芯片说明:

  • ADXL345:三轴加速度计,测量Roll、Pitch(航偏角Yaw无法测量)
  • L3G4200D:三轴陀螺仪,测量Roll、Pitch、Yaw(配合加速度计得出准确温度的三个角度)
  • HMC5883L:电子罗盘,测量与地磁北极的偏转角度
  • BMP085:气压传感器,测量大气压、温度

下面就是全部的驱动代码了:


/*******************************************************************************
*  函数功能:串口2发送数据  HMC5883L	+ ADXL345 + BMP085+L3G4200D(串口2在mian初始化完成)
*  波特率:115200
*  时间:2020.7.12
*  修改注释:全
*******************************************************************************/

/*芯片说明
 *ADXL345:三轴加速度计,测量Roll、Pitch(航偏角Yaw无法测量)
 *L3G4200D:三轴陀螺仪,测量Roll、Pitch、Yaw(配合加速度计得出准确温度的三个角度)
 *HMC5883L:电子罗盘,测量与地磁北极的偏转角度
 *BMP085:气压传感器,测量大气压、温度
*/

#include "IMU.h"

GPIO_InitTypeDef GPIO_InitStructure;
ErrorStatus HSEStartUpStatus;


#define   FALSE 0
#define   TRUE  1

#define   u8 unsigned char
#define   u32 unsigned int
#define   uchar unsigned char
#define   uint unsigned int	
#define   OSS 0	 //	BMP085使用

//L3G4200D内部寄存器
#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define CTRL_REG4 0x23
#define CTRL_REG5 0x24
#define OUT_X_L 0x28
#define OUT_X_H 0x29
#define OUT_Y_L 0x2A
#define OUT_Y_H 0x2B
#define OUT_Z_L 0x2C
#define OUT_Z_H 0x2D

//定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
#define	HMC5883L_Addr   0x3C	//磁场传感器器件地址
#define	ADXL345_Addr    0xA6	//加速度传感器器件地址
#define	BMP085_Addr     0xee	//气压传感器器件地址
#define	L3G4200_Addr    0xD2	//陀螺仪传感器器件地址

unsigned char BUF[8];                   //接收数据缓存区,作用是暂时缓存寄存器的值,之后做算法分析
char  test=0; 
int   x,y;
uchar ge,shi,bai,qian,wan,shiwan;           //uart,显示变量


short T_X,T_Y,T_Z;                     //陀螺仪输出数据
float angle;                           //电子罗盘输出角度,与地磁北极的偏转角度

/* 加速度计ADXL345 数据 */
int A_X,A_Y,A_Z;                       //加速度计读取的寄存器数据
short data_xyz[3];                     //加速度计合成数据
float Q,T,K;                           //加速度计x、y、z原始数据
float Roll,Pitch;                      //Roll,Pitch角度


/* BMP085使用的变量 */
short ac1;
short ac2; 
short ac3; 
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
short b1; 
short b2;
short mb;
short mc;
short md;

long  temperature;   //温度
long  pressure;      //气压


 //************************************++++++++++++++++++++++++++++++++
/*模拟IIC端口输出输入定义
 *SDA:PB9
 *SCL:PB8
*/
#define SCL_H         GPIOB->BSRR = GPIO_Pin_8
#define SCL_L         GPIOB->BRR  = GPIO_Pin_8
   
#define SDA_H         GPIOB->BSRR = GPIO_Pin_9
#define SDA_L         GPIOB->BRR  = GPIO_Pin_9

#define SCL_read      GPIOB->IDR  & GPIO_Pin_8
#define SDA_read      GPIOB->IDR  & GPIO_Pin_9



/* 转换数据 */
void conversion(long temp_data)  
{
        
    shiwan=temp_data/100000+0x30 ;
    temp_data=temp_data%100000;   //取余运算 
    wan=temp_data/10000+0x30 ;
    temp_data=temp_data%10000;   //取余运算
	qian=temp_data/1000+0x30 ;
    temp_data=temp_data%1000;    //取余运算
    bai=temp_data/100+0x30   ;
    temp_data=temp_data%100;     //取余运算
    shi=temp_data/10+0x30    ;
    temp_data=temp_data%10;      //取余运算
    ge=temp_data+0x30; 	
}
/*******************************************************************************
* Function Name  : I2C_GPIO_Config
* Description    : Configration Simulation IIC GPIO
* Input          : None 
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_GPIO_Config(void)
{
   
  GPIO_InitTypeDef  GPIO_InitStructure; 
 
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8|GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
  GPIO_Init(GPIOB, &GPIO_InitStructure);

}

/*******************************************************************************
* Function Name  : I2C_delay
* Description    : Simulation IIC Timing series delay
* Input          : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_delay(void)
{
   
		
   u8 i=30; //这里可以优化速度	,经测试最低到5还能写入
   while(i) 
   {
    
     i--; 
   }  
}

void delay5ms(void)
{
   
		
   int i=5000;  
   while(i) 
   {
    
     i--; 
   }  
}
/*******************************************************************************
* Function Name  : I2C_Start
* Description    : Master Start Simulation IIC Communication
* Input          : None
* Output         : None
* Return         : Wheather	 Start
****************************************************************************** */
uint8_t I2C_Start(void)
{
   
	SDA_H;
	SCL_H;
	I2C_delay();
	if(!SDA_read)return FALSE;	//SDA线为低电平则总线忙,退出
	SDA_L;
	I2C_delay();
	if(SDA_read) return FALSE;	//SDA线为高电平则总线出错,退出
	SDA_L;
	I2C_delay();
	return TRUE;
}
/*******************************************************************************
* Function Name  : I2C_Stop
* Description    : Master Stop Simulation IIC Communication
* Input          : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_Stop(void)
{
   
	SCL_L;
	I2C_delay();
	SDA_L;
	I2C_delay();
	SCL_H;
	I2C_delay();
	SDA_H;
	I2C_delay();
} 
/*******************************************************************************
* Function Name  : I2C_Ack
* Description    : Master Send Acknowledge Single
* Input          : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_Ack(void)
{
   	
	SCL_L;
	I2C_delay();
	SDA_L;
	I2C_delay();
	SCL_H;
	I2C_delay();
	SCL_L;
	I2C_delay();
}   
/*******************************************************************************
* Function Name  : I2C_NoAck
* Description    : Master Send No Acknowledge Single
* Input          : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_NoAck(void)
{
   	
	SCL_L;
	I2C_delay();
	SDA_H;
	I2C_delay();
	SCL_H;
	I2C_delay();
	SCL_L;
	I2C_delay();
} 
/*******************************************************************************
* Function Name  : I2C_WaitAck
* Description    : Master Reserive Slave Acknowledge Single
* Input          : None
* Output         : None
* Return         : Wheather	 Reserive Slave Acknowledge Single
****************************************************************************** */
uint8_t I2C_WaitAck(void) 	 //返回为:=1有ACK,=0无ACK
{
   
	SCL_L;
	I2C_delay();
	SDA_H;			
	I2C_delay();
	SCL_H;
	I2C_delay();
  • 6
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值