陀螺仪GY25Z使用

技术参数

在这里插入图片描述

引脚说明

在这里插入图片描述

通信协议

串口:(默认115200波特率)
(1) 参数:

波特率校验位数据位停止位
9600N81
115200N81

(2)模块输出格式(每帧11-25字节,十六进制)
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

数据处理

温度、欧拉角均为放大100倍后输出;
陀螺仪、加速度计均为未放大输出;

数据解析:
在这里插入图片描述
指令:
发送数据设置指令:0xA5 0x55 0xXX sum

其中0xXX对应Byte2,相应位置1表示输出,sum表示无符号8bit校验和,

自动/查询设置指令:
自动: 0xA5 0x56 0x02 0xFD
查询: 0xA5 0x56 0x01 0xFC

加陀/磁力校准指令:
加陀校准: 0xA5 0x57 0x01 0xFD
磁力校准: 0xA5 0x57 0x02 0xFE

加陀校准方法:水平放置模块(水平模式),发送加陀校准指令给模块

波特率设置指令:
11520: 0xA5 0x58 0x01 0xFE
9600 : 0xA5 0x58 0x02 0xFF
(也可以短接模块左侧的焊点设置为9600)

更新频率设置指令:
10Hz : 0xA5 0x59 0x01 0xFF
50Hz : 0xA5 0x59 0x02 0x00
100Hz :0xA5 0x59 0x03 0x01
200Hz :0xA5 0x59 0x04 0x02
(注意:输出一帧数据花费的时间不得超过更新时间,否则对MCU解算有影响)

水平模式: 0xA5 0x5B 0x02 0x02
竖直模式: 0xA5 0x5B 0x01 0x01

保存/回复设置指令: 0xA5 0x5A 0x01 0x00
(保存当前设置到Flash,重启后按照保存的设运行)

相关程序代码:(内含结算函数Calculate)

#include "gy25z.h"
#include "stdio.h"
#include "lib.h"
#include "string.h"

void GY25Z_Init(void)
{
		//设置刷新频率
	/*
	* 10Hz 输出设置指令-----A5 59 01 FF 
	*	50Hz 输出设置指令-----A5 59 02 00 
	*	100Hz 输出设置指令----A5 59 03 01 
	*	200Hz 输出设置指令----A5 59 04 02
	*/
		USART_SendByte(USART1,0xA5);
		Delay_us(350);
		USART_SendByte(USART1,0x59);
		Delay_us(350);
		USART_SendByte(USART1,0x03);
		Delay_us(350);
		USART_SendByte(USART1,0x01);  //以上是设置刷新频率
	
	/*
	*
	*	115200设置指令:A5 58 01 FE 
	*	9600 设置指令:A5 58 02 FF
	*/
		USART_SendByte(USART1,0xA5);
		Delay_us(350);
		USART_SendByte(USART1,0x58);
		Delay_us(350);
		USART_SendByte(USART1,0x01);
		Delay_us(350);
		USART_SendByte(USART1,0xFE);  //以上是设置波特率
		
		/*
		*	加陀校准指令	A5 57 01 FD
		*	磁力计校准指令:A5 57 02 Fe
		*/
		USART_SendByte(USART1,0xA5);
		Delay_us(350);
		USART_SendByte(USART1,0x57);
		Delay_us(350);
		USART_SendByte(USART1,0x01);
		Delay_us(350);
		USART_SendByte(USART1,0xFD);  //以上是加陀校准

}

void GY25Z_CheckGuide(void)
{
		USART_SendByte(USART1,0xA5);
		Delay_us(350);
		USART_SendByte(USART1,0x56);
		Delay_us(350);
		USART_SendByte(USART1,0x01);
		Delay_us(350);
	USART_SendByte(USART1,0xFC);  //发送查询数据类型的指令(这里直接写死了发送除了温度以外的数据)
}

void GY25Z_Check(void)
{
		USART_SendByte(USART1,0xA5);
		Delay_us(350);
		USART_SendByte(USART1,0x55);
		Delay_us(350);
		USART_SendByte(USART1,0x13);
		Delay_us(350);
		USART_SendByte(USART1,0x0D);   //发送查询数据的指令
}

