【米尔-安路MYD-YM90X 创意秀】点灯也是入门绝活 - 米尔电子 - 电子技术论坛 - 广受欢迎的专业电子论坛!
书接上回,我们主要通过SoC输出时钟给FPGA核,实现简单的点灯。
本篇我们完成最终的作品:基于雷达波探测的智能巡检小车
主要思路是通过SoC的串口获取雷达波探测器的数据包,并对数据包进行解析,通过运算获得距离数据,进而根据周围的情况进行路径规划和调整。
*附件:课件一:米尔安路飞龙派的FPGA快速启动指南.pdf
FPGA及SoC的配置参考了上述文档。

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


硬件部分,
主要包括2部分
1、雷达波传感器——>PS UART
2、电机驱动板——>PS GPIO 7/8/9/10
软件部分,主要采用SoC进行距离检测及电机驱动

重难点在于接收雷达波探测器的数据包,并对数据包进行解析,通过运算获得距离数据。
本次使用的毫米波雷达模块是:海凌科LD2450

数据包协议如下。

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

下面是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);
}
}
运行结果如下图:

至于电机控制就比较简单,主要采用4路电机驱动板。
分别控制小车的前后4个轮子


实际就只控制A1、B1、C1、D1四个端子即可(高电平正转、低电平反转)
程序部分比较简单本篇就不再赘述了。
谢谢!
更多回帖