STM32驱动GY-25六轴传感器模块(串口通讯)
GY-25T是一款六轴传感器模块,支持串口和IIC接口输出陀螺仪、加速度、温度及欧拉角数据。其工作电压3-5V,更新频率200Hz,角度分辨率0.01°。通过数据融合算法直接输出倾斜角度,无需考虑方向。实验采用串口通信方式,介绍了寄存器配置、波特率修改及数据读取方法,包括原始数据和欧拉角解析示例。代码部分展示了STM32的串口初始化及数据处理流程,实现了角度和温度的实时输出。该模块适用于需要高精度
简介
GY-25T 6DOF六轴传感器模块可利用串口和IIC接口输出陀螺仪原始数据,加速度原始数据,温度数据,欧拉角角度数据。IIC设备地址可修改,以便多个传感器同时挂在总线上。可串口设置倾斜度开关量警报值,引脚输出高低电平。该传感器工作原理,是通过陀螺仪与加速度传感器经过数据融合算法最后得到直接的角度数据。模块可输出传感器模块面与水平面倾斜夹角,面与面的绝对夹角,不需要考虑方向。本次实验采用的是串口的接口方式来输出对应的数据。
特征参数
供电电源:3-5v (内部低压差稳压)
工作电流:9mA
通信方式:串口通讯(波特率2400-230400),IIC 通信(400K以内)
直接输出欧拉角:YAW ROLL PITCH
航向角(YAW ) :±180°
横滚角( ROLL ) :±180°
俯仰角(PITCH) :±180°
更新频率:200Hz (最快)
角度分辨率:0.01°
内部寄存器地址及含义


串口通信
外部设备发送至模块帧描述(单个地址写数据):

模块收到指令后,将响应返回写入帧一样的数据,表示写入成功,返回格式如下:
注意:
如果写内部寄存器超过可写地址范围,则返回错误提示:A4 86 02 2C
如果写内部寄存器配置错误的数据, 则返回错误提示:A4 86 03 2D
模块修改波特率:
配置修改波特率为 115200,主站发送帧为:A4 06 01 06 B1
模块响应帧为:A4 06 01 06 B1 与主站发送帧相同,表示配置修改成功。
掉电保存当前配置:
掉电保存当前所有配置,主站发送帧为:A4 06 05 55 04
模块响应帧为:A4 06 05 55 04 与主站发送帧相同,表示保存成功。
外部设备发送至模块帧描述(单个或多个地址读数据):

模块收到指令后,将响应返回单个或多个地址读取到的数据,返回帧长度跟读取数据量有关,
返回数据格式如下:
如果读“寄存器数量”超过总寄存器数量,则返回错误提示:A4 83 03 2A
如果读“寄存器数量”+“起始寄存器”大于总寄存器数量,则返回错误提示:A4 83 02 29
下面是读取原始数据及欧拉角的示例说明:
主站发送帧为:A4 03 08 12 C1
模块响应帧为:A4 03 08 12 00 07 FF FE 08 0A FF FE 00 00 00 00 00 00 00 24 00 0C 04
帧解析:
起始寄存器 0x08 即从 ACC_X_L 存器开始,寄存器数量 0x12 即 00 07 FF FE 08 0A FF FE 00 00 00 00 00 00 00 24 00 0C 这 18 个寄存器的数据依次输出
加速度原始数据 ACC_X=(0x00<<8)|0x07=7
加速度原始数据 ACC_Y=(0xFF<<8)|0xFE=-2
加速度原始数据 ACC_Z=(0x08<<8)|0x0A=2058
陀螺仪原始数据GYRO_Y=(0x00<<8)|0x00=0
陀螺仪原始数据GYRO_Z=(0x00<<8)|0x00=0
欧拉角角度 ROLL=(0x00<<8)|0x00=0/100=0
欧拉角角度 PITCH=(0x00<<8)|0x24=36/100=0.36
欧拉角角度YAW=(0x00<<8)|0x0C=12/100=0.12
接下来是读取模块内部温度的例子:
主站发送帧为:A4 03 1A 02 C3

模块响应帧为:A4 03 1A 02 0D 1B EB

帧解析:
温度数据 TEMP_H= 0x0D ,TEMP_L=0x1B, 合成 0x0D1B=3355 十进制
十进制 3355 除以 100=33.55 度
设置串口数据连续输出步骤
(1)发送读数据帧:设置好起始寄存器、寄存器数量。
(2)设置输出模式为连续输出模式,即向 03 寄存器写 0。
串口数据查询输出步骤
(1)设置输出模式为查询模式,即向 03 寄存器写 1。
(2)发送读数据帧 :设置好起始寄存器、寄存器数量。
注:数据的输出格式,由读数据发送帧决定。
连续/查询模式由 03 寄存器决定。
如需掉电保存模式,则要发送掉电保存配置指令 05 寄存器写 0x55。
接线
| GY-25 | STM32 | USB-TTL |
|---|---|---|
| VCC | 3.3V | 3.3V |
| GND | GND | GND |
| RX | PA9 | RX |
| TX | PA10 | - |
代码
main.c
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "string.h"
#include "LED.h"
#include "stdio.h"
int fputc(int ch, FILE *f)
{
while (!(USART1->SR & USART_FLAG_TXE));
USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等
return (ch);
}
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_X;
/* 4个抢占优先级,4个响应优先级 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/*抢占优先级可打断中断级别低的中断*/
/*响应优先级按等级执行*/
NVIC_X.NVIC_IRQChannel = USART1_IRQn;//中断向量
NVIC_X.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级
NVIC_X.NVIC_IRQChannelSubPriority = 0;//响应优先级
NVIC_X.NVIC_IRQChannelCmd = ENABLE;//使能中断响应
NVIC_Init(&NVIC_X);
}
typedef struct
{
int16_t temp;
int16_t roll;
int16_t pitch;
int16_t yaw;
} gy;
int main(void)
{
u8 sum=0,i=0;
int16_t data=0;
gy my_25t= {0,0,0,0};
delay_init(72);
NVIC_Configuration();
Usart_Int(9600);
delay_ms(300);//等待模块初始化完成
while(1)
{
if(Receive_ok)//串口接收完毕
{
for(sum=0,i=0; i<(usart_rx_data[3]+4); i++) //rgb_data[3]=3
sum+=usart_rx_data[i];
if(sum==usart_rx_data[i])//校验和判断
{
my_25t.roll=(usart_rx_data[4]<<8)|usart_rx_data[5];
my_25t.pitch=(usart_rx_data[6]<<8)|usart_rx_data[7];
my_25t.yaw=(usart_rx_data[8]<<8)|usart_rx_data[9];
my_25t.temp=(usart_rx_data[10]<<8)|usart_rx_data[12];
printf("roll:%.2f,",(float)my_25t.roll/100.0f);
printf("pitch:%.2f,",(float)my_25t.pitch/100.0f);
printf("yaw:%.2f,",(float)my_25t.yaw/100);
printf("temp:%.2f\r\n ",(float)my_25t.temp/100.0f);
}
else
{
printf(" sum %d\r\n ",sum);
printf(" count %d\r\n ",usart_rx_data[3]+4);
}
Receive_ok=0;//处理数据完毕标志
}
}
}
结果
串口打印欧拉角角度和温度数据:

总结
以上是基于STM32驱动GY-25的原理及串口通讯说明还有代码展示,将欧拉角角度和温度打印到串口,需要注意的是测试时不要用手一直拿着模块,静置着测量,数据才会更准确。
感兴趣的可以关注收藏一下。需要资料代码的可以评论留言。
更多推荐



所有评论(0)