关于超声波测距的问题
本帖最后由 zgbkdlm 于 2012-9-12 12:01 编辑器件为Atmega128
用定时器3捕获来算时间.
interrupt void cap3 (void) //这是捕获中断
{
icr3h=ICR3H;
icr3l=ICR3L;
TCNT3H=0x00;
TCNT3L=0x00;
TCCR3B^=0b01000000; //触发方式取反
}
PORTA=0xff;
delay_us(30); //发射一个宽度>20US的脉冲
PORTA=0x00;
delay_ms(300);
timerdata=icr3l+icr3h*256;//开始计算转化距离
time=4*timerdata/1000000.000000;
distance=time*340/2.0000;
distance1=time*100;
lcd_clear(); //To display the number
lcd_puts("The distance is");
lcd_gotoxy(1,1);
temp1=distance1/1000;
lcd_putchar(data);
temp1=distance1%1000/100;
lcd_putchar(data);
lcd_putchar(46);
temp1=distance1/10%100/10;
lcd_putchar(data);
temp1=distance1%10;
lcd_putchar(data);
lcd_putchar(0x4d);
实际显示始终显示00.01,液晶显示部分没有问题,设置了一个数5236,显示为52.36没有问题.而且输入捕捉也工作,转化部分哪出了问题呢? 楼主啊,你的莫元才 9啊 0712 发表于 2012-9-12 11:56 static/image/common/back.gif
楼主啊,你的莫元才 9啊
已经扣了58莫元...提前扣的,,, 哥们,超声波要发送40KHz,50%占空比的方波,而不是像你说的发送大于20us的电平信号,方波最好发送5个以上,这样探测到物体后反射回来的信号才能有效触发接收端,一般都设置为8个方波信号,大概能探测2m远吧。 coobot 发表于 2012-9-12 12:03 static/image/common/back.gif
哥们,超声波要发送40KHz,50%占空比的方波,而不是像你说的发送大于20us的电平信号,方波最好发送5个以上 ...
我用的HC-SR04能自动发出40KHZ的,只需要对模块发出20us的脉冲即可..
基本工作原理:
(1)采用IO 口TRIG 触发测距,给最少10us 的高电平信呈。
(2)模块自动发送8 个40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO 口ECHO 输出一个高电平,高电平持续的时间就是超声
波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2; PORTA=0xff;
delay_us(30); //发射一个宽度>20US的脉冲
PORTA=0x00;
delay_ms(300);
icr3l=0x0e;
icr3h=0xef; //我直接在这付了一个值,显示也还是00.01.那就肯定是这部分原因了
timerdata=icr3l+icr3h*256;//开始计算转化距离
time=4*timerdata/1000000.000000;
distance=time*340/2.0000;
distance1=time*100;
lcd_clear(); //To display the number
lcd_puts("The distance is");
lcd_gotoxy(1,1);
temp1=distance1/1000;
lcd_putchar(data);
temp1=distance1%1000/100;
lcd_putchar(data);
lcd_putchar(46);
temp1=distance1/10%100/10;
lcd_putchar(data);
temp1=distance1%10;
lcd_putchar(data);
lcd_putchar(0x4d);
我建议你加个 测试的临时变量 先把寄存器里的值 先显示出来确保 寄存器里的值 是对的先 ,。一步 一步来。 zgbkdlm 发表于 2012-9-12 12:10 static/image/common/back.gif
PORTA=0xff;
delay_us(30); //发射一个宽度>20US的脉冲
PORTA=0x00;
你的time和timedata之类的数据类型是什么?我觉得是数据类型的问题,你最好一步一步显示计算中间值。一步步调试,不要急 啊...谢谢各位大大啊...寄存器的值木有问题啊...亲...
我的timerdata和distance1是LONG INT.
TIME和DISTANCE是FLOAT型...
我也觉得是变量哪个地方不对.. 本帖最后由 guilty2468 于 2012-9-12 12:48 编辑
time=4*timerdata/1000000.000000;
这个除太大了,你把它改成
time=4*timerdata/1000000试试
这个类型应该不同,或者
time=4*((float)timerdata)/1000000.000000;
试试 zgbkdlm 发表于 2012-9-12 12:42 static/image/common/back.gif
啊...谢谢各位大大啊...寄存器的值木有问题啊...亲...
我的timerdata和distance1是LONG INT.
TIME和DISTANC ...
?不行? guilty2468 发表于 2012-9-12 12:58 static/image/common/back.gif
?不行?
恩........一直是00.01...蛋疼.... timedata可能超了,你把它直接付个值,付个10000 ,要是没问题就是timedata不够。
不行,再把distance1赋个值,应该可以。
那就是distance1可能超过了转换,你除1000应该大于10,没法显示
temp1 是int型? guilty2468 发表于 2012-9-12 13:07 static/image/common/back.gif
timedata可能超了,你把它直接付个值,付个10000 ,要是没问题就是timedata不够。
不行,再把distance1赋个 ...
谢谢你的回答,我犯了一个2B错误
timerdata=icr3l+icr3h*256;//开始计算转化距离
time=4*timerdata/1000000.000000;
distance=time*340/2.0000;
distance1=time*100;
distance1=distance*100
我2B了....... 计时器没调用好,要不就是你那个超声波出问题了换一个试试,你测试的时候那个灯闪吗?要是不闪就是接收不到!还有这个time=4*((float)timerdata)/1000000.000000;你看看手册是这公式吗?{ //以下为路程计算
temp=high_time*256+low_time;
temp=(temp/1000)/2;
temp*=340;
temp=temp/10;
你试试这个公式 zgbkdlm 发表于 2012-9-12 15:23 static/image/common/back.gif
谢谢你的回答,我犯了一个2B错误
timerdata=icr3l+icr3h*256;//开始计算转化距离
time=4*timerd ...
我擦,我怎么就没看出来,其实看不了不同了,但是没在意
页:
[1]