JSN-SR04T倒车雷达超声波测距模块

JSN-SR0T4-2.0 超声波测距模块可提供 20cm-600cm 的非接触式距离感测功能,测距精度可达高到 2mm,采用工业级一体化超声波探头设计,防水型,性能稳定,兼容市场上所有的 MCU 工作。
实物图
模块规格参数

基本原理

作为超声波测距模块,本模块与HC-SR04雷同,二者可相互作为参考。
(JSN-SR04T和HC-SR04似乎是同一家公司的产品,其中,JSN-SR04T的模式一与HC-SR04的基本使用相兼容)

超声波测距模块,原理自然而然就是超声波测距,通过计算超声波在空气中经过的路程来测量距离,具体原理为:
超声波时序图
对模块的Trig引脚发送一个持续时间不小于10us的高电平脉冲作为触发信号,当模块接收到触发信号后,模块内部向外界发出8个40kHz的超声波脉冲,同时Echo引脚由0置1。当超声波脉冲遇到被测障碍物并反射回测距模块时,Echo引脚电平由1置0,一次测距结束。通过计算Echo引脚高电平持续时间即可求得超声波传输时间,进而求解出所测距离。
.
.
.

代码思路

代码思路有两种,一种是通过定时器的输入捕获来计算时间,另一种是通过外部中断结合定时器的开闭来计算时间,个人觉得第二种比较简单,故采用第二种。

具体思路为:
通过MPU不断控制Trig控制端发送触发信号,使得模块处于实时测距状态,定时器和外部中断开启,每当测距模块向外发送高频信号时,将触发Echo引脚的外部中断,外部中断中,通过控制定时器的开闭来测量反应时间,从而通过换算得到距离。
.
.
.

部分代码

初始化函数

简单对GPIO进行初始化

//initialize the pin of jsn-sr04t
void JSN_SR04T_Init(void)
{
	//定义GPIO初始化结构体
	GPIO_InitTypeDef GPIO_InitStruct;
	
	//初始化相应IO口时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
	
	//初始化GPIO参数	引脚Trig,用于输出一个持续10us的高电平触发信号,触发超声波模块开始发送超声波
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;		//这里的推挽是针对输出的
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;	//速度是针对输出的
	GPIO_Init(GPIOE, &GPIO_InitStruct);
	
	//初始化GPIO参数	引脚Echo,用于检测超声波的发射/接收状态
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;		//这里的上拉是针对输入来说的,下拉先复位,等待高电平
	GPIO_Init(GPIOE, &GPIO_InitStruct);
}

.
.

触发函数

根据模块工作原理进行简单的电平处理

//let jsn-sr04t to let out a signal to begin to detecting
void JSN_SR04T_Start(void)
{
	GPIO_SetBits(GPIOE,GPIO_Pin_0);		//置位
	delay_us(10);						//持续10us的高电平
	GPIO_ResetBits(GPIOE,GPIO_Pin_0);	//复位,实现一次触发超声波测距模块
}

.
.

外部中断响应函数

用于对定时器的控制进而计算反应时间

/*外部中断用于检测触发引脚Echo的状态:*/
/*当模块Trig发出一次触发信号,模块将向外发送高频信号,同时Echo将被拉高;当模块接收到反射回来的高频信号,Echo将被拉低;*/
/*当Echo被拉高进入外部中断函数,不断readBit判断Echo是否被拉低,从而得到TIM4的持续时间*/

u8 exti_i = 0;					//用于表示求和次数
float temp = 0;					//用于暂存Distance,以便求和
float Distance;					//超声波测到的距离
float sum = 0;					//用于累加Distance,以便求平均
float Distance_error = 0.717;	//超声波测距模块的系统误差

//中断响应函数
void EXTI1_IRQHandler(void)
{
	delay_us(10);		//延时消抖
	
	if( EXTI_GetITStatus(EXTI_Line1) != RESET )
	{
		TIM_SetCounter(TIM4,0);								//重置计时器的值
		TIM_Cmd(TIM4,ENABLE);								//使能定时器开始计数
		while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1));		//定时器计数的同时,死循环等待低电平,即接收到反射超声波
		TIM_Cmd(TIM4,DISABLE);								//失能定时器,定格计数值

		//先换算成时间单位秒,然后乘以声速344得到路程,再除以2得到距离,最后转换成cm单位
		//Distance = TIM_GetCounter(TIM4) * 0.0001f * (344.0f+5.0f*0.607f) * 0.5f + Distance_error;	//频率1Mhz,计数一次为0.001ms,TIM_GetCounter(TIM4)*(10^-6)*344m/s*0.5*10^2
		//通常所指的常温是指20℃时的气温(344m/s),气温每升高1℃,声速就增加0.607m/s				//实际拿来计算的值为:得到的值再加上系统误差Distance_error
		temp = TIM_GetCounter(TIM4) * 0.0001f * (344.0f+5.0f*0.607f) * 0.5f + Distance_error;		//频率1Mhz,计数一次为0.001ms,TIM_GetCounter(TIM4)*(10^-6)*344m/s*0.5*10^2	//这里之所以乘的是0.0001是因为单位换算m换成cm
		sum += temp;
		exti_i++;
		
		if(exti_i==10)//求和10次之后求平均
		{
			Distance = sum / 10.0f;
			exti_i = 0;
			sum = 0;
		}

		EXTI_ClearITPendingBit(EXTI_Line1);		//清除LINE0上的中断标志位
	}
}

.
.
这样,main函数里只要反复触发反复向串口打印测得数据即可:
main函数

与HC-SR04模块的区别

使用这个模块,一个原因是因为其一体化防水设计,将主控板和收发器件分离,使得模块能够在潮湿甚至多水的环境下正常工作。

另外,HC-SR04测距范围为2cm-400cm,较适用于短距离的测距;
而JSN-SR04T的测量范围为20cm-600cm,能够满足大空间的距离测量;

但是,本模块的测量角度高达75°,测距时容易受周边环境的影响;
而 HC-SR04的测量角度为15°,受周边环境的影响较小;
如果要对管道内物体的距离进行测量,则要求模块的测量角度越小越好,否则容易影响模块的正常使用。

  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值