[求助] 菜鸟求助~~~超声波测距

基辅之门   2014-11-6 00:07 楼主
不用中断的超声波测距
TimerLoadSet(TIMER0_BASE,TIMER_A,SysCtlClockGet());//初值装满40000000
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, 0x08);//触发信号
SysCtlDelay(SysCtlClockGet()/3000000*20); //延时20微秒
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, 0x00);//触发结束等待回波
while(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_2)==0x00);//检测到回波上升沿跳出循环
TimerEnable(TIMER0_BASE, TIMER_A);//开始计时
while(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_2)==0x04);//检测到回波下降沿跳出循环
运行至此时用串口输出TimerLoadGet(TIMER0_BASE, TIMER_A)的值,无论超声模块怎么放得到的全是装的初值40000000为什么啊啊~~~

回复评论 (7)

while(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_2)==0x04)
这句改用 !=0 判断会怎么样?
加一段延时看计时器是否工作
点赞  2014-11-6 01:22
你应该用 TimerValueGet
点赞  2014-11-6 09:19
引用: Study_Stellaris 发表于 2014-11-6 09:19
你应该用 TimerValueGet

解决。。非常感谢!!
点赞  2014-11-6 09:57
引用: Study_Stellaris 发表于 2014-11-6 09:19
你应该用 TimerValueGet

额...修改之后还是有点问题
uint32_t timer_value,wave_distance;
uint8_t s[25];
TimerLoadSet(TIMER0_BASE,TIMER_A,SysCtlClockGet());//初值装满
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, 0x08);//触发信号
SysCtlDelay(800/3); //延时20微秒
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, 0x00);//触发信号结束
while(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_2)==0x00);//收到回波检测到上升沿跳出
TimerEnable(TIMER0_BASE, TIMER_A);//开始计时
while(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_2)==0x04);//回波信号结束检测到下降沿跳出
timer_value=SysCtlClockGet()-TimerValueGet(TIMER0_BASE, TIMER_A);//读取值
TimerDisable(TIMER0_BASE, TIMER_A);//停止计时
wave_distance=timer_value*344000/SysCtlClockGet();//计算距离
sprintf(s,"%d",wave_distance);//写入字符数组
UARTSend(s);//通过串口打印
为什么收到的数字都是1~110左右的一些奇怪的数,貌似只和超声波模块放的位置有一点点关联,例如模块固定,数字稍稳定。但距离根本不靠谱,且很不稳定。。。
点赞  2014-11-6 11:01
先不要管距离,首先要测试到准确的 timer_value.
也就是时间间隔。
这个间隔应该是从你发送完超声波立刻开始计时到你收到超声波停止。
我看你的程序好像是收到后开始计时,这里会不会有问题?
点赞  2014-11-6 11:18
测距,用PWM输入捕获啊;
点赞  2014-11-6 12:54
模块资料:
超声波模块
那个超声波模块时序是:
Trig端口给触发信号(>10us),发超声波脉冲,收到回波时echo端口返回脉冲,其脉宽持续时间等于从发射超声波到收到回波的间隔时间,所以测脉宽就行了,因此已收到才开始计时。
这里有一个成功的例子,不过是用的边沿中断:http://www.deyisupport.com/question_answer/microcontrollers/tiva_arm_cortex/f/96/t/73942.aspx
搞不清他用开漏输出是什么意思, 不是说开漏不能输入么
又看了下文档,说是在加触发前得把所有端口拉低,不知道是不是这个原因。。。但ehco端口已配置为GPIOPinTypeGPIOInput,不能输出了。。。
点赞  2014-11-6 14:08
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复