OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6384|回复: 2

超声波测距[电平触发]

[复制链接]

1

主题

4

帖子

0

精华

初级会员

Rank: 2

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


[mw_shl_code=c,true]#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;
}
[/mw_shl_code]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

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

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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