米尔电子
直播中

超人

1年用户 74经验值
擅长:控制/MCU
私信 关注
[技术]

【米尔-安路MYD-YM90X 创意秀】基于雷达波探测的智能巡检小车

【米尔-安路MYD-YM90X 创意秀】点灯也是入门绝活 - 米尔电子 - 电子技术论坛 - 广受欢迎的专业电子论坛!

书接上回,我们主要通过SoC输出时钟给FPGA核,实现简单的点灯。
本篇我们完成最终的作品:基于雷达波探测的智能巡检小车

主要思路是通过SoC的串口获取雷达波探测器的数据包,并对数据包进行解析,通过运算获得距离数据,进而根据周围的情况进行路径规划和调整。

*附件:课件一:米尔安路飞龙派的FPGA快速启动指南.pdf

FPGA及SoC的配置参考了上述文档。

屏幕截图 2025-08-13 002631.png

需要注意,在ARM核心设置时需要开启UART1(48...49)
以及开启GPIO PS(主要用到GPIO7、8、9、10)用于巡检小车的运动控制。

e456d8df043403ee7f1272773e0c2c8b.jpg

43e16b6af3ddca7c4baa9d198d8f4fd8.jpg

硬件部分,
主要包括2部分
1、雷达波传感器——>PS UART
2、电机驱动板——>PS GPIO 7/8/9/10

软件部分,主要采用SoC进行距离检测及电机驱动

image.png

重难点在于接收雷达波探测器的数据包,并对数据包进行解析,通过运算获得距离数据。

本次使用的毫米波雷达模块是:海凌科LD2450

image.png

数据包协议如下。

image.png

获得X轴和Y轴数据后就可以结算距离。

image.png

下面是FD的核心代码

#include <stdio.h>
#include <math.h>
#include <time.h>
#include "al_core.h"
#include "al_uart_hal.h"
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include "al_uart_hal.h"

#define BUF_SIZE 30
#define AL_UART_TIME_OUT_MS 10000
#define AL_UART_DEVID 1

//串口参数
static AL_UART_InitStruct UART_InitStruct = {
        .BaudRate           = 115200,
        .Parity             = AL_UART_NO_PARITY,
        .WordLength         = AL_UART_CHAR_8BITS,
        .StopBits           = AL_UART_STOP_1BIT,
        .HwFlowCtl          = AL_FALSE,
        .CharTimeoutEnable  = AL_TRUE
    };



AL_S32 main(AL_VOID)
{
    AL_S32 Ret = AL_OK;
    AL_U8 Data[30],dis[4];
    unsigned int x1[1],y1[1],x0[1],y0[1],distance,distance0;
    int i;


    AL_UART_HalStruct *UartHandle;

    AL_LOG(AL_LOG_LEVEL_INFO, "雷达波测距小车by盛夏\r\n");
    AlUart_Hal_Init(&UartHandle, AL_UART_DEVID, &UART_InitStruct, AL_NULL);
    AlIntr_SetLocalInterrupt(AL_FUNC_ENABLE);


    while (1)
    {
            AlUart_Hal_RecvData(UartHandle, Data, BUF_SIZE);  //接收雷达波数据包(30字节)
            while (AlUart_Dev_IsRxBusy(&UartHandle->Dev));

           // AlUart_Hal_SendData(UartHandle, Data, 30);
           // while (AlUart_Dev_IsTxBusy(&UartHandle->Dev));


            for(i=0;i<30;i++)
            {
            	if(Data[i] == 0xAA && Data[i+1] == 0xFF )
            	{
            	dis[0] = Data[i+4];
            	dis[1] = Data[i+5];
            	dis[2] = Data[i+6];
            	dis[3] = Data[i+7];


            	x1[0]= dis[0] + (dis[1] *256);
            	y1[0]= dis[2] + (dis[3] *256);

            	if(dis[1] & 0x80)
            	   {
            	    x1[0]-= 0x8000;
            	   }
            	y1[0]-= 0x8000;
            	}
            }


            distance = sqrt(pow(x1[0],2) + pow(y1[0],2));


            AlSys_MDelay(2000);
            al_printf("distance  = %d \r\n", distance);




        }

}

运行结果如下图:

image.png

至于电机控制就比较简单,主要采用4路电机驱动板。

分别控制小车的前后4个轮子

image.png

image.png

实际就只控制A1、B1、C1、D1四个端子即可(高电平正转、低电平反转)

程序部分比较简单本篇就不再赘述了。
谢谢!

更多回帖

发帖
×
20
完善资料,
赚取积分