在本教程中,我们将讨论和设计用于测量距离的电路。该电路是通过将超声波传感器“ HC-SR04”与AVR微控制器连接而开发的。该传感器使用一种称为“ ECHO”的技术,当声音在撞击表面后反射回去时,您会得到这种感觉。
我们知道,声音振动无法穿透固体。因此,当声源产生振动时,它们便以每秒220米的速度在空气中传播。当这些振动碰到我们的耳朵时,我们将其描述为声音。如前所述,这些振动不能穿过固体,因此当它们以壁之类的表面撞击时,它们将以相同的速度反射回源,这称为回波。
超声波传感器“ HC-SR04”根据回波提供与距离成正比的输出信号。传感器在发出触发信号后会在超声波范围内产生声振动,然后等待声振动返回。现在,根据参数,声速(220m / s)和回声到达声源所需的时间,它提供与距离成正比的输出脉冲。
如图所示,首先我们需要启动传感器进行距离测量,即传感器的触发引脚上的HIGH逻辑信号超过10uS,之后传感器发出声音振动,回声后,传感器提供在输出引脚上的信号,其宽度与源和障碍物之间的距离成比例。
此距离的计算方式为:距离(以厘米为单位)=脉冲输出的宽度(以美国为单位)/ 58。
在这里,信号的宽度必须采用uS(微秒或10 ^ -6)的倍数。
所需组件
硬件: ATMEGA32,电源(5v),AVR-ISP编程器,JHD_162ALCD(16x2LCD),1000uF电容器,10KΩ电阻(2个),HC-SR04传感器。
软体: Atmel studio 6.1,progisp或flash magic。
电路图和工作说明
在这里,我们使用PORTB连接到LCD数据端口(D0-D7)。不想使用ATMEGA32A的FUSE BITS的任何人都不能使用PORTC,因为PORTC包含一种特殊的通信类型,只能通过更改FUSEBITS来禁用。
在电路中,您观察到我只接了两个控制引脚,这为更好地理解提供了灵活性。对比度位和READ / WRITE不经常使用,因此它们可以接地。这使LCD处于最高对比度和读取模式。我们只需要控制ENABLE和RS引脚即可相应地发送字符和数据。
LCD的连接如下所示:
PIN1或VSS接地
PIN2或VDD或VCC至+ 5v电源
PIN3或VEE接地(为初学者提供最大对比度)
PIN4或RS(寄存器选择)至uC的PD6
PIN5或RW(读/写)接地(将LCD置于读模式可简化用户的通信)
PIN6或E(启用)到uC的PD5
uC的PIN7或D0至PB0
uC的PIN8或D1至PB1
uC的PIN9或D2至PB2
uC的PIN10或D3至PB3
uC的PIN11或D4至PB4
uC的PIN12或D5至PB5
uC的PIN13或D6至PB6
uC的PIN14或D7至PB7
在电路中,您可以看到我们使用了8位通信(D0-D7),但这不是强制性的,我们可以使用4位通信(D4-D7),但是使用4位通信程序会变得有些复杂。因此,如上表所示,我们将LCD的10个引脚连接到控制器,其中8个引脚为数据引脚,另外2个为控制引脚。
超声波传感器是四针设备,PIN1- VCC或+ 5V;PIN2-TRIGGER; PIN3- ECHO; PIN4-接地。触发针是我们触发的地方,告诉传感器测量距离。回波是输出引脚,在这里我们以脉冲宽度的形式获得距离。回波引脚在此连接到控制器作为外部中断源。为了获得信号输出的宽度,传感器的回波引脚连接到INT0(中断0)或PD2。
1.通过拉起至少12uS的触发引脚来触发传感器。
2.一旦回波变高,我们将得到一个外部中断,我们将在ISR(中断服务程序)中启动一个计数器(使能计数器),该计数器在中断触发后立即执行。
3.一旦回波再次变低,将产生一个中断,这一次我们将停止计数器(禁用计数器)。
4.因此,对于回波引脚上从高到低的脉冲,我们启动了一个计数器并将其停止。此计数已更新到内存中以获取距离,因为我们现在具有计数的回声宽度。
5.我们将在内存中做进一步的计算,以获取以厘米为单位的距离
6.距离显示在16x2 LCD显示屏上。
为了设置上述功能,我们将设置以下寄存器:
以上三个寄存器将进行相应设置以使设置正常工作,我们将简要讨论它们,
BLUE(INT0):必须将该位置1以使能外部中断0,一旦设置了该引脚,我们就可以感知PIND2引脚上的逻辑变化。
棕色(ISC00,ISC01):调整这两个位以实现PD2处的适当逻辑更改,将其视为中断。
因此,如前所述,我们需要一个中断来开始计数并停止它。因此,我们将ISC00设置为1,并且当INT0处逻辑低电平到高电平时得到中断。逻辑高到低时,另一个中断。
RED(CS10):此位仅用于启用和禁用计数器。尽管它与其他位CS10,CS12一起工作。我们在这里不做任何预缩放,因此我们不必担心它们。
这里要记住一些重要的事情:
我们正在使用ATMEGA32A的内部时钟,该时钟为1MHz。这里没有预分频,我们不做比较匹配中断生成例程,因此没有复杂的寄存器设置。
计数后的计数值存储在16位TCNT1寄存器中。
还要用arduino检查该项目:使用Arduino进行距离测量
编程说明
在下面的C程序中逐步解释了测距传感器的工作原理。
#include //标头以启用对引脚的数据流控制#define F_CPU 1000000 //附加了告诉控制器晶体的频率#include