void GY25Z_Calculate(void)  //解算陀螺仪数据
{
	uint8_t count=0;
	static uint8_t Base_flag=0;
	if(GY25Z_Data.re_state ==1)
	{
		if(GY25Z_Data.rebuf [2]&0x01)
		{
			GY25Z_Data.ACC_X_ori =((GY25Z_Data.rebuf [4]<<8)|GY25Z_Data.rebuf [5]);
			GY25Z_Data.ACC_Y_ori =(GY25Z_Data.rebuf [6]<<8)|GY25Z_Data.rebuf [7];
			GY25Z_Data.ACC_Z_ori =(GY25Z_Data.rebuf [8]<<8)|GY25Z_Data.rebuf [9];
			count=6;
		}
		
		if(GY25Z_Data.rebuf [2]&0x02)
		{
			GY25Z_Data.GYRO_X_ori =(GY25Z_Data.rebuf [4+count]<<8)|GY25Z_Data.rebuf [5+count];
			GY25Z_Data.GYRO_Y_ori =(GY25Z_Data.rebuf [6+count]<<8)|GY25Z_Data.rebuf [7+count];
			GY25Z_Data.GYRO_Z_ori =(GY25Z_Data.rebuf [8+count]<<8)|GY25Z_Data.rebuf [9+count];
			count+=6;
		}
		
		if(GY25Z_Data.rebuf [2]&0x10)
		{
			GY25Z_Data.ROLL_ori  =((GY25Z_Data.rebuf [4+count]<<8)|GY25Z_Data.rebuf [5+count]);
			GY25Z_Data.PITCH_ori =((GY25Z_Data.rebuf [6+count]<<8)|GY25Z_Data.rebuf [7+count]);
			GY25Z_Data.YAW_ori   =((GY25Z_Data.rebuf [8+count]<<8)|GY25Z_Data.rebuf [9+count]);
			count+=6;
		}
		
		if(GY25Z_Data.rebuf [2]&0x40)
		{
			GY25Z_Data.Temp =((GY25Z_Data.rebuf [4+count]<<8)|GY25Z_Data.rebuf [5+count])/100;
			count+=2;
		}
		
		GY25Z_Data.ACC_X=GY25Z_Data.ACC_X_ori/16383.5;
		GY25Z_Data.ACC_Y=GY25Z_Data.ACC_Y_ori/16383.5;
		GY25Z_Data.ACC_Z=GY25Z_Data.ACC_Z_ori/16383.5;
		
		GY25Z_Data.GYRO_X = GY25Z_Data.GYRO_X_ori/16.3835;
		GY25Z_Data.GYRO_Y = GY25Z_Data.GYRO_Y_ori/16.3835;
		GY25Z_Data.GYRO_Z = GY25Z_Data.GYRO_Z_ori/16.3835;
		
		GY25Z_Data.ROLL = GY25Z_Data.ROLL_ori/100;
		GY25Z_Data.PITCH = GY25Z_Data.PITCH_ori/100;
		GY25Z_Data.YAW = GY25Z_Data.YAW_ori/100;
		
		if(Base_flag==0)
		{
			GY25Z_Data.ROLL_Base = GY25Z_Data.ROLL;
			GY25Z_Data.PITCH_Base = GY25Z_Data.PITCH;
			GY25Z_Data.YAW_Base = GY25Z_Data.YAW;
			Base_flag=1;
		}
		GY25Z_Data.re_state =0;
	}
}


void USART1_IRQHandler(void)
{
	  static uint8_t rebuf[30]={0},i=0;
	if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
	{		
		rebuf[i++] = USART_ReceiveData( USART1 );   	
		if(rebuf[0]!=0x5a)  i=0;
		if((i==2)&&(rebuf[1]!=0x5a)) i=0;
		if(i==(rebuf[3]+5))
		{
			memcpy(GY25Z_Data.rebuf ,rebuf,i);
			GY25Z_Data.re_state =1;
			i=0;
		}
		
	}	 
}


void TIM2_IRQHandler(void)
{
	static int tim=0;
	TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	if(tim>=10) tim=0;

	if(tim==0) 
	{	
		GY25Z_CheckGuide();
	}
	
	if(tim==5)
	{
			GY25Z_Calculate();
			printf("\tACC_X=%.2f\t",GY25Z_Data.ACC_X  );
			printf("ACC_Y=%.2f\t",GY25Z_Data.ACC_Y );
			printf("ACC_Z=%.2f\t\n",GY25Z_Data.ACC_Z );
			printf("GYRO_X=%.2f\t",GY25Z_Data.GYRO_X  );
			printf("GYRO_Y=%.2f\t",GY25Z_Data.GYRO_Y );
			printf("GYRO_Z=%.2f\t\n",GY25Z_Data.GYRO_Z );
			printf("ROLL_Base=%.2f\t",GY25Z_Data.ROLL_Base  );
			printf("PITCH_Base=%.2f\t",GY25Z_Data.PITCH_Base );
			printf("YAW_Base=%.2f\t\n",GY25Z_Data.YAW_Base );
			printf("ROLL=%.2f\t",GY25Z_Data.ROLL  );
			printf("PITCH=%.2f\t",GY25Z_Data.PITCH );
			printf("YAW=%.2f\t\n",GY25Z_Data.YAW );
	}
	if(tim==9) 
	{	
		GY25Z_Check();
	}
	tim++;
}



void Delay_us(int a)
{
	int i,j;
	for(i=0;i<10;i++)
	{
		for(j=0;j<a;j++);
	}
}
  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值