STM32实现六轴姿态测量陀螺仪模块JY61P(标准库与HAL库实现)
Posted 小材大用
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32实现六轴姿态测量陀螺仪模块JY61P(标准库与HAL库实现)相关的知识,希望对你有一定的参考价值。
本模块支持串口采用串口实现数据采集和处理
设备型号选择
目录
单片机选择:STM32F103
维特智能六轴加速度电子陀螺仪传感器姿态角度测量模块:JY61P
六轴姿态测量陀螺仪模块简介
产品概述
- 该产品是基于MEMS技术的高性能三维运动姿态测量系统。它包含三轴陀螺仪、三轴加速度计。通过集成各种高性能传感器和运用自主研发的姿态动力学核心算法引擎,结合高动态卡尔曼滤波融合算法,为客户提供高精度、高动态、实时补偿的三轴姿态角度,通过对各类数据的灵活选择配置,满足不同的应用场景。
- 领先的基于 Kalman 滤波原理并具有自主知识产权的传感器融合算法,可以实时提供高达 200Hz 更新率的数据,从而满足各种高精度的应用需求,实现准确的动作捕捉和姿态估计。
- 拥有国内领先的高精度转台设备仪器,产品内部集成自主研发的高精度校准和标定算法,提高产品的测量精度。
- 同时提供用户所需要的各种上位机、使用说明、开发手册、开发代码,使得针对各类需求的研发产品特点时间降至最低。
产品特点
- 模块集成高精度的陀螺仪、加速度计,采用高性能的微处理器和先进的动力学解算与卡尔曼动态滤波算法,能够快速求解出模块当前的实时运动姿态。
- 采用先进的数字滤波技术,能有效降低测量噪声,提高测量精度。
- 模块内部集成了姿态解算器,配合动态卡尔曼滤波算法,能够在动态环境下准确输出模块的当前姿态, 姿态测量精度 0.2度 ,稳定性极高,性能甚至优于某些专业的倾角仪。
- 模块内部自带电压稳定电路,工作电压3.3~5V,引脚电平兼容3.3V/5V的嵌入式系统,连接方便。
- 支持串口和IIC两种数字接口。方便用户选择最佳的连接方式。串口速率4800bps~230400bps可调,IIC接口支持全速400K速率。
- 最高200Hz数据输出速率。输出内容可以任意选择,输出速率0.2~200Hz可调节。
- 保留4路扩展端口,可以分别配置为模拟输入,数字输入,数字输出等功能。
- 具备GPS连接能力。可接受符合NMEA-0183标准的串口GPS数据,形成GPS-IMU组合导航单元。
- 采用邮票孔镀金工艺,可嵌入用户的PCB板中。
- 4层PCB板工艺,更薄、更小、更可靠。
引脚说明
模块UART与MCU连接
应用领域
● 虚拟现实/增强现实,头戴显示器
● 大规模农业自动耕种
● 高空作业安全监控
● 无人机,载人飞行器
● 工业姿态监控
● 人体动作跟踪/捕捉
● 机器人,自动引导运输车
● 行人导航
● 无人驾驶/辅助驾驶
● 军事,智能武器装备
模块与单片机的接线表设计
序号 | 激光测距模块 | 单片机STM32 |
1 | VCC | 3.3V/5V |
2 | RXD | PA2(USART2_TX) |
3 | TXD | PA3(USART2_RX) |
4 | SCL | |
5 | SDA | |
6 | GND | GND |
7 | - | PA9(USART1_TX) |
8 | - | PA10(USART1_RX) |
标准库实现
核心代码如下:
void USART2_IRQHandler(void) //串口2中断服务程序
char tempBuffer[100] = ""; // 中间转存数组
char i = 0; // 循环变量
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清除标志位
aRxBuffer =USART_ReceiveData(USART2);//(USART1->DR); //读取接收到的数据
RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer; // 接收数据
if(2 == Uart1_Rx_Cnt && (0X55 != RxBuffer[0] || 0X51 != RxBuffer[1]))
memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
Uart1_Rx_Cnt = 0; // 置0
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断 为了处理数据
return;
if(44 == Uart1_Rx_Cnt)
RxSucceeflag = 1; // 数据成功接收标志
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//关闭串口接受中断 为了处理数据
if(0X51 == RxBuffer[1])
memset(tempBuffer,0x00,sizeof(tempBuffer)); //清空数组
for(i=0;i<11;i++)
tempBuffer[i] = RxBuffer[i];
if(1 == checkSum(tempBuffer))
aX = (float)((float)((RxBuffer[3]<<8)|RxBuffer[2])/32768.0*16*9.8);
aY = (float)((float)((RxBuffer[5]<<8)|RxBuffer[4])/32768.0*16*9.8);
aZ = (float)((float)((RxBuffer[7]<<8)|RxBuffer[6])/32768.0*16*9.8);
//USART_SendData(USART1, 'A');
if(0X52 == RxBuffer[12])
memset(tempBuffer,0x00,sizeof(tempBuffer)); //清空数组
for(i=11;i<22;i++)
tempBuffer[i-11] = RxBuffer[i];
if(1 == checkSum(RxBuffer))
wX = (float)(((RxBuffer[14]<<8)|RxBuffer[13])/32768.0*2000);
wY = (float)(((RxBuffer[16]<<8)|RxBuffer[15])/32768.0*2000);
wZ = (float)(((RxBuffer[18]<<8)|RxBuffer[17])/32768.0*2000);
//USART_SendData(USART1, 'B');
if(0X53 == RxBuffer[23])
memset(tempBuffer,0x00,sizeof(tempBuffer)); //清空数组
for(i=22;i<33;i++)
tempBuffer[i-22] = RxBuffer[i];
if(1 == checkSum(RxBuffer))
RollX = (float)(((RxBuffer[25]<<8)|RxBuffer[24])/32768.0*180);
PitchY = (float)(((RxBuffer[27]<<8)|RxBuffer[26])/32768.0*180);
YawZ = (float)(((RxBuffer[29]<<8)|RxBuffer[28])/32768.0*180);
//USART_SendData(USART1, 'C');
memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
Uart1_Rx_Cnt = 0; // 置0
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断 为了处理数据
实现效果:
HAL库实现
核心代码:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
char tempBuffer[100] = ""; // 中间转存数组
char i = 0; // 循环变量
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_UART_TxCpltCallback could be implemented in the user file
*/
if(huart == &huart2)
//while(HAL_OK != HAL_UART_Transmit(&huart1, (uint8_t *)RxBuffer, 44,0xFFFF)); // 输出指定长度
if(0X55 != RxBuffer[0] || 0X51 != RxBuffer[1])
memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
while(HAL_OK != HAL_UART_Transmit(&huart1, (uint8_t *)"ERROR", 5,0xFFFF)); // 输出指定长度
while(HAL_OK != HAL_UART_Receive_IT(&huart2, (uint8_t *)RxBuffer, 44)); //开启接收中断,并保证开启成功
return;
RxSucceeflag = 1; // 数据成功接收标志
if(0X51 == RxBuffer[1])
memset(tempBuffer,0x00,sizeof(tempBuffer)); //清空数组
for(i=0;i<11;i++)
tempBuffer[i] = RxBuffer[i];
if(1 == checkSum(tempBuffer))
aX = (float)((float)((RxBuffer[3]<<8)|RxBuffer[2])/32768.0*16*9.8);
aY = (float)((float)((RxBuffer[5]<<8)|RxBuffer[4])/32768.0*16*9.8);
aZ = (float)((float)((RxBuffer[7]<<8)|RxBuffer[6])/32768.0*16*9.8);
//while(HAL_OK != HAL_UART_Transmit(&huart1, (uint8_t *)"加速度\\r\\n", strlen("加速度\\r\\n"),0xFFFF));
if(0X52 == RxBuffer[12])
memset(tempBuffer,0x00,sizeof(tempBuffer)); //清空数组
for(i=11;i<22;i++)
tempBuffer[i-11] = RxBuffer[i];
if(1 == checkSum(RxBuffer))
wX = (float)(((RxBuffer[14]<<8)|RxBuffer[13])/32768.0*2000);
wY = (float)(((RxBuffer[16]<<8)|RxBuffer[15])/32768.0*2000);
wZ = (float)(((RxBuffer[18]<<8)|RxBuffer[17])/32768.0*2000);
//while(HAL_OK != HAL_UART_Transmit(&huart1, (uint8_t *)"角速度\\r\\n", strlen("角速度\\r\\n"),0xFFFF));
if(0X53 == RxBuffer[23])
memset(tempBuffer,0x00,sizeof(tempBuffer)); //清空数组
for(i=22;i<33;i++)
tempBuffer[i-22] = RxBuffer[i];
if(1 == checkSum(RxBuffer))
RollX = (float)(((RxBuffer[25]<<8)|RxBuffer[24])/32768.0*180);
PitchY = (float)(((RxBuffer[27]<<8)|RxBuffer[26])/32768.0*180);
YawZ = (float)(((RxBuffer[29]<<8)|RxBuffer[28])/32768.0*180);
//while(HAL_OK != HAL_UART_Transmit(&huart1, (uint8_t *)"滚转角\\r\\n", strlen("滚转角\\r\\n"),0xFFFF));
memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
while(HAL_OK != HAL_UART_Receive_IT(&huart2, (uint8_t *)RxBuffer, 44)); //开启接收中断,并保证开启成功
实现效果:
如有问题或需求可私信交流
源码链接(标准库与HAL库):
STM32实现六轴姿态测量陀螺仪模块JY61P(标准库与HAL库实现)-C文档类资源-CSDN文库
以上是关于STM32实现六轴姿态测量陀螺仪模块JY61P(标准库与HAL库实现)的主要内容,如果未能解决你的问题,请参考以下文章