RD-03E雷达模组测评任务,测距模块”人来灯亮,人走灯灭“

[复制链接]
查看495 | 回复5 | 2024-3-15 20:23:49 | 显示全部楼层 |阅读模式
本帖最后由 哈哈 于 2024-3-15 20:23 编辑


Rd-03E是由深圳市安信可科技有限公司开发的雷达模组,搭载矽典微的S3KM111L芯片。S3KM111L 是一种基于 FMCW 雷达收发器技术的集成单片机毫米波传感器 SoC,它工作24 GHz K 波段,每个单频扫描的调制带宽高达 1 GHz。本次测试任务使用的是测距固件,而Rd-03E出厂烧录的是手势识别固件,因此我们需要给模组烧录测距的固件,之后再去编程完成本次测评。
一、固件烧录

官方文件中的信息:Rd-03E 支持 keil 5 IDE 烧录 hex 文件,CMSIS-DAP、J-Link (V9 以上版本)等烧录器下载程序。烧录前请确保已经安装 GiqaDevice.GD32E23x_DFP.1.0.1.pack ARM.CMSIS.5.7.0.pack 或更新版本的 CMSIS pack。

本人使用的工具是 keil + st-link 来进行固件烧录。因为手里只有st-link
烧录步骤:
1.首先我们需要保证keil支持 GiqaDevice.GD32E23x_DFP.1.0.1.pack 该芯片包,该芯片包有两种安装方法,离线安装和在线安装。具体操作大家可以网上了解了解。
2.创建基于 GD32E230K8 芯片的keil工程,创建完后,将官方发布的测距固件.hex文件放到obj文件夹里面。然后点击魔术棒,点output一栏,在可执行文件名字处填入 .hex 文件名字。(.hex也填入)
ex.png    恶心.png

3.配置调试工具为st-link debug。
4.点击下载,将固件烧录进去。
二、ch32v307的工程创建

控制板是沁恒微电子发布的评估板应用于 CH32V3097 芯片的开发,IDE 使用 MounRiver 编译器,可选择使用板载或独立的WCH-Link 进行仿真和下载,并提供了芯片资源相关的应用参考示例及演示。本工程主要使用串口接收数据包,为方便,直接将其普通工程的debug.c文件修改,打开串口UASRT1的接收以及中断。

void USART_Printf_Init(uint32_t baudrate)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);


    USART_InitStructure.USART_BaudRate = baudrate;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;


    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器


    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
    USART_Init(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE);
}

三、程序编写
下面是中断接收数据包的函数,参考了交流群中大佬的代码,使用状态机来完成接收。
void USART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

//串口1中断函数,接受rdo3E数据
/*中断读取数据包的时候,调试时,VOFA+要一个一个字节的发送。*/
void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {


        RX_temp = USART_ReceiveData(USART1);
        //USART_SendData(USART1, RX_temp);
        if( RX_temp == 0xAA )
        {
            RX_State = 1;       //进入下一状态
            RX_count = 0;
        }
        else if( RX_State == 1 )
        {
            RX_BUF[RX_count++] = RX_temp;//将缓存字符存入缓存数组中
        }
        if( RX_count >= 4 )
        {
            RX_count--;
            RX_State = 2;    //进入第二状态
        }
        else if( RX_State == 2 )
        {
            if( RX_temp == 0x55 )
            {
                RX_State = 0;
                RX_flag = 1; //成功接受1数据包
            }
            if(RX_flag == 1)
            {
                range=RX_BUF[2];
                range=(range<<8)|RX_BUF[1];//将小端格式下的距离数据如0X90 0X01转换成0X190


                if( RX_BUF[0] == 0x02 )
                {
                    led_flag = 1; //该flag判断是否为运动还是微动
                }
                else {
                    led_flag = 2;
                }
            }
        }
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);      //清除中断标志位
    }
}
下面是主函数中的处理
int main(void)
{
    //u8 i = 0;


        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        SystemCoreClockUpdate();
        Delay_Init();
        led_init();
        USART_Printf_Init(256000);
        printf("SystemClk:%d\r\n",SystemCoreClock);
        printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
        printf("This is printf example\r\n");
        GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);
        GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET);
        while(1)
    {
            Delay_Ms(1);
            if( led_flag == 1)
            {
                led_flag = 0;
                GPIO_WriteBit(GPIOA, GPIO_Pin_1,Bit_RESET);
                printf("finish one data_package!!!!!!");
            }
            else if( led_flag == 2 ){
                GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);
        }
            if((range>0X0000)&&(range<=0X0064))
            {
                GPIO_WriteBit(GPIOA, GPIO_Pin_2,Bit_RESET);
            }
            else {
                GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET);
        }
        }
}


四、测评结果。
靠近时,LED灯亮,离开时,LED灯灭。

测距固件得到的数据感觉和真实距离有些偏差,不过可以通过该模组的上位机参数调整来修正距离。







回复

使用道具 举报

1055173307 | 2024-3-16 09:45:45 | 显示全部楼层
回复

使用道具 举报

wurong | 2024-3-16 10:54:09 | 显示全部楼层
回复

使用道具 举报

1084504793 | 2024-3-16 11:08:11 | 显示全部楼层
回复

使用道具 举报

知行合一 | 2024-3-16 21:44:01 | 显示全部楼层
赞一下
回复

使用道具 举报

timo | 2024-3-17 18:58:24 | 显示全部楼层
赞一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则