导语
近期想自己做超声波模块,在网上找了很多资料,大多是笼统的讲解了一下,有的还是存在误导的数据,一怒之下干脆自己动手从新理一遍。
原理图
网上大多数流传的是类似这份电路图,但是市面上流行的是另一个加密的电路图(接收部芯片抹掉丝印),但是他们的工作原理基本是相同的。也就是放大–>选频(40KHz)–>放大–>比较。(具体的选频元件选取与设计参数本人也是半桶水,希望大神留言告知)
时序
比较脚拉低:NET9, 接收触发信号:NET10
上面的时序图拿逻辑分析仪按正常接线是测不出来的,里面有个坑,那就是NET9脚其实是漏极开路,直接接到逻辑分析仪上会干扰超声波模块正常工作,并且抓取不到时序图。在这里我强行外部上拉了一个1K电阻,虽然超声波接收到的数据是错误,但是起码能抓取到它工作原理的时序图。
trig引脚需要一个10us的高电平触发脉冲–>接着把NET9引脚拉低(排除干扰信号)–>模块发射8个40KHz的脉冲–>启动定时器,启动中断–>等待NET10的接收触发中断信号–>关闭定时器,关闭中断,计算计时器时间–>通过echo引脚输出与计时器时间一样的高电平脉冲。
总结分析
比较器
1、UC直流分析:
当超声波模块没有接收到任何信号的时候,B点的电压为2.5V(由于R7和R16分压2.5V)。
2、NET9为漏极开路(忽略R10影响):
A点的电压为2.41V,B-A=0.09V,非常容易触发UD输出高低电平,很容易受干扰信号影响。
3、NET9输出低电平(忽略R10影响):
A点的电压约为0.96V,B-A=1.54V,不容易触发UD输出高低电平,不容易受干扰信号影响。
4、NET9输出低电平,假设B点输出0-5V交流信号(考虑R10影响):
此时A点的电压约为0.96V。
当B点为0V时,C点的电压约为0.075V,电压:A>C,Q1三极管关断,D点电压约为4.62V。在B点电压为0–0.89V之间,Q1三极管一直出于关闭状态。
当B点的电压约为0.90V的时候,C点约为0.962V,电压:C>A,UD输出高电平,Q1三极管导通;当Q1三极管导通,D点的电压瞬间变为0.3V(三极管的导通压降),C点的电压瞬间变为0.89V,此时电压:A>C,UD输出低电平,Q1三极管断开;此时Q1三极管是出于重复的开与关状态;B点在0.90—0.972V这段电压内,Q1三极管一直出于重复开关状态,如时序图的接收触发部分。
当B点的电压在0.973—5V之间,Q1三极管一直出于导通状态。
4、NET9输出高电平(漏极开路):
超声波模块中断关断、定时器不计时、不处理NET10的信号,UD处于高度灵敏状态,输出带有干扰信号的脉冲。
备注:此为个人理解,有不同见解的大神希望能留言告知。
认识超声波
可在空气中传播的超声波频率,大约介于20~200KHz之间,其衰减程度与频率成正比(即频率越高,传播距离越短)
在室温20°C的环境中,声波的传输速度约为344m/s(声音在水中传播的速度比在空气快60倍),因此,假设超声波往返的时间为600μs,可通过公式:
求得:被测物的距离为10.3cm。
影响声音传播速度的因素:
1、空气的密度会影响声音的传播速度,空气的密度越高,声音的传播速度越快,而空气的密度又与温度密切相关,考虑温度变化的声音传播速度的近似公式:
速度=V0+0.6×T
其中, V 0 V_0 V0:声音在0摄氏度时的传播速度331.5米/秒。T:温度
2、物体的形状和材质会影响超声波传感器的效果和准确度,探测表面平整的墙壁和玻璃时,声波将会入射角度反射回来;只要物体表面的坑洞尺寸小于声波波长的 1 4 \frac{1}{4} 41,即可视为平整表面。波长计算公式:
超声波传感器简介
超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有4个引脚:VCC(正极)、Trig(触发)、Echo(回应)、GND(接地),主要参数:
工作电压与电流 :5V、15mA。
感测距离 :2~400cm
感测角度:不大于15°。
被测物的面积不要小于50cm²并且尽量平整。
在超声波模块的触发脚位输入10微妙以上的高电位,即可发射超声波,发射超声波之后,与接收到传回的超声波之前,“响应”脚位呈现高电位。因此,程序可从“响应”脚位的高电位脉冲持续时间,换算出被测物的距离。
代码及解析:
pulseIn():用于检测引脚输出的高低电平的脉冲宽度。
pulseIn(pin, value)
pulseIn(pin, value, timeout)
Pin—需要读取脉冲的引脚
Value—需要读取的脉冲类型,HIGH或LOW
Timeout—超时时间,单位微秒,数据类型为无符号长整型。
使用方法及时序图:
1、使用Arduino数字引脚给SR04的Trig引脚至少10μs的高电平信号,触发SR04模块测距功能。
2、触发后,模块会自动发送8个40KHz的超声波脉冲,并自动检测是否有信号返回。这步会由模块内部自动完成。
3、如有信号返回,Echo引脚会输出高电平,高电平持续的时间就是超声波从发射到返回的时间。此时,我们能使用pulseIn()函数获取到测距的结果,并通过公式计算出距被测物的实际距离。
接线图:
Arduino UNO R3 | HC-RS04 |
---|---|
+5V | +5V |
D7 | Trigger |
D6 | Echo |
GND | GND |
代码:
const int pingPin = 7; // Trigger Pin of Ultrasonic Sensor
const int echoPin = 6; // Echo Pin of Ultrasonic Sensor
void setup() {
Serial.begin(9600); // Starting Serial Terminal
}
void loop() {
long duration, inches, cm;
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(10);
digitalWrite(pingPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);
Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(100);
}
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}
long microsecondsToCentimeters(long microseconds) {
return microseconds / 29 / 2;
}