OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 3026|回复: 2

超声波测距[电平触发]

[复制链接]

  离线 

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-4-10
在线时间
5 小时
发表于 2018-5-5 15:06:55 | 显示全部楼层 |阅读模式
最近想组装小车,学习了一下超声波测距模块,用的是US-100,测试过,模块是好的,代码检查了一下午+一晚上了,可能因为我是菜鸟的原因愣是没找出错误出在哪里来,我用的电平触发方式,没用输入捕获,直接发了20us的高电平等待回收信号:收到高就用定时器开始计数,拉低时就失能,然后算数……结果输出总是0。求大佬帮助!恳求看一下我的代码哪里出的错!拜谢!
附上代码【中间用串口输出是为了方便看数据】


[C] 纯文本查看 复制代码
#include "delay.h"
#include "Ultrasonic.h"
#include "TIM4.h"
#include "led.h"

#define	TRIG_PORT      GPIOB		//TRIG       
#define	ECHO_PORT      GPIOB		//ECHO 
#define	TRIG_PIN       GPIO_Pin_8   //TRIG       
#define	ECHO_PIN       GPIO_Pin_9	//ECHO   

unsigned short int UltrasonicWave_Distance;      //计算出的距离    
vu32 averge_distance;

/*
 * 函数名:UltrasonicWave_Configuration
 * 描述  :超声波模块的初始化
 * 输入  :无
 * 输出  :无	
 */
void UltrasonicWave_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;	
  	       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
  GPIO_InitStructure.GPIO_Pin = TRIG_PIN;					 //PB8接TRIG
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		     //设为推挽输出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	         
  GPIO_Init(TRIG_PORT, &GPIO_InitStructure);	                 //初始化外设GPIO 

  GPIO_InitStructure.GPIO_Pin = ECHO_PIN;				     //PB9接ECH0
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		 //设为输入
  GPIO_Init(ECHO_PORT,&GPIO_InitStructure);						 //初始化GPIOB 
}

/*
 * 函数名:UltrasonicWave_CalculateTime
 * 描述  :计算距离
 * 输入  :无
 * 输出  :无	
 */
void UltrasonicWave_CalculateTime(void)
{
   UltrasonicWave_Distance=TIM_GetCounter(TIM4)*34*5/2000;	
}

/*
 * 函数名:UltrasonicWave_StartMeasure
 * 描述  :开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
 * 输入  :无
 * 输出  :无	
 */
void UltrasonicWave_StartMeasure(void)
{
  GPIO_SetBits(TRIG_PORT,TRIG_PIN); 		  							 //送>10US的高电平
  delay_us(20);		                     								 //延时20US
  GPIO_ResetBits(TRIG_PORT,TRIG_PIN);
  while(!GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN));		             //等待高电平
  TIM_Cmd(TIM4, ENABLE);                                   	 	         //定时器4使能
  while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN)==RESET);  	         //等待低电平    //修正bug:不加==RESET会出错
  TIM_Cmd(TIM4, DISABLE);			                         	         //定时器4失能
  UltrasonicWave_CalculateTime();										 //计算距离
  TIM_SetCounter(TIM4,0);
	printf("%d\n",TIM_GetCounter(TIM4));
 // printf("\r\ndistance:%d%d cm\r\n",UltrasonicWave_Distance/256,UltrasonicWave_Distance%256);	
}
void Average_Distance(void)
{
    UltrasonicWave_StartMeasure();  
	averge_distance=UltrasonicWave_Distance/256*100+UltrasonicWave_Distance%256;
}
回复

使用道具 举报

  离线 

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-4-10
在线时间
5 小时
 楼主| 发表于 2018-5-23 20:35:29 | 显示全部楼层
定时求助定时上贴~
回复 支持 反对

使用道具 举报

  离线 

0

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-1-16
在线时间
9 小时
发表于 2018-9-20 13:23:21 | 显示全部楼层
用US-100去做,是串口读取数据,电平的不好做
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




关闭

报名原子哥新品发布会&粉丝见面会上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-10-20 18:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */