目录
毫米波雷达模块选择
毫米波雷达我选择的了Seeedstudio企业的淘宝官方店铺,毫米波雷达包含有呼吸心跳检测雷达,人体存在感应雷达,睡眠呼吸等等,其单个模块并非只有单一功能,需要开发者根据原始数据分析解析。
硬件连接示意图
原始数据分析
由于毫米波模块是默认输出的,一直在不停歇的发送数据,所以或者原始数据可通过直接连接USB-TTL或者与STM32连接,串口打开就可以发现串口出现数据啦
在SEEK官网又说明每一位数据的意义,部分数据解析如下
该数据由帧头:0x53 0x59,控制字:0x80,命令字:0x81,长度标识符:0x00 0x01,数据:0x0F, 校验和:1Byte (SUM),帧结束:0x54 0x43
最终数据解析显示
根据原始数据,我们可通过STM32的DMA将接收到的原始数据单字节的进行解析,逐一的进行判断,部分代码如下:
串口获取原始数据
usart.c
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(uartHandle->Instance==USART1)
{
/* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE END USART1_MspInit 0 */
/* USART1 clock enable */
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN USART1_MspInit 1 */
/* USER CODE END USART1_MspInit 1 */
}
else if(uartHandle->Instance==USART2)
{
/* USER CODE BEGIN USART2_MspInit 0 */
/* USER CODE END USART2_MspInit 0 */
/* USART2 clock enable */
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART2 GPIO Configuration
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART2 DMA Init */
/* USART2_RX Init */
hdma_usart2_rx.Instance = DMA1_Channel6;
hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_rx.Init.Mode = DMA_CIRCULAR;
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx);
/* USART2 interrupt Init */
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
/* USER CODE BEGIN USART2_MspInit 1 */
/* USER CODE END USART2_MspInit 1 */
}
}
数据处理函数
Data.c
void ProcessRx(uint8_t *buff, uint8_t size)
{
/****************************************************************************/
uint8_t receivedbyte, rx_sum, command;
//Êý¾Ý´æ´¢Êý×é
uint8_t rx_data[10];
uint16_t rx_dategram_len;
while (size)
{
switch (rx_datagram_state)
{
case IDLE: //ÔÚ¿ÕÏÐʱ£¬ÅжÏÊÇ·ñ¶ÁÈ¡Ö¡Í·1
{
receivedbyte = *buff;
if (BEGIN1 == receivedbyte)
{
// printf("HEADER1:%x\r\n", *buff);
rx_sum = 0;
rx_sum += receivedbyte;
rx_datagram_state = SEEN_HEADER1;
buff++;
}
break;
}
case ...:
case ...:
case ...:
case ...:
case ...:
case SEEN_SUM:
{
rx_datagram_state = (MD_END1 == *buff) ? SEEN_END1 : IDLE;
}
break;
case SEEN_END1:
{
rx_datagram_state = (MD_END2 == *buff) ? SEEN_END2 : IDLE;
}
break;
case SEEN_END2:
{
// rx_flag = 1;
rx_datagram_state = IDLE;
}
break;
default:
{
receivedbyte = 0;
rx_datagram_state = IDLE;
size = 0;
break;
}
}
size--;
}
中断处理函数
it.c
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
USER_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
主函数代码
main.c
实验效果展示
该模块有最大的缺点:当多人出现在模块的测量范围时会出现检测不准,出现不稳定情况等等。文章来源:https://www.toymoban.com/news/detail-792384.html
除此之外,还有睡眠呼吸等等均类似。文章来源地址https://www.toymoban.com/news/detail-792384.html
到了这里,关于STM32基于毫米波雷达的生命体征检测系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!