STM32HAL库实现JY61P陀螺仪

文章目录

    • 一, JY61P介绍
    • 二, STM32Cubemx配置
      • JY61P代码部分
    • 三,实验现象
    • 四,总结
      • 源码地址

一, JY61P介绍

STM32HAL库实现JY61P陀螺仪_第1张图片

JY61P可以通过串口进行数据通信,这使得它可以与各种设备和控制器进行连接和交互。下面是关于JY61P串口使用的简要介绍:

硬件连接:将JY61P的串口引脚(TX和RX)连接到要使用的设备的串口引脚(如STM32的TX和RX引脚)。同时,确保连接共地(GND)引脚以建立电气连接。

通信协议:JY61P使用标准的串口通信协议,通常是UART或USART。要与JY61P进行通信,需要设置相同的波特率(数据传输速率)、数据位、停止位和奇偶校验位等参数。通常,JY61P的默认波特率是115200。

数据格式:JY61P通过串口发送和接收数据,数据格式通常是ASCII字符或二进制格式。要正确解析JY61P发送的数据,需要了解数据的结构和含义。可以查询JY61P的技术文档或用户手册,获取有关数据格式和解析方法的详细信息。

数据读取:通过串口,可以向JY61P发送指令并读取传感器的数据。可以使用相应的串口读取函数或库函数,从串口接收缓冲区中读取数据。读取的数据可以是姿势、角速度、加速度、磁场等各种传感器数据。

数据处理:读取到的数据可以通过适当的处理方法进行解析、滤波和转换,以满足具体应用的需求。数据处理可以包括单位转换、坐标系变换、滤波算法等操作。

总之,JY61P通过串口进行数据通信,需要进行硬件连接、设置通信协议参数、理解数据格式和解析方法,并使用相应的串口读取函数进行数据读取和处理。这样,就可以与JY61P进行串口通信,并获取传感器数据用于后续的应用。

单片机与模块JY61P连接:
STM32HAL库实现JY61P陀螺仪_第2张图片

二, STM32Cubemx配置

1.配置时钟:外部晶振
STM32HAL库实现JY61P陀螺仪_第3张图片
2.配置时基:串行总线调试(否则只能下载一次)、系统滴答定时器
STM32HAL库实现JY61P陀螺仪_第4张图片
3.配置时钟树:HCLK输入72MHZ主频,回车自动分配时钟树
STM32HAL库实现JY61P陀螺仪_第5张图片
3.串口UART配置
STM32HAL库实现JY61P陀螺仪_第6张图片
下面还要开启中断
STM32HAL库实现JY61P陀螺仪_第7张图片
4.OLED模块配置
下面直接勾选I2C1即可
STM32HAL库实现JY61P陀螺仪_第8张图片

JY61P代码部分

mian.c主函数代码:

#include "main.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include 
#include 
#include 
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
uint8_t YAWCMD[3] = {0XFF,0XAA,0X52};
uint8_t ACCCMD[3] = {0XFF,0XAA,0X67};
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

#define GYROSCOPE_BUFFER_SIZE    33
#define GYROSCOPE_CH_DATA_SIZE   10
uint8_t GyroscopeUsart3RxBuffer[GYROSCOPE_BUFFER_SIZE];      //接收缓存
double GyroscopeChannelData[GYROSCOPE_CH_DATA_SIZE];
uint8_t tempBuffer=0,RxBuffer;
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart2, (uint8_t *)GyroscopeUsart3RxBuffer,33);   //开启接收中断,并保证开启成功 
  while(GyroscopeUsart3RxBuffer[0] != 0x55)
  {
		HAL_UART_Receive_IT(&huart2, (uint8_t *)GyroscopeUsart3RxBuffer,33);   //开启接收中断,并保证开启成功 	
  };
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */	
  }
  /* USER CODE END 3 */
}
/* USER CODE BEGIN 4 */
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) //中断回调函数
{
        if(RESET != __HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE))   //判断是否是空闲中断
        {
            __HAL_UART_CLEAR_IDLEFLAG(&huart2);                     //清楚空闲中断标志(否则会一直不断进入中断)
            HAL_UART_RxCpltCallback(&huart2);                          //调用中断处理函数
        }	
}

