所需硬件:
三线超声波传感器,本文使用的是Parallax 28015
有用链接:
CY8CKIT-059_快速入门指南 - CY8CKIT-059_快速入门指南.pdf (1.3 MB)
28015-PING传感器产品指南v2.0 - 28015-PING传感器产品指南v2.0.pdf (383.2 KB)
超声波传感器概述:
超声波传感器(如Parallax 28015)的工作原理如下。首先,外部微控制器将向传感器的信号引脚施加一个脉冲以开始测量。然后,传感器将发射超声波脉冲。一旦脉冲发出,传感器将监听脉冲的回声,并开始记录从脉冲发出到回声接收之间的时间长度,这被称为飞行时间。一旦接收到回声,传感器将在信号引脚上输出一个脉冲。该脉冲的长度对应于脉冲的飞行时间。一旦获得输出脉冲的长度,微控制器就可以进行简单的计算以确定距离测量值。
将传感器的输出脉冲长度转换为距离的计算如下。
- 首先,需要考虑声音在空气中的速度随空气温度变化的事实。其公式为:声音在空气中的速度= 331.5 + (0.6 x 空气温度 ) m/s , 其中空气温度以摄氏度为单位。在室温(21度)下,声音的速度应为344.1 m/s。
- 测量距离的公式为:距离 = ( 飞行时间 x 声音在空气中的速度 )/2 。 28015的数据手册指出,输出脉冲的最小长度为115微秒,最大长度为18500微秒。使用344.1 m/s作为声音速度的值,我们可以计算出可测量距离的范围大约为0.027米(0.85英尺)到3.18米(10.4英尺)。任何超出此范围的对象都无法准确测量。
使用超声波传感器的一些优点:
- 它们提供了一种简单方便的方法来测量两个物体之间的距离,而无需物理接触任一物体。
- 它们通常比红外距离传感器具有更大的范围。
使用超声波传感器的一些缺点:
- 如上所述,声音在空气中的速度随温度变化,因此连接到传感器的微控制器通常需要一些方法来校正这些变化。
- 它们将无法检测到以某种角度倾斜的表面,使得反射信号无法击中传感器。它们也难以检测由软材料组成的物体,这些材料不能很好地反射声音。
传统方法:
与三线超声波传感器接口的正常方法是使用单个GPIO引脚和计时器来记录输出脉冲的长度。
采用如下所示的电路和代码:
传统方法 Main.c
/* ========================================
*
* Copyright YOUR COMPANY, THE YEAR
* All Rights Reserved
* UNPUBLISHED, LICENSED SOFTWARE.
*
* CONFIDENTIAL AND PROPRIETARY INFORMATION
* WHICH IS THE PROPERTY OF your company.
*
* ========================================
*/
#include <project.h>
uint16 counts = 0;
float feet = 0;
uint16 i = 0;
int main()
{
CyGlobalIntEnable;
for(;;)
{
//Timer_1_Init(); //Initiate timer
Pin_1_Write(1);
CyDelayUs(10);
Pin_1_Write(0);
while(Pin_1_Read() != 1) //wait until return pulse starts
{
}
Timer_1_Start();
while(Pin_1_Read() != 0) //wait unit return pulse stops
{
}
counts = 0xFFFF-Timer_1_ReadCounter();
feet = counts * 0.00056325; //Convert pulse width to feet, to convert to meters, multiply by 0.0001717 instead.
if (feet < 1.0 )
{
LED_Write(1);
}
else
{
LED_Write(0);
}
CyDelay(100);
Timer_1_Stop();
}
}
/* [] END OF FILE */
这个实现非常简单。处理器将Sonic_Sensor引脚驱动为高电平以启动传感器,然后将其驱动为低电平并等待返回脉冲。一旦检测到返回脉冲,处理器启动计时器。一旦返回脉冲结束,处理器从计时器读取值并使用它来计算距离。然后处理器等待计时器运行完毕,过程再次开始。
这种方法是与此类传感器接口的典型方式,几乎任何微控制器都可以执行此操作。下面的部分展示了另一种使用PSOC 5LP的通用数字块(UDB)实现相同功能的方法,这是Cypress PSOC平台独有的功能。
基于通用数字块( UDB )的方法:
我们可以使用PSOC的UDB来创建一个电路,而不是使用上面所示的基于简单计时器的方法,该电路将完成相同的任务。
采用如下所示的电路:
每个电路组件的功能如下:
- Sonic Sensor引脚:用于向超声波传感器发送启动脉冲并接收返回脉冲的双向IO引脚。
- Enable引脚:用于启用触发器和计数器的IO引脚
- 计数器:用于记录返回脉冲的长度。
- Toggle触发器:将超声波传感器的输出脉冲转换为脉冲序列,从而递增计数器。
- AND门:确保仅在Enable线为高电平时触发器才会递增。
- 非门:当使能线切换为低电平时,重置计数器。
- Clock_1:驱动计数器的时钟,以Clock_2两倍的频率运行。
- Clock_2:驱动触发器的时钟,以Clock_1一半的频率运行。
- Sync_1:同步Clock_1和Clock_2,即确保Clock_1和Clock_2具有相同的相位。
- LED:用于指示。
电路记录距离测量的过程如下:
- 处理器将Sonic_Sensor引脚驱动为高电平10微秒,以启动超声波传感器。
- 一旦10微秒过去,处理器指示Sonic_Sensor引脚作为输入以接收返回脉冲。
- 然后使能引脚被驱动为高电平,以启用触发器和计数器。
- 超声波传感器的输出脉冲将驱动Sonic_Sensor引脚为高电平。一旦触发器的输入为高电平,其输出将以1 MHz的频率(其时钟频率的一半)在高电平和低电平之间切换。这实际上意味着输出脉冲持续每微秒将有一个计数。
- 一旦输出脉冲停止,触发器的输出将保持高电平,因此计数器将停止递增。处理器现在可以读取计数器以获取距离测量值。
- 一旦读取了测量值,处理器将驱动使能引脚为低电平以重置计数器。
执行此过程所需的代码可以在下面找到,完整的psoc creator项目可以在本文的示例项目部分找到。
UDB方法 Main.c
/* ========================================
*
* Copyright YOUR COMPANY, THE YEAR
* All Rights Reserved
* UNPUBLISHED, LICENSED SOFTWARE.
*
* CONFIDENTIAL AND PROPRIETARY INFORMATION
* WHICH IS THE PROPERTY OF your company.
*
* ========================================
*/
#include <project.h>
int main()
{
CyGlobalIntEnable; /* Enable global interrupts. */
Counter_Start();
for(;;)
{
uint16 counts = 0; // value to store results from the counter
float feet = 0;
Enable_Write(0);
Sonic_Sensor_Write(1); //Output the sensor pulse
CyDelayUs(10); //wait for the sensor pulse to finish
Sonic_Sensor_Write(0); //shut off the sensor pulse
Enable_Write(1);
Sonic_Sensor_Read(); //receive return pulse
CyDelay(50); // wait for the maximum value of the return pulse
counts = Counter_ReadCounter();// read counter value
feet = counts * 0.00056325; //convert pulse width to feet, to convert to meters, multiply by 0.0001717 instead.
CyDelayUs(10);
if (feet < 1.0 )
{
LED_Write(1);
}
else
{
LED_Write(0);
}
Enable_Write(0);// reset the counter
}
}
/* [] END OF FILE */
示例项目:
下面的工作区包含上述传统方法和基于UDB方法的PSOC Creator项目:
PSOC_Ultrasonic.zip (9.6 MB)
问题 / 评论
希望本文向您展示了如何将三个超声波传感器连接到PSOC,并让您了解PSOC提供的灵活性。
有关此页面或其他页面的信息的问题或反馈,请访问技术论坛。