技术参数
引脚说明
通信协议
串口:(默认115200波特率)
(1) 参数:
波特率 | 校验位 | 数据位 | 停止位 |
---|---|---|---|
9600 | N | 8 | 1 |
115200 | N | 8 | 1 |
(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++);
}
}