本模块支持串口采用串口实现数据采集和处理
目录
设备型号选择
六轴姿态测量陀螺仪模块简介
产品概述
产品特点
引脚说明
模块UART与MCU连接
应用领域
模块与单片机的接线表设计
标准库实现
HAL库实现
单片机选择:STM32F103
维特智能六轴加速度电子陀螺仪传感器姿态角度测量模块:JY61P
● 虚拟现实/增强现实,头戴显示器
● 大规模农业自动耕种
● 高空作业安全监控
● 无人机,载人飞行器
● 工业姿态监控
● 人体动作跟踪/捕捉
● 机器人,自动引导运输车
● 行人导航
● 无人驾驶/辅助驾驶
● 军事,智能武器装备
序号 | 激光测距模块 | 单片机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);//开启串口接受中断 为了处理数据
}
}
}
实现效果:
核心代码:
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文库
吾芯电子工作室