马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
目录
引言
功能简介
程序分析
操作步调
简朴测试
结语
引言
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、蓝牙和雷达同时工作时,存在干扰题目。以是对这个功能不能期望太高。
|