[PSOC™] 【英飞凌 CY8CKIT-062S2-AI评测】-2- 雷达传感器检测人体存在

[复制链接]
17|0
南来之风 发表于 2025-10-29 20:24 | 显示全部楼层 |阅读模式


开发板上的雷达传感器XENSIV™ 60 GHz RADAR sensor (U6) BGT60TR13CE6327XUMA1。BGT60TR13C MMIC是一种集成天线的60 GHz雷达传感器;一个

发射天线和三个接收天线。该传感器集成了l形天线阵列,确保了水平和垂直角度测量。该传感器采用天线封装(AIP)概念,从而消除了用户端天线设计的复杂性,并且PCB可以按照标准进行设计FR4材料。详细信息请参见RADAR传感器网页。雷达传感器使用SPI接口通信,以及中断信号(RSPI_IRQ_P11_0)和复位信号(RXRES_L_P11_1)。


电路图:


雷达传感器初始化:
  1. static int32_t init_sensor(void)
  2. {
  3.     if (cyhal_spi_init(&spi_obj,
  4.                        PIN_XENSIV_BGT60TRXX_SPI_MOSI,
  5.                        PIN_XENSIV_BGT60TRXX_SPI_MISO,
  6.                        PIN_XENSIV_BGT60TRXX_SPI_SCLK,
  7.                        NC,
  8.                        NULL,
  9.                        8,
  10.                        CYHAL_SPI_MODE_00_MSB,
  11.                        false) != CY_RSLT_SUCCESS)
  12.     {
  13.         printf("[MSG] ERROR: cyhal_spi_init failed\n");
  14.         return -1;
  15.     }

  16.     /* Reduce drive strength to improve EMI */
  17.     Cy_GPIO_SetSlewRate(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CY_GPIO_SLEW_FAST);
  18.     Cy_GPIO_SetDriveSel(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CY_GPIO_DRIVE_1_8);
  19.     Cy_GPIO_SetSlewRate(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CY_GPIO_SLEW_FAST);
  20.     Cy_GPIO_SetDriveSel(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CY_GPIO_DRIVE_1_8);

  21.     /* Set the data rate to 25 Mbps */
  22.     if (cyhal_spi_set_frequency(&spi_obj, XENSIV_BGT60TRXX_SPI_FREQUENCY) != CY_RSLT_SUCCESS)
  23.     {
  24.         printf("[MSG] ERROR: cyhal_spi_set_frequency failed\n");
  25.         return -1;
  26.     }

  27. #if defined (TARGET_APP_CYSBSYSKIT_DEV_01) || (TARGET_APP_KIT_BGT60TR13C_EMBEDD)
  28.     /* Enable LDO */
  29.     if (cyhal_gpio_init(PIN_XENSIV_BGT60TRXX_LDO_EN,
  30.                         CYHAL_GPIO_DIR_OUTPUT,
  31.                         CYHAL_GPIO_DRIVE_STRONG,
  32.                         true) != CY_RSLT_SUCCESS)
  33.     {
  34.         printf("[MSG] ERROR: LDO_EN cyhal_gpio_init failed\n");
  35.         return -1;
  36.     }
  37. #endif

  38.     /* Wait LDO stable */
  39.     (void)cyhal_system_delay_ms(5);

  40.     if (xensiv_bgt60trxx_mtb_init(&bgt60_obj,
  41.                                   &spi_obj,
  42.                                   PIN_XENSIV_BGT60TRXX_SPI_CSN,
  43.                                   PIN_XENSIV_BGT60TRXX_RSTN,
  44.                                   register_list_micro_only, // default config with macro settings
  45.                                   XENSIV_BGT60TRXX_CONF_NUM_REGS_MACRO) != CY_RSLT_SUCCESS)
  46.     {
  47.         printf("[MSG] ERROR: xensiv_bgt60trxx_mtb_init failed\n");
  48.         return -1;
  49.     }

  50.     if (xensiv_bgt60trxx_mtb_interrupt_init(&bgt60_obj,
  51.                                             NUM_SAMPLES_PER_FRAME*2,
  52.                                             PIN_XENSIV_BGT60TRXX_IRQ,
  53.                                             GPIO_INTERRUPT_PRIORITY,
  54.                                             xensiv_bgt60trxx_interrupt_handler,
  55.                                             NULL) != CY_RSLT_SUCCESS)
  56.     {
  57.         printf("[MSG] ERROR: xensiv_bgt60trxx_mtb_interrupt_init failed\n");
  58.         return -1;
  59.     }

  60.     return 0;
  61. }


程序主要在main task中进行处理,其主要包括:


* 1。创建一个定时器来切换用户LED

* 2。创建处理RTOS任务

* 3。初始化传感器和led的硬件接口

* 4。初始化雷达设备

* 5。在无限循环中

* -等待来自雷达设备的中断,表明数据可用性

* -读取数据,将其转换为浮点数并通知处理任务

