目录
引言
WS63E星闪模块有个特色功能就是雷达运动感知,检测物体是否有运动,作用距离不超过6米。hi3863芯片本身不带雷达功能,是模块提供的相关功能。海思还有个WS63星闪模块,没有雷达感知能力。
功能简介
从开发板的图片上可以看到,右下角有个安装雷达天线的地方,使用使用1代IPEX接口。润和的套件里面没有带天线,从我的测试看没有天线,其实雷达功能是不正常的。所以下单了一根天线,今天只是简单分析一下程序,等天线到了之后再详细测试。
海思没有公布雷达运动感知的工作原理,但是这个雷达运动感知功能必须和WiFi 一起工作,如果不启动WiFi,雷达功能就无法启动。WiFi可以工作在STA或AP模式,WiFi不一定要连接上,只要启动即可。我猜测它的雷达功能是利用了WiFi信号的强度进行测试的,我们课题组以前做过利用WiFi信号强度进行室内定位的工作,估计原理差不多。
程序分析
WS63E的代码仓库中包括两组雷达相关的例子:一组是海思官方提供的,测量后根据距离点亮主板上的LED灯;另一组是润和提供的,需要配合交通灯扩展板,检测物体在6M以内是否有运动。如果有则亮绿灯,如果检测物体在0M-1M以内,则亮红灯,如果检测物体在1M-2M以内,则亮绿灯。两组程序的原理是完全一样的。
下面以润和的vendor/HiHope_NearLink_DK_WS63E_V03/demo/radar_led/radar_sta_sample/radar_sta_sample.c为例介绍一下其工作原理。
这段程序是一个嵌入式C语言程序,用于初始化和控制一个雷达系统。它包含了网络接口、WiFi热点配置、雷达服务、GPIO控制等功能。以下是对程序的分析:
-
包含头文件:程序包含了多个头文件,这些头文件提供了网络接口、WiFi热点配置、基础类型定义、UART通信、操作系统抽象层、雷达服务、GPIO控制等功能的支持。
-
宏定义:定义了一些常量,如WiFi接口名称最大长度、最大SSID长度、扫描AP限制、MAC地址长度、WiFi初始化等待时间、STA启动延迟等。
-
雷达状态和参数:定义了雷达的状态码、默认循环次数、周期、调试类型和波形等。
-
LED引脚配置:定义了红色、绿色和黄色LED的引脚编号。
-
任务优先级和堆栈大小:定义了雷达任务的优先级和堆栈大小。
-
枚举类型:定义了一个枚举类型
radar_led_gear_t
,用于控制LED的档位。 -
结构体:定义了一个结构体
radar_driver_para_t
,用于存储雷达驱动参数。 -
弱引用函数:
radar_set_driver_para_weakref
函数被声明为弱引用,这意味着如果其他地方没有定义这个函数,链接器将不会报错。 -
GPIO设置函数:
gpio_set_value
函数用于设置GPIO引脚的模式和方向。 -
LED初始化和控制函数:
radar_led_init
函数初始化所有GPIO并设置类型,radar_switch_*_on_off
函数用于控制LED的开关。 -
雷达控制LED函数:
radar_ctrl_led
函数根据雷达结果控制LED的状态。 -
雷达启动STA函数:
radar_start_sta
函数用于启动STA(Station)模式的WiFi接口。 -
打印雷达结果函数:
radar_printf_res
函数打印雷达结果并控制LED。 -
雷达参数初始化函数:
radar_init_para
函数初始化雷达的调试参数、选择算法参数和算法参数。 -
雷达演示初始化函数:
radar_demo_init
函数是雷达演示的初始化函数,它初始化LED、启动STA、注册雷达结果回调函数、初始化雷达参数,并开始雷达探测。 -
雷达入口函数:
radar_entry
函数创建了一个任务来运行radar_demo_init
函数。 -
程序入口点:
app_run
宏调用radar_entry
函数作为程序的入口点。
整体来看,这个程序是一个雷达系统的初始化和控制程序,它通过GPIO控制LED,通过网络接口进行配置,并通过回调函数处理雷达结果。程序使用了操作系统抽象层(如osal_task
)来创建和管理任务。
关键结构体定义:
typedef struct {
uint8_t times; // 发射次数, 0-无限次
uint8_t loop; // 单次雷达工作, TRx的波形数量
uint8_t ant; // Rx天线数量
uint8_t wave; // 波形选择, 0-320M/40M CTA, 1-160M/20M CW
uint8_t dbg_type; // 维测方式. 0-不外发维测数据, 1-外发脉压后的数据, 2-外发相干累加后的数据
uint16_t period; // 雷达工作间隔
} radar_driver_para_t;
typedef struct {
uint8_t times; /*!< @if Eng Number of subframe transmissions, default value 0, always sent, range 0~20
@else 子帧发送次数, 默认值0, 一直发送, 范围0~20 @endif */
uint8_t loop; /*!< @if Eng Loop times of radar waveform in one subframe, default value 8
@else 单个子帧雷达波形循环发送次数, 默认值为8 @endif */
uint8_t ant; /*!< @if Eng Selection of radar antenna, default value 0
@else 接收通路选择, 默认值为0 @endif */
uint8_t wave; /*!< @if Eng Selection of radar wave, default value 2
@else 雷达发射波形类型选择, 默认值为2 @endif */
uint8_t dbg_type; /*!< @if Eng Selection of debug information, default value 0, for details,
see @ref radar_dbg_type_t
@else 维测信息输出选择, 默认值为0, 只打印基础流程日志, 范围0~4,
参考 @ref radar_dbg_type_t @endif */
uint16_t period; /*!< @if Eng Radar subframe interval, unit us, default value is 5000, range 3000~100000
@else 雷达子帧间隔,单位us,默认值为5000, 范围3000~100000 @endif */
} radar_dbg_para_t;
如果想修改相关参数,建议看看src/include/middleware/services/radar/radar_service.h。
操作步骤
1. 将vendor/HiHope_NearLink_DK_WS63E_V03/demo/radar_led复制到\src\application\samples\peripheral文件夹下。
2. 在src\application\samples\peripheral\CMakeLists.txt文件中新增编译案例,可以在“set(SOURCES "${SOURCES}" PARENT_SCOPE)”上面一行添加。
if(DEFINED CONFIG_SAMPLE_SUPPORT_RADAR_LED)
add_subdirectory_if_exist(radar_led)
endif()
3. 在src\application\samples\peripheral\Kconfig文件中新增编译案例,可以在最后一行添加。
config SAMPLE_SUPPORT_RADAR_LED
bool
prompt "support RADAR LED Sample."
default n
depends on ENABLE_PERIPHERAL_SAMPLE
help
This option means support RADAR LED Sample,
if SAMPLE_SUPPORT_RADAR_LED
menu "RADAR LED Sample Configuration"
osource "application/samples/peripheral/radar_led/Kconfig"
endmenu
endif
3. 在配置中选择“Application/Enable the Sample of peripheral”,在弹出框中选择“support RADAR LED Sample → Support RADAR STA Sample”,点击Save,关闭弹窗。
4. 重新编译程序,然后烧写程序即可。
简单测试
天线没有到货,而没有天线,雷达的功能基本不能用。所以以下的测试只是简单地看看流程。
从日志可以看到,系统启动后就程序启动雷达功能。
[RADAR_LOG] alg ctrl read from nv [0][2][0][0][1][1][8]
[RADAR_SAMPLE] radar_demo_init sta!
device_main_init: 0!
===hal_initialize_phy===225===
device_module_init:: succ!
cali_set_cali_mask:old[0x0] -> new[0x1fa2]
fe_rf_initialize
cali_offline_cali_entry enter
cali_set_cali_done_flag:old[0x0] -> new[0x1]
rf cali OK. time cost:22, ret:0
APP|Hello world!
xo update temp:3,diff:0,xo:0x3083c
STA try enable.
drv_soc_ioctl ioctl_cmd->cmd=7.
drv_soc_ioctl ioctl_cmd->cmd=9.
drv_soc_ioctl ioctl_cmd->cmd=17.
drv_soc_ioctl ioctl_cmd->cmd=13.
drv_soc_ioctl ioctl_cmd->cmd=35.
drv_soc_ioctl ioctl_cmd->cmd=2.
drv_soc_ioctl ioctl_cmd->cmd=2.
drv_soc_ioctl ioctl_cmd->cmd=2.
drv_soc_ioctl ioctl_cmd->cmd=2.
drv_soc_ioctl ioctl_cmd->cmd=2.
drv_soc_ioctl ioctl_cmd->cmd=2.
drv_soc_ioctl ioctl_cmd->cmd=41.
STA connect success.
[RADAR_LOG][set_para] 0,8,0,2,1,5000,2048,0x0034bb04
[RADAR_LOG] update alg param [0][2][0][0][1][1][8]
[RADAR_LOG] update alg param key_id [0x2118]
[RADAR_LOG] alg_para [32,27,1,2,0,1,0,60,0,2,0,2,40,13,26,30,8,70,2]
[RADAR_LOG] alg_para [32,27,1,2,0,1,0,60,0,2,0,2,40,13,26,30,8,70,2]
[RADAR_LOG] update [0x2118][0][32,27,1,2,0,1,0,60,0,2,0,2,30,13,26,50,15,70,2]
[RADAR_LOG] update alg param by wifi [0][2][0][0][1][1][8]
[RADAR_LOG] update alg param key_id [0x2118]
[RADAR_LOG] alg_para [32,27,1,2,0,1,0,60,0,2,0,2,40,13,26,30,8,70,2]
[RADAR_LOG] RADAR START SUCC!
[RADAR_LOG] OK! final lna:3, vga:30, peak:506, pwr:144315, ppa:4914
lb:000, ub:000, hm:0, gr:0, fm:000001
[RADAR_LOG] ch_num:13, iso:30
[RADAR_LOG] RADAR STOP! cur:0, last:1
[RADAR_LOG] RADAR RST!
[RADAR_LOG] update alg param by wifi [0][2][0][0][1][1][8]
[RADAR_LOG] update alg param key_id [0x2118]
[RADAR_LOG] alg_para [32,27,1,2,0,1,0,60,0,2,0,2,40,13,26,30,8,70,2]
[RADAR_LOG] RADAR START SUCC!
[RADAR_LOG] alg ctrl read from nv [0][2][0][0][1][1][8]
[RADAR_LOG] OK! final lna:2, vga:2, peak:456, pwr:117020, ppa:4914
lb:000, ub:000, hm:0, gr:0, fm:000001
[RADAR_LOG] ch_num:12, iso:29
[RADAR_LOG] RADAR STOP! cur:0, last:1
[RADAR_LOG] RADAR RST!
[RADAR_LOG] update alg param by wifi [0][2][0][0][1][1][8]
[RADAR_LOG] update alg param key_id [0x2118]
[RADAR_LOG] alg_para [32,27,1,2,0,1,0,60,0,2,0,2,40,13,26,30,8,70,2]
[RADAR_LOG] RADAR START SUCC!
[RADAR_LOG] alg ctrl read from nv [0][2][0][0][1][1][8]
[RADAR_LOG] OK! final lna:2, vga:2, peak:464, pwr:119357, ppa:4914
lb:000, ub:000, hm:0, gr:0, fm:000001
[RADAR_LOG] ch_num:11, iso:28
[RADAR_LOG] RADAR STOP! cur:0, last:1
[RADAR_LOG] RADAR RST!
[RADAR_LOG] update alg param by wifi [0][2][0][0][1][1][8]
[RADAR_LOG] update alg param key_id [0x2118]
[RADAR_LOG] alg_para [32,27,1,2,0,1,0,60,0,2,0,2,40,13,26,30,8,70,2]
[RADAR_LOG] RADAR START SUCC!
[RADAR_LOG] alg ctrl read from nv [0][2][0][0][1][1][8]
[RADAR_LOG] OK! final lna:3, vga:30, peak:501, pwr:129188, ppa:4914
xo update temp:4,diff:0,xo:0x3083c
lb:000, ub:000, hm:0, gr:0, fm:000001
[RADAR_LOG] ch_num:10, iso:30
[RADAR_LOG] RADAR STOP! cur:0, last:1
[RADAR_LOG] RADAR RST!
[RADAR_LOG] update alg param by wifi [0][2][0][0][1][1][8]
[RADAR_LOG] update alg param key_id [0x2118]
[RADAR_LOG] alg_para [32,27,1,2,0,1,0,60,0,2,0,2,40,13,26,30,8,70,2]
[RADAR_LOG] RADAR START SUCC!
[RADAR_LOG] alg ctrl read from nv [0][2][0][0][1][1][8]
[RADAR_LOG] OK! final lna:3, vga:30, peak:490, pwr:134015, ppa:4914
lb:000, ub:000, hm:0, gr:0, fm:000001
[RADAR_LOG] ch_num:9, iso:30
[RADAR_LOG] RADAR STOP! cur:0, last:1
[RADAR_LOG] RADAR RST!
[RADAR_LOG] update alg param by wifi [0][2][0][0][1][1][8]
[RADAR_LOG] update alg param key_id [0x2118]
[RADAR_LOG] alg_para [32,27,1,2,0,1,0,60,0,2,0,2,40,13,26,30,8,70,2]
[RADAR_LOG] RADAR START SUCC!
[RADAR_LOG] alg ctrl read from nv [0][2][0][0][1][1][8]
[RADAR_LOG] OK! final lna:3, vga:30, peak:475, pwr:125589, ppa:4913
lb:000, ub:000, hm:0, gr:0, fm:000001
[RADAR_LOG] ch_num:8, iso:30
[RADAR_LOG] RADAR STOP! cur:0, last:1
[RADAR_LOG] RADAR RST!
[RADAR_LOG] update alg param by wifi [0][2][0][0][1][1][8]
[RADAR_LOG] update alg param key_id [0x2118]
[RADAR_LOG] alg_para [32,27,1,2,0,1,0,60,0,2,0,2,40,13,26,30,8,70,2]
[RADAR_LOG] RADAR START SUCC!
[RADAR_LOG] alg ctrl read from nv [0][2][0][0][1][1][8]
[RADAR_LOG] OK! final lna:3, vga:30, peak:475, pwr:124232, ppa:4913
lb:000, ub:000, hm:0, gr:0, fm:000001
[RADAR_LOG] ch_num:7, iso:30
[RADAR_LOG] RADAR STOP! cur:0, last:1
[RADAR_LOG] RADAR RST!
这里的反复启动不知道是否和没有天线有关。从日志中可以看到一些和雷达相关的测量参数。
大多数情况下雷达测量得到不了结果,但是偶尔也能输出测量值。
lb:000, ub:000, hm:0, gr:0, fm:000069
lb:000, ub:000, hm:0, gr:0, fm:000070
lb:000, ub:000, hm:0, gr:0, fm:000071
lb:000, ub:000, hm:0, gr:0, fm:000072
lb:000, ub:000, hm:0, gr:0, fm:000073
[RADAR_SAMPLE] lb:200, hb:600, hm:1
R xxxx meters
lb:200, ub:600, hm:1, gr:6, fm:000074
[RADAR_SAMPLE] lb:0, hb:100, hm:1
R 1 meters
lb:000, ub:100, hm:1, gr:1, fm:000075
lb:000, ub:100, hm:1, gr:1, fm:000076
由于测量值不准,所以程序策略的结果有点离谱,造成灯的显示也很混乱。
结语
等天线到货后,再仔细测量一下。不过从论坛中网友反映的情况看,这个雷达功能存在两方面问题:一是测量精度报告,二是WiFi、蓝牙和雷达同时工作时,存在干扰问题。所以对这个功能不能期望太高。
标签:LOG,radar,alg,WS63E,RADAR,000,星闪,雷达,浅析 From: https://blog.csdn.net/bit_mike/article/details/143193725