FMK24微波雷达测距模块的使用

    应客户要求,使用一款名为FMK24的微波雷达模块测量距离并解算速度,之前小打小闹从未用过这么高大上的距离传感器,某宝上一查居然300多块大洋,略略肉疼,决心好好搞一下子。

    附上官方给出的模块说明书 链接:https://pan.baidu.com/s/1YuWepOETU1NLYAkW2fiOlA  提取码:l51c 

    从手册上看,模块已经自带数据处理芯片,能够直接输出距离量,格式如下:

FMK24微波雷达测距模块的使用_第1张图片

    1、直接连上电脑,顺利收到数据,注意波特率和输出单位:

FMK24微波雷达测距模块的使用_第2张图片

    2、接入单片机解算速度

    使用简单方便的STC89C52单片机,通过串口输入雷达模块的数据量,配置波特率为57600bps,8位数据位:

void UART_Init(void)   //配置接收串口:57600bps
{
		//定时器波特率设置===============================
		TMOD = 0x22;		//定时器1:自动重装8位定时器模式
										//定时器0:自动重装8位定时器模式
		TL1 = 0xff;
		TH1 = 0xff;     //溢出时间=(256-255)* 12/11.0592 us
										//溢出率=921600
		TR1 = 1;        //计时开始
	
	//UART设置===============================		
		SCON= 0x50;		//  SM0-SM1=0 1:8位数据位,一位停止位  
									//	REN:1;接收允许
									//	SM2=0:RI置位
									//	TI=0,RI=0: 清除接收、发送中断标志位
		PCON= 0X80;   //	SMOD=1,波特率=T1溢出率/16 = 57600bps;
	
	//中断设置===============================
		ES=1;  				//允许串口中断
		PS=1;         //串口中断高优先级?????????
		EA=1;         //总中断允许
}

 

    3、距离提取

    这里只计算第一个跟踪的目标,多目标距离用法不知应用在何处,为编程方便,将数据直接在中断函数中进行处理,在计算过程中担心起始的数据会出现乱码的情况,设置了一个有效数据起始标志作为判断是否收到待处理数据的有效起始位。

void Receive() interrupt 4    //======================= '\n'为停止符号
{
	static unsigned char rec[10],rec_count=0;
	char count_num=0,count_dis=0,byte_count=0,start=0,j=0,       jj=0;
	int distance_temp=0;
	if(RI)              //接收中断
	{	
			RI=0;
		
			if(SBUF!='\n')        //未收到停止符号
			{
					if(start_flag == start)		//已有开始标记,则开始接收数据
					{
								rec[rec_count++]=SBUF;				
					}						
					else
					{
							return;            //未标记开始,放弃接收数据
					}

			}
			else                //接收到停止符
			{

				if(start_flag == start)     //已经有过开始标记,接收数据有效,开始处理
				{						
						rec[rec_count++]=SBUF;			//接收最后一位停止符

						if(rec[0]!= 'E'&&rec[0]=='1')  //存在有效目标,计算出距离,仅计算第一个目标
						{
						    //start_flag=end;					//标记数据接收结束

							while(rec[start++]!=':');   //start定位到第一位数据
							
							while(*(rec+start+j)!='\n')
							{
								j++;
								byte_count++;             //获取有效数位长度
							}
							for(;rec[start]!='\n';)
							{
								distance_temp += (rec[start]-'0')*pow(10,byte_count-1);
								byte_count--;
								start++;
							}
							object[0].distance = distance_temp;
							
						}

															//不存在有效目标-> 清零接收
					rec_count=0;				//数据处理完毕  -> 清零接收
					memset(rec,0,10);
//					start_flag = end; //?????
						
				}
				else
				{
					start_flag = start;       //未有开始标记标记,则标记有效数据接收开始
				}
			}
	}
}

 

4、测试输出

FMK24微波雷达测距模块的使用_第3张图片

5、计算速度

原来的思路是在主函数中间隔50ms取两个距离值,做除法,类似

    object[1].distance = object[0].distance;      //存储50MS前的距离            
    delay_ms(20);      //50ms
    delay_ms(30);     
    speed = (object[1].distance - object[0].distance)*36/50;   //   厘米/ms 换算为  Km/h

结构,但实际运行时发现,即使模块处于运动状态,两者的距离值也经常出现相同情况。

FMK24微波雷达测距模块的使用_第4张图片

目测是数据处理阶段比较粗糙,可进一步改进。

 

 

 

 

 

 

 

你可能感兴趣的:(FMK24微波雷达测距模块的使用)