JSN

您所在的位置:网站首页 超声波工作原理图 JSN

JSN

2024-05-28 19:19| 来源: 网络整理| 查看: 265

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°,受周边环境的影响较小; 如果要对管道内物体的距离进行测量,则要求模块的测量角度越小越好,否则容易影响模块的正常使用。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3