代码如下:
  1. static __NO_RETURN void main_task(void *pvParameters)
  2. {
  3.     (void)pvParameters;
  4.     uint32_t sz;
  5.     uint16_t *data_buff = NULL;
  6.     cy_rslt_t result;
  7.     XENSIV_RADAR_PRESENCE_TIMESTAMP last_timestamp = 0;

  8.     timer_handler = xTimerCreate("timer", pdMS_TO_TICKS(1000), pdTRUE, NULL, timer_callbak);   
  9.     if (timer_handler == NULL)
  10.     {
  11.         CY_ASSERT(0);
  12.     }

  13.     if (xTimerStart(timer_handler, 0) != pdPASS)
  14.     {
  15.         CY_ASSERT(0);
  16.     }

  17.     if (xTaskCreate(processing_task, PROCESSING_TASK_NAME, PROCESSING_TASK_STACK_SIZE, NULL, PROCESSING_TASK_PRIORITY, &processing_task_handler) != pdPASS)
  18.     {
  19.         CY_ASSERT(0);
  20.     }

  21.     if (init_sensor() != 0)
  22.     {
  23.         CY_ASSERT(0);
  24.     }

  25.     xensiv_bgt60trxx_device_t device_type = xensiv_bgt60trxx_get_device(&bgt60_obj.dev);

  26.     print_welcome_message(device_type);

  27.     if (init_leds () != 0)
  28.     {
  29.         CY_ASSERT(0);
  30.     }

  31.     mgr.subscribe(main_task_handler);

  32.     /* Initialize the initial state of ce_app_state */
  33.     ce_app_state.last_reported_event.state = XENSIV_RADAR_PRESENCE_STATE_ABSENCE;
  34.     ce_app_state.last_reported_event.range_bin = 0;
  35.     ce_app_state.last_reported_event.timestamp = 0;

  36.     if (xensiv_bgt60trxx_start_frame(&bgt60_obj.dev, true) != XENSIV_BGT60TRXX_STATUS_OK)
  37.     {
  38.         CY_ASSERT(0);
  39.     }

  40.     for(;;)
  41.     {
  42.         /* Wait for the GPIO interrupt to indicate that another slice is available */
  43.         ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
  44.         mgr.read_from_buffer(1, &data_buff, &sz);

  45.         /* Data preprocessing */
  46.         uint16_t *bgt60_buffer_ptr = data_buff;
  47.         float32_t *frame_ptr = &frame[0];
  48.         for (int32_t sample = 0; sample < NUM_SAMPLES_PER_FRAME * 2; ++sample)
  49.         {
  50.             *frame_ptr++ = ((float32_t)(*bgt60_buffer_ptr++) / 4096.0F);
  51.         }

  52.         mgr.ack_data_read(1);

  53.         /* calculate the average of the chirps first */
  54.         arm_fill_f32(0, avg_chirp, NUM_SAMPLES_PER_CHIRP);

  55.         for (int chirp = 0; chirp < NUM_CHIRPS_PER_FRAME * 2; chirp++)
  56.         {
  57.             arm_add_f32(avg_chirp, &frame[NUM_SAMPLES_PER_CHIRP * chirp], avg_chirp, NUM_SAMPLES_PER_CHIRP);
  58.         }

  59.         arm_scale_f32(avg_chirp, 1.0f / NUM_CHIRPS_PER_FRAME, avg_chirp, NUM_SAMPLES_PER_CHIRP);

  60.         if(ce_app_state.last_reported_event.timestamp != last_timestamp)
  61.         {
  62.             last_timestamp = ce_app_state.last_reported_event.timestamp; // save latest timestamp
  63.             result = radar_config_optimize(ce_app_state.last_reported_event.state);
  64.             if(result != ESTATUS_SUCCESS)
  65.             {
  66.                 printf("[MSG] ERROR: radar_config_optimize failed with error %" PRIi32 "\n", result);
  67.                 CY_ASSERT(0);
  68.             }
  69.         }

  70.         /* Tell processing task to take over */
  71.         xTaskNotifyGive(processing_task_handler);

  72.     }
  73. }
上述main task注册在main函数中:
  1.     /* Create the RTOS task */
  2.     if (xTaskCreate(main_task, MAIN_TASK_NAME, MAIN_TASK_STACK_SIZE, NULL, MAIN_TASK_PRIORITY, &main_task_handler) != pdPASS)
  3.     {
  4.         CY_ASSERT(0);
  5.     }

  6.     /* Start the FreeRTOS scheduler. */
  7.     vTaskStartScheduler();


烧录后,从远处靠近开发板,可以看到串口输出:
  1. current presence: 0, current setting: 10 Hz
  2. new setting: micro
  3. [INFO] macro presence 5 139112
  4. current presence: 0, current setting: 200 Hz
  5. new setting: macro
  6. [INFO] micro presence 5 144492
  7. current presence: 1, current setting: 10 Hz
  8. [INFO] micro presence 3 144692
  9. current presence: 1, current setting: 10 Hz


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

297

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部