为了使任何项目生效,我们需要使用传感器。传感器充当所有嵌入式应用程序的眼睛和耳朵,它有助于数字微控制器了解在此真实模拟世界中实际发生的情况。在本教程中,我们将学习如何将超声波传感器HC-SR04与PIC微控制器接口。
的HC-SR04是超声波传感器,其可以被用于测量2厘米之间的距离的任何地方,以450厘米(理论上)。通过将其安装到涉及障碍物检测,距离测量,环境贴图等许多项目中,证明了该传感器的价值。在本文的最后,您将学习该传感器的工作原理以及如何与PIC16F877A单片机接口以测量距离并显示。它在LCD屏幕上。听起来很有趣吧!所以我们开始吧…
所需材料:
- 具有编程设置的PIC16F877A MCU
- LCD 16 * 2显示屏
- 超声波传感器(HC-SR04)
- 连接线
超声波传感器如何工作?
在进一步了解之前,我们应该了解超声波传感器的工作原理,以便我们可以更好地理解本教程。该项目中使用的超声波传感器如下所示。
如您所见,它有两个像投影一样的圆形眼睛和四个销钉。两眼状的投影是超声波(以下称为US波)发射器和接收器。发射器以40Hz的频率发射US波,该波在空中传播并在感应到物体时被反射回去。接收器观察到返回的波。现在我们知道了该波被反射并返回所需的时间,而美国波的速度也是通用的(3400cm / s)。使用此信息和下面的高中公式,我们可以计算距离。
距离=速度×时间
现在我们知道了US传感器的工作原理,下面让我们使用这四个引脚将其与任何MCU / CPU接口。这四个引脚分别是Vcc,触发器,回波和地。该模块在+ 5V上工作,因此使用Vcc和接地引脚为模块供电。另外两个引脚是I / O引脚,通过它们我们与MCU进行通信。该触发销应声明为输出引脚和用于在10uS为高,这将发送美国波到空气中8周期脉冲串的声波。一旦观察到波动,回波引脚将在正确的时间间隔内变高,这是美国波动返回传感器模块所花费的时间。因此,此Echo引脚将被声明为输入定时器将用于测量引脚为高电平的时间。这可以通过下面的时序图进一步理解。
希望您已经找到了一种尝试将该传感器与PIC接口的方法。在本教程中,我们将使用计时器模块和LCD模块,并且我认为您对这两者都很熟悉,否则请回到下面的相应教程,因为我将跳过与之相关的大多数信息。
- 与PIC单片机的LCD接口
- 了解PIC单片机中的定时器
电路原理图:
超声波传感器与PIC16F877A接口的完整电路图如下所示:
如图所示,该电路仅涉及LCD显示器和超声波传感器本身。US传感器可以由+ 5V供电,因此直接由7805稳压器供电。传感器具有一个输出引脚(触发引脚),该引脚连接到引脚34(RB1),输入引脚(回波引脚)连接到引脚35(RB2)。下表说明了完整的引脚连接。
序号 |
PIC针号 |
引脚名称 |
连接到 |
1个 |
21 |
RD2 |
LCD的RS |
2 |
22 |
RD3 |
LCD的E |
3 |
27 |
RD4 |
LCD D4 |
4 |
28 |
RD5 |
LCD D5 |
5 |
29 |
RD6 |
LCD D6 |
6 |
30 |
RD7 |
LCD D7 |
7 |
34 |
RB1 |
美国的触发器 |
8 |
35 |
RB2 |
美国的回声 |
编程PIC单片机:
本教程的完整程序在本页面的结尾给出,在下面的内容中,我将代码解释为小块,供您理解。如前所述,该程序涉及LCD接口和Timer的概念,在本教程中将不做详细解释,因为我们在先前的教程中已经介绍了它们。
在内部,我们的主要功能是像往常一样初始化IO引脚和其他寄存器。我们定义LCD和US传感器的IO引脚,并通过将其设置为在1:4预分频器上使用并使用内部时钟(Fosc / 4)来启动Timer 1寄存器。
TRISD = 0x00; //声明PORTD为接口LCD TRISB0 = 1的输出;//将RB0引脚定义为输入,以用作中断引脚TRISB1 = 0; // US传感器的触发引脚作为输出引脚TRISB2 = 1发送;// US传感器的回波引脚设置为输入引脚TRISB3 = 0; // RB3是LED T1CON = 0x20的输出引脚; // 4个标量和内部时钟
定时器1是PIC16F877A中使用的16位定时器,T1CON寄存器控制定时器模块的参数,结果将存储在TMR1H和TMR1L中,因为它是16位结果,因此前8位将存储在TMR1H中,并且TMR1L中的下8个。可以分别使用TMR1ON = 0和TMR1ON = 1来打开或关闭该定时器。
现在,定时器可以使用了,但是我们必须将US波发送到传感器之外,为此,我们必须将Trigger引脚保持高电平10uS,这是通过以下代码完成的。
触发器= 1; __delay_us(10); 触发= 0;
如上面的时序图所示,回波引脚将保持低电平直到波形返回,然后变为高电平并保持高电平,直到波形返回所需的确切时间。此时间必须由Timer 1模块测量,这可以通过以下行完成
而(Echo == 0); TMR1ON = 1; 而(Echo == 1); TMR1ON = 0;
一旦测量了时间,结果值将保存在寄存器TMR1H和TMR1L中,必须汇总这些寄存器以获取16位值。这是通过使用下面的行完成的
time_taken =(TMR1L-(TMR1H << 8));
这 TIME_TAKEN 将在形式字节,让我们用下面的公式的实际时间值。
时间=(16位寄存器值)*(1 /内部时钟)*(预分频) 内部时钟= Fosc / 4其中,在我们的情况下,Fosc = 20000000Mhz,预分频= 4,因此内部时钟的值为5000000Mhz并且time的值将是Time =(16位寄存器值)*(1/5000000)*(4)=(16位寄存器值)*(4/5000000)=(16位寄存器值)* 0.0000008秒(OR)时间=(16位寄存器值)* 0.8微秒
在我们的程序中,16位寄存器的值存储在变量 time_taken中 ,因此,以下行用于计算 time_taken( 以微秒为单位)
time_taken = time_taken * 0.8;
接下来,我们必须找到如何计算距离。众所周知,距离=速度*时间。但是这里的结果应该除以2,因为电波同时覆盖了发射距离和接收距离。us波(声音)的速度为34000cm / s。
距离=(速度*时间)/ 2 =(34000 *(16位寄存器值)* 0.0000008)/ 2距离=(0.0272 * 16位寄存器值)/ 2
因此,距离可以按厘米计算,如下所示:
距离=(0.0272 * time_taken)/ 2;
计算完距离和时间后,我们只需要在LCD屏幕上显示它们即可。
使用PIC和超声波传感器测量距离:
建立连接并上传代码后,您的实验设置应如下图所示。
这张照片中的PIC Perf板是为我们的PIC教程系列制作的,在该系列中我们学习了如何使用PIC单片机。如果您不知道如何使用Pickit 3刻录程序,则可能要回到使用MPLABX和XC8的PIC单片机教程,因为我将跳过所有这些基本信息。
现在将一个物体放在传感器之前,它应该显示该物体与传感器的距离。您还可以注意到,波形传输和返回所需的时间以微秒为单位。
您可以将对象移动到您想要的距离,然后检查LCD上显示的值。我能够以0.5cm的精度测量2cm至350cm的距离。这是相当令人满意的结果!希望您喜欢本教程,并学习了如何自己制作东西。如果您有任何疑问,请将其放在下面的评论部分或使用论坛。
还要检查超声波传感器与其他微控制器的接口:
- 基于Arduino和超声波传感器的距离测量
- 使用Raspberry Pi和HCSR04超声波传感器测量距离
- 使用HC-SR04和AVR单片机进行距离测量