镜花水月000 发表于 2024-11-4 13:23

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

<div>首先感谢EEWORLD以及得捷电子给予这次测评的机会。</div>

<div></div>

<div>先了解一下VL53L4ED官方参数特性</div>

<div></div>

<div>首先运行一下官方例程,让传感器先工作起来,打开STM32CUBEMX,安装TOF扩展包</div>

<div></div>

<div>安装完成后在本地磁盘找到软件包后打开VL53L4A3的例程</div>

<div></div>

<div>例程有3个分别为多传感器测距、单传感器测距、阈值检测,由于本次测评的硬件只有1个中间传感器,所以打开第二个例程编译下载即可体验简单的测距功能。需要注意例程的波特率是460800</div>

<div></div>

<div></div>

<div>接下来体验一下官方的VL53L4ED_GUI软件,软件地址<a href="https://www.st.com.cn/zh/embedded-software/stsw-img045.html">STSW-IMG045 - P-NUCLEO-53L4A3 pack graphical user interface (GUI) - 意法半导体STMicroelectronics</a></div>

<div></div>

<div>先升级STLink模式为VCP+U盘模式</div>

<div></div>

<div>然后打开VL53L4ED_GUI后点击Flash FW烧录固件等待绿灯亮起</div>

<div></div>

<div>点击开始测试</div>

<div></div>

<div>官方的软件波形图局限性能比较大,不能看更多的历史数据,还不能放大缩小,很不方便,所以接下来进行程序驱动的移植,并使用匿名助手上位机软件进行传感器的测试。</div>

<div>本次程序移植以官方的SimpleRangning例程为参考,并加入匿名助手的通讯协议代码,移植过程此处省略,移植后的代码结构如下</div>

<div></div>

<div>本次测试代码中使用的通讯帧是灵活格式帧(具体可以查看上位机说明书)</div>

<div></div>

<div>通讯函数定义如下</div>

<div></div>

<div>匿名助手上位机的灵活数据帧配置如下</div>

<div></div>

<div>打开数据波形控件,添加相关变量</div>

<div></div>

<div>配置完成后进行测试即可,不得不说匿名助手的波形显示功能非常的灵活方便</div>

<div></div>

<div>传感器初始化程序如下,传感器工作过程可以参考手册(UM3177)和注释
<pre>
<code class="language-cpp">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, &amp;Id);
VL53L4A3_RANGING_SENSOR_GetCapabilities(VL53L4A3_DEV_CENTER, &amp;Cap);
/*-- 测量模式 --*/
Profile.RangingProfile = VL53L4ED_PROFILE_CONTINUOUS;
/*-- 测量时间 10 ms &lt; TimingBudget &lt; 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, &amp;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);
}
}</code></pre>

<p>&nbsp;</p>
</div>

<div></div>

<div>Main函数
<pre>
<code class="language-cpp">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, &amp;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.Distance,
Result.ZoneResult.Status,
Result.ZoneResult.Ambient,
Result.ZoneResult.Signal);
}
}</code></pre>

<p>&nbsp;</p>
</div>

<div>在程序中我们可以通过TIMING_BUDGET参数进行测量时间的设定,其中10 ms &lt; TimingBudget &lt; 200 ms</div>

<div>通过VL53L4A3_RANGING_SENSOR_Start()函数设置模式,有四种模式可选(如下),前两个是阻塞模式,后面两个是中断模式</div>

<div></div>

<div>通过RANGING_SENSOR_INSTANCES_NBR可以配种传感器的个数,例程中配置的是3,即默认为3个传感器,本次测评板只有1个,为了节约内存我们可以定义为1,但VL53L4A3_DEV_CENTER需要重新定义为0</div>

<div></div>

<div></div>

<div>接下来进行精度等方面的测试。</div>

<p><!--importdoc--></p>

秦天qintian0303 发表于 2024-11-9 08:39

<p>这次带的开发板不是可以直接下载使用吗?&nbsp;&nbsp;</p>

镜花水月000 发表于 2024-11-9 19:52

秦天qintian0303 发表于 2024-11-9 08:39
这次带的开发板不是可以直接下载使用吗?&nbsp;&nbsp;

<p>上位机不好用,看波形不灵活</p>
页: [1]
查看完整版本: [X-NUCLEO-53L4A3 TOF评估板]1.测试和代码移植