[光学传感器] [X-NUCLEO-53L4A3 TOF评估板]1.测试和代码移植

镜花水月000   2024-11-4 13:23 楼主
首先感谢EEWORLD以及得捷电子给予这次测评的机会。
wd_132217tfw34fflgwxgxeef.png
先了解一下VL53L4ED官方参数特性
wd_132217yftkbjfbqahflt4f.png
首先运行一下官方例程,让传感器先工作起来,打开STM32CUBEMX,安装TOF扩展包
wd_132217bgzzopwe2blp9gbl.png
安装完成后在本地磁盘找到软件包后打开VL53L4A3的例程
wd_132217j89jf9uw8p1u16zu.png
例程有3个分别为多传感器测距、单传感器测距、阈值检测,由于本次测评的硬件只有1个中间传感器,所以打开第二个例程编译下载即可体验简单的测距功能。需要注意例程的波特率是460800
wd_132218zzpejzqgmroihrgr.png
wd_132218zc6g9z970c6i09m3.png
wd_132218pc50g1o5z5ju5u83.png
先升级STLink模式为VCP+U盘模式
wd_132218lqeaabq7euon44kn.png
然后打开VL53L4ED_GUI后点击Flash FW烧录固件等待绿灯亮起
wd_132218jydvdjjd9v966ppz.png
点击开始测试
wd_132218s7vjsv4zkffpfb51.png
官方的软件波形图局限性能比较大,不能看更多的历史数据,还不能放大缩小,很不方便,所以接下来进行程序驱动的移植,并使用匿名助手上位机软件进行传感器的测试。
本次程序移植以官方的SimpleRangning例程为参考,并加入匿名助手的通讯协议代码,移植过程此处省略,移植后的代码结构如下
wd_132218rwx5qhzeqpq4v8ev.png
本次测试代码中使用的通讯帧是灵活格式帧(具体可以查看上位机说明书)
wd_132218oqd1dwp4dw7g2l2d.png
通讯函数定义如下
wd_132218kaxuf3nzg6mnox12.png
匿名助手上位机的灵活数据帧配置如下
wd_132218ywwg7jvvxijogkxe.png
打开数据波形控件,添加相关变量
wd_132218smsgk74if3700jie.png
配置完成后进行测试即可,不得不说匿名助手的波形显示功能非常的灵活方便
wd_132218tdw3w7wk3ocdozry.png
传感器初始化程序如下,传感器工作过程可以参考手册(UM3177)和注释
void bsp_tof_init(void)
{
uint32_t Id;
/* reset XSHUT (XSDN) pin */
HAL_GPIO_WritePin(VL53L4A3_XSHUT_C_PORT, VL53L4A3_XSHUT_C_PIN, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_GPIO_WritePin(VL53L4A3_XSHUT_C_PORT, VL53L4A3_XSHUT_C_PIN, GPIO_PIN_SET);
HAL_Delay(2);
printf("53L4A3 Simple Ranging demo application\r\n");
status = VL53L4A3_RANGING_SENSOR_Init(VL53L4A3_DEV_CENTER);
if (status != BSP_ERROR_NONE)
{
printf("VL53L4A3_RANGING_SENSOR_Init failed\r\n");
while (1);
}
/*- 读取传感器ID -*/
VL53L4A3_RANGING_SENSOR_ReadID(VL53L4A3_DEV_CENTER, &Id);
VL53L4A3_RANGING_SENSOR_GetCapabilities(VL53L4A3_DEV_CENTER, &Cap);
/*-- 测量模式 --*/
Profile.RangingProfile = VL53L4ED_PROFILE_CONTINUOUS;
/*-- 测量时间 10 ms < TimingBudget < 200 ms --*/
Profile.TimingBudget = TIMING_BUDGET;
Profile.Frequency = 0; /* Induces intermeasurement period, NOT USED for normal ranging */
/*-- 测量噪声输出使能 --*/
Profile.EnableAmbient = 1; /* Enable: 1, Disable: 0 */
/*-- 测量信号强度输出使能 --*/
Profile.EnableSignal = 1; /* Enable: 1, Disable: 0 */
/* set the profile if different from default one */
VL53L4A3_RANGING_SENSOR_ConfigProfile(VL53L4A3_DEV_CENTER, &Profile);
/* 阻塞模式 */
// status = VL53L4A3_RANGING_SENSOR_Start(VL53L4A3_DEV_CENTER, RS_MODE_BLOCKING_CONTINUOUS);
/* 同步模式 */
status = VL53L4A3_RANGING_SENSOR_Start(VL53L4A3_DEV_CENTER, RS_MODE_ASYNC_CONTINUOUS);
if (status != BSP_ERROR_NONE)
{
printf("VL53L4A3_RANGING_SENSOR_Start failed\r\n");
while (1);
}
}

 

wd_132218zpo8kor22y1zkx11.png
Main函数
int main(void)
{
int32_t i = 0, status;
RANGING_SENSOR_Result_t Result;
bsp_init();
init_cycle_counter(true);
bsp_tof_init();
while(1)
{
// int64_t time_stamp = get_system_ms();
VL53L4A3_RANGING_SENSOR_GetDistance(VL53L4A3_DEV_CENTER, &Result);
/* polling mode status = */
while(ToF_EventDetected == 0)
{
}
// printf("time_stamp = %lldms\r\n", get_system_ms() - time_stamp);
ToF_EventDetected = 0;
ano_send_custom1(Result.ZoneResult[0].Distance[0],
Result.ZoneResult[0].Status[0],
Result.ZoneResult[0].Ambient[0],
Result.ZoneResult[0].Signal[0]);
}
}

 

在程序中我们可以通过TIMING_BUDGET参数进行测量时间的设定,其中10 ms < TimingBudget < 200 ms
通过VL53L4A3_RANGING_SENSOR_Start()函数设置模式,有四种模式可选(如下),前两个是阻塞模式,后面两个是中断模式
wd_132218q16ogh226goh0oes.png
通过RANGING_SENSOR_INSTANCES_NBR可以配种传感器的个数,例程中配置的是3,即默认为3个传感器,本次测评板只有1个,为了节约内存我们可以定义为1,但VL53L4A3_DEV_CENTER需要重新定义为0
wd_132218pm20l37gqm4xg3np.png
wd_132218c8s6a6kksnknxkhs.png
接下来进行精度等方面的测试。

回复评论 (2)

这次带的开发板不是可以直接下载使用吗?  

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2024-11-9 08:39
引用: 秦天qintian0303 发表于 2024-11-9 08:39 这次带的开发板不是可以直接下载使用吗?  

上位机不好用,看波形不灵活

点赞  2024-11-9 19:52
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复