1. 超声波传感器简介
简介:超声波传感器是将超声波信号转换成其他能量信号的传感器。超声波是振动频率高于20kHz的机械波超声波测距主要应用于一些工业现场的位置监控、移动机器人的自动避障行走、汽车倒车、建筑施工工地,可在潮湿高温。多尘等恶劣环境下工作。例如:液位、厚度、管道长度等场合。
技术特点:超声波具有指向性强、能量消耗缓慢且在介质中传播的距离较远的优点,因而经常用于距离的测量。相比于其它定位技术而言,超声波定位技术成本低、精度高、操作简单、工作稳定可靠,非常适合于短距离测量定位。cc2530单片机为许多控制提供了高度灵活和低成本的解决办法。
2. 超声波传感器测距原理
3. HC-SR04的工作时序
4. 计算测量距离方法
5. 使用定时器1测量响应引脚高电平的时间
6. 定时器工作模式的选择
超声波模块的测量范围为2mm-450mm,对应的时间最大为:4.5*2/340=0.02647S。
我们这里采用32Mhz系统时钟,32分频,自由运行模式。
- (1/32000000)*32=0.000001,得出定时器计数周期。
- 65535*0.000001=0.065535S。使用计数器最大值*计数器周期得出最大定时时长。
此时定时器的时钟精度为(1/1000000)S,对应的测量距离精度为:340m/S*(1/1000000)S=0.00034m。
7. 计算距离
由定时器1模式和分频划分,我们计数周期是1/1000000S,计数周期*声音在空气中传播速度。
那一个周期时间内声音传播的距离是0.34mm,我们通过计数器的值乘以这个速度,即可得到距离。
S=(0.34*t)/2
8. 实验代码
#include "iocc2530.h"
#include "stdio.h"
#define LED1 P1_0 //数据采集指示灯
#define trig P0_4 //触发,产生脉冲引脚
#define echo P0_5 //响应,回波引脚
void init()
{
P1DIR |=0X01;
LED1=1;
P0DIR |=0X10; //trig设为输出,默认高电平无触发
trig=1;
P0DIR &=~0X20; //echo设为输入,默认低电平无响应
echo=0;
}
void Delay_uS(unsigned int n)
{
unsigned int i = 0;
for(;i < n; i++);
}
void UART()
{
PERCFG &=~0X01;
P0SEL |=0X0C;
U0BAUD=59;
U0GCR=8;
U0UCR |=0X80;
U0CSR |=0Xc0;
UTX0IF =0;
URX0IF =0;
URX0IE =1;
EA=1;
}
void clock()
{
CLKCONCMD &=~0X40;
while(CLKCONSTA & 0X40);
CLKCONCMD &=~0X07;
}
void byte(unsigned char dat)
{
U0DBUF=dat;
while(UTX0IF==0);
UTX0IF=0;
}
void wdt_init()
{
WDCTL=0X0C;
}
void string(unsigned char *str)
{
while(*str != '\0')
{
byte(*str++);
}
}
long t=0,s=0;
unsigned char data[10];
void main()
{
clock();
UART();
init();
wdt_init();
while(1)
{
if(WDTIF==1)
{
WDTIF=0;
trig=0;
Delay_uS(20);
trig=1;
while(echo==0);
T1CTL=0X09;
while(echo==1);
T1CTL=0X00;
t = T1CNTH; //读取定时器高8位数据
t <<= 8;
t += T1CNTL; //读取定时器低8位数据
s = (t * 0.34) / 2;
sprintf(data,"%d",s);
string(data);
T1CNTL=0;
T1CNTH=0;
t=0;
}
}
}