static void GYROSCOPE_DATA_Decoder(uint8_t *buf)
{
    if(buf[1] == 0x51)//解析X、Y、Z加速度数据
    {
        GyroscopeChannelData[0] = (int16_t)((int16_t)buf[3]<<8|buf[2])/32768.0*16.0;//X轴加速度(m/s*s)
        GyroscopeChannelData[1] = (int16_t)((int16_t)buf[5]<<8|buf[4])/32768.0*16.0;//Y轴加速度
        GyroscopeChannelData[2] = (int16_t)((int16_t)buf[7]<<8|buf[6])/32768.0*16.0;//Z轴加速度
        GyroscopeChannelData[9] = (int16_t)((int16_t)buf[9]<<8|buf[8])/100.0;//实时温度(摄氏度)
			  
    }

    if(buf[12] == 0x52)//解析X、Y、Z角速度数据
    {
        GyroscopeChannelData[3] = (int16_t)((int16_t)buf[14]<<8|buf[13])/32768.0*2000.0;//X轴角速度(°/s)
        GyroscopeChannelData[4] = (int16_t)((int16_t)buf[16]<<8|buf[15])/32768.0*2000.0;//Y轴角速度
        GyroscopeChannelData[5] = (int16_t)((int16_t)buf[18]<<8|buf[17])/32768.0*2000.0;//Z轴角速度
    }
 
    if(buf[23] == 0x53)//解析X、Y、Z角度数据
    {
        GyroscopeChannelData[6] = (int16_t)((int16_t)buf[25]<<8|buf[24])/32768.0*180.0;//X轴(滚转角)角度(°)
        GyroscopeChannelData[7] = (int16_t)((int16_t)buf[27]<<8|buf[26])/32768.0*180.0;//Y轴(俯仰角)角度
        GyroscopeChannelData[8] = (int16_t)((int16_t)buf[29]<<8|buf[28])/32768.0*180.0;//Z轴(偏航角)角度
        //GyroscopeChannelData[9] = (double)((int16_t)buf[31]<<8|(int16_t)buf[30])/100.0;//实时温度(摄氏度)
    }	
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //中断处理函数
{
    if(huart == &huart2)
	{
        if(GyroscopeUsart3RxBuffer[0] == 0x55)
		{       
			uint16_t AccelerationSumData = 0,AngularSumData = 0,AngleSumData = 0;
            for(uint8_t index=0; index<GYROSCOPE_BUFFER_SIZE/3-1; index++)//求加速度校验和
			{
				AccelerationSumData += GyroscopeUsart3RxBuffer[index];
			}

			for(uint8_t index=GYROSCOPE_BUFFER_SIZE/3; index<2*GYROSCOPE_BUFFER_SIZE/3-1; index++)//求角速度校验和
			{
				AngularSumData += GyroscopeUsart3RxBuffer[index];
			}

			for(uint8_t index=2*GYROSCOPE_BUFFER_SIZE/3; index<GYROSCOPE_BUFFER_SIZE-1; index++)//求角度校验和
			{
				AngleSumData += GyroscopeUsart3RxBuffer[index];
			} 
						
    		if(GyroscopeUsart3RxBuffer[GYROSCOPE_BUFFER_SIZE/3-1] == (uint8_t)(AccelerationSumData&0X00FF)
			&& GyroscopeUsart3RxBuffer[2*GYROSCOPE_BUFFER_SIZE/3-1] == (uint8_t)(AngularSumData&0X00FF)
			&& GyroscopeUsart3RxBuffer[GYROSCOPE_BUFFER_SIZE-1] == (uint8_t)(AngleSumData&0X00FF))
			{
				GYROSCOPE_DATA_Decoder(GyroscopeUsart3RxBuffer);
				HAL_UART_Receive_IT(&huart2, (uint8_t *)GyroscopeUsart3RxBuffer,33);  
			}			
            else
			{
			HAL_UART_Receive_IT(&huart2, (uint8_t *)GyroscopeUsart3RxBuffer,33); 					    
			}							
        }
		else 
		{
			memset(GyroscopeUsart3RxBuffer,0x00,sizeof(GyroscopeUsart3RxBuffer));		
			HAL_UART_Receive_IT(&huart2, (uint8_t *)GyroscopeUsart3RxBuffer,33);  					
		}
          
	}
}
/* USER CODE END 4 */

三,实验现象

JY61P陀螺仪

四,总结

JY61P陀螺仪在某些情况下可能存在精准度不高的问题,可能会对姿态感知和运动跟踪的准确性产生影响。另外,其使用方法可能具有一定的复杂性,需要一定的技术知识和调校经验。建议在选择使用之前仔细考虑其适用性和需求。

源码地址

链接:https://pan.baidu.com/s/13HpeaYE70aQpGVw2BhLDEg?pwd=bovk
提取码:bovk。

你可能感兴趣的:(stm32,mongodb,嵌入式硬件)