STM32基于毫米波雷达的生命体征检测系统

目录

毫米波雷达模块选择

毫米波雷达我选择的了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

实验效果展示

该模块有最大的缺点:当多人出现在模块的测量范围时会出现检测不准,出现不稳定情况等等。

除此之外,还有睡眠呼吸等等均类似。

在EURO NCAP 2025 Roadmap中,规划车内儿童存在检测的需求,促使汽车制造商在未来产品设计上须提供此功能。 借此帮助解决识别独自遗留在汽车中的儿童和警告驾驶员的问题,添加儿童存在检测功能可提高汽车的整体安全等级。 在此, 世平兴业特别介绍以TI IWR1642 雷达单芯片为主的模组,作为车内生命探测检测的推荐方案,其产品特点如下 1.其基于77GHz mmWave 射频互补金属氧化物半导体(RFCMOS)技术。调频连续波(FMCW)雷达可实现精确测量距离和相对速度。 2.可提供高达4 GHz的超宽频宽,能够以高于24-GHz窄带解决方案16倍的精度感测物体和运动。 3.雷达相对不受常见的环境条件的影响 如:灰尘,烟,光线….等。因为FMCW雷达传输特定信号并处理反射,它们可以在完全黑暗和明亮的日光下工作(雷达不受眩光影响)。 与超声波相比,雷达通常具有更长的距离和更快的传输时间信号。 此模组可结合3rd-party算法运作检测并安装于车内中,资讯可借由通讯协定(车厂规定或者T-Box所支援)透过UART/CAN Bus界面传递至车内T-Box。 T-Box端可接收模组所侦测到的生命迹象相关资料(人数/呼吸/心跳) ,进行资料采集以及监控的动作。 进一步更可以借此与车况资讯做判断,提供异常提醒或者通过CAN汇流排发送控制讯号对车辆控制。 其整理优点如下 1. 可稳定的用于车内之儿童存在检测,并进一步可让车辆在车内有生命迹象状况下无法上锁。 2. 另外可检测乘员生命特征,例如监控驾驶员健康状况,在发生车祸时部署安全气囊,提醒乘客使用安全带等,同时保持乘员身份不依赖相机进行存在检测的隐私 场景应用图产品实体图展示板照片方案方块图实车上测试示意图车内乘客呼吸心跳侦测示意图芯片功能核心技术优势IWR1642感测器的主要特性和优势包括: 1, 智能边缘自主运算: 整合的处理能力让感测器能减少误报并做出即时决策,免除了在许多系统中尚需使用额外微控制器或处理器的需求。 2, 最高分辨率感测: 超宽宽频毫米波感测器能侦测到物体、人以及非常细微的动作(如:呼吸和打字),且此感测器的分辨率为24GHz感测器的16倍。 3, 优化的感测功能: 毫米波技术实现了更智慧的人员计算、动作侦测、 机器人技术、安全防护和生命迹象监测等。 4, 强化的系统准确度: 77GHz毫米波感测器能操作在拥挤的空间,或各种照明和环境条件下, 且能穿透玻璃、塑胶和石膏板等材料进行运作,强化了现有系统的准确度。 5, 简化的产品设计: 设计师可以立即使用平台进行设计,此平台涵盖天线封装、可扩充的软体平台、特定应用算法和多种参考设计。方案规格1. 方案采用的 TI IWR1642 单片高集成 FMCW 雷达感测器芯片,尺寸小,集成度高 2. 芯片内含C674X DSP,可以实现客户特殊的雷达信号处理算法,同时片内 RAM 增加到 1.5MB。 3. 可以提供最大 4G Hz 的射频带宽以及0.01% 的线性度,可以实现更高的分辨率; 4. 因为 CMOS 工艺,将射频和和数位集成在单个雷达芯片上。可以更有效的实现线上即时监测和调试; 5. 方案精度高,测距精度可达 4cm。人体感测距离建议40M内 方案来源:大大通
STM32微控制器配合毫米波雷达(MMW)用于许多物联网(IoT)和自动驾驶应用中,通常会涉及到射频(RF)前端、信号处理以及数据通信部分。由于具体的电路图可能会因厂商、型号和设计细节不同而有所差异,这里提供一个通用的概述: 1. **RF前端**:毫米波雷达的核心是发射和接收模块。STM32控制脉冲发生器生成射频频谱,驱动天线发送短脉冲。接收端则通过天线捕获反射回来的回波信号。 2. **混频和滤波**:接收到的信号经过低噪声放大器(LNA),然后进入混频器将信号频率降低到可处理的范围,并去除无用的噪声。 3. **解调和数字信号处理**:混频后的信号被送入解调器,通常是锁相环(PLL)或直接数字化。STM32内部或外挂的ADC将模拟信号转换为数字信号,通过专用的算法计算距离、速度等信息。 4. **基带处理器**:STM32负责处理这些数字信号,执行如FFT(快速傅里叶变换)、目标检测、跟踪等任务。 5. **I/O接口**:可能包括SPI、USART或其他接口,用来连接外部存储器、显示器或者其他传感器,以便于数据交互和系统集成。 6. **电源管理**:确保电源稳定并高效地为所有组件供电。 由于毫米波雷达设计涉及硬件专业知识,具体电路图需要查看相关的硬件手册或设计文档,这些资料通常包含详细的连接图、元件布局图等。如果你需要帮助理解特定STM32毫米波雷达的具体电路配置,可以询问关于某一款STM32系列芯片的配套开发板或评估板的设计资料,或者针对某个硬件平台的技术支持文档。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值