OpenEdv-开源电子网

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

32小车超声波问题,跪求help

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-4-3
在线时间
0 小时
发表于 2018-4-3 11:34:57 | 显示全部楼层 |阅读模式
1金钱
买的是鸥鹏灭火机器人套件超声波模块是HC-SR04
下面是他给的引脚和接线图

我只按照说明接了前超声波,这个是串口测试结果


求大神告知哪里出了问题
下面附上测试程序
*********************************************************************
* 文件名                  : main.c
* 作者                     : Losingamong
* 生成日期                  : 14/09/2010
* 描述                        : 主程序
********************************************************************************/



/* 头文件    ------------------------------------------------------------------*/

#include "stm32f10x_lib.h"
#include "stdio.h"

/* 自定义同义关键字    --------------------------------------------------------*/

/* 自定义参数宏        --------------------------------------------------------*/

/* 自定义函数宏        --------------------------------------------------------*/

/* 自定义全局变量      --------------------------------------------------------*/

/* 自定义函数声明      --------------------------------------------------------*/

void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);

void delay_nus(unsigned long n)  //延时n us: n>=6,最小延时单位6us
{
  unsigned long j;
  while(n--)              // 外部晶振:8M;PLL:9;8M*9=72MHz
  {
    j=8;                                  // 微调参数,保证延时的精度
        while(j--);
  }
}
void delay_nms(unsigned long n)  //延时n ms
{
  while(n--)                   // 外部晶振:8M;PLL:9;8M*9=72MHz
    delay_nus(1100);   // 1ms延时补偿
}


void Tim4_Init()
{
  /* TIM4 Peripheral Configuration */
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   
  TIM_DeInit(TIM4);

  /* Time Base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period = 0xffff;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
  TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);  

  TIM_PrescalerConfig(TIM4,71, TIM_PSCReloadMode_Immediate);   
   /* enable preload value */
  TIM_ARRPreloadConfig(TIM4,DISABLE);  
  TIM_SetCounter(TIM4,0);
  TIM_Cmd(TIM4,DISABLE);
}
int GetDis(GPIO_TypeDef * GPIO,int echo,int trig)
{
    u16 dis;
        u16 count;
        GPIO_ResetBits(GPIO,echo);
        GPIO_ResetBits(GPIO,trig);

        Tim4_Init();

        GPIO_SetBits(GPIO,trig);                          //trig置高 发出10us的高电平信号
        delay_nus(10);
        GPIO_ResetBits(GPIO,trig);                    
        while(GPIO_ReadInputDataBit(GPIO, echo) == 0);
        TIM_Cmd(TIM4,ENABLE);    //开启计数器
       //开启定时器开始计时
        while(GPIO_ReadInputDataBit(GPIO, echo));   //等待echo置低
        TIM_Cmd(TIM4,DISABLE);   //关闭计数器

        count = TIM_GetCounter(TIM4);//获取计数器值
        dis = count/5.88;//转换为距离,即29.034us超声波能传播1cm
        return dis;
}



/*******************************************************************************
* 函数名                  : main
* 函数描述            : 主函数
* 输入参数      : 无
* 输出结果             : 无
* 返回值        : 无
*******************************************************************************/

int main(void)
{

        int distance ;
        Tim4_Init();
          /* 设置系统时钟 */
          RCC_Configuration();

          /* 设置 GPIO 端口 */
          GPIO_Configuration();

           /* 设置 USART */
        USART_Configuration();



//          printf("\r\n The sonar_value is:-------------------------- \r\n");

        while(1)
        {       
        //        distance=GetDis(GPIOA,GPIO_Pin_1,GPIO_Pin_0);
                printf( "\r\nThe left sonar_value = %d\r\n", distance);
                delay_nms(1000);
                       
//        distance=GetDis(GPIOA,GPIO_Pin_3,GPIO_Pin_2);
                printf( "\r\nThe middle sonar_value = %d\r\n", distance);
                delay_nms(1000);

//distance=GetDis(GPIOC,GPIO_Pin_7,GPIO_Pin_6);
                printf( "\r\nThe right sonar_value = %d\r\n", distance);
                delay_nms(1000);

        }
}



/*******************************************************************************
* 函数名        : RCC_Configuration
* 函数描述  : 设置系统各部分时钟
* 输入参数  : 无
* 输出结果  : 无
* 返回值    : 无
*******************************************************************************/

void RCC_Configuration(void)
{
        /* 定义枚举类型变量 HSEStartUpStatus */
        ErrorStatus HSEStartUpStatus;

          /* 复位系统时钟设置 */
          RCC_DeInit();
          /* 开启 HSE */
          RCC_HSEConfig(RCC_HSE_ON);
          /* 等待 HSE 起振并稳定 */
          HSEStartUpStatus = RCC_WaitForHSEStartUp();
        /* 判断 HSE 起是否振成功,是则进入if()内部 */
          if(HSEStartUpStatus == SUCCESS)
          {
            /* 选择 HCLK(AHB)时钟源为SYSCLK 1分频 */
            RCC_HCLKConfig(RCC_SYSCLK_Div1);
            /* 选择 PCLK2 时钟源为 HCLK(AHB)1分频 */
            RCC_PCLK2Config(RCC_HCLK_Div1);
            /* 选择 PCLK1 时钟源为 HCLK(AHB)2分频 */
            RCC_PCLK1Config(RCC_HCLK_Div2);
            /* 设置 FLASH 延时周期数为2 */
            FLASH_SetLatency(FLASH_Latency_2);
            /* 使能 FLASH 预取缓存 */
            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
            /* 选择锁相环(PLL)时钟源为 HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
            RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
            /* 使能 PLL */
            RCC_PLLCmd(ENABLE);
            /* 等待 PLL 输出稳定 */
            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
            /* 选择 SYSCLK 时钟源为 PLL */
            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
            /* 等待 PLL 成为 SYSCLK 时钟源 */
            while(RCC_GetSYSCLKSource() != 0x08);
          }

          /* 使能各个用到的外设时钟 */
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |
                                                    RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);

}



/*******************************************************************************
* 函数名                  : GPIO_Configuration
* 函数描述            : 设置各GPIO端口功能
* 输入参数      : 无
* 输出结果      : 无
* 返回值        : 无
*******************************************************************************/

void GPIO_Configuration(void)
{
        /* 定义 GPIO 初始化结构体 GPIO_InitStructure */
          GPIO_InitTypeDef GPIO_InitStructure;

        /* 设置 USART1 的Tx脚(PA.9)为第二功能推挽输出功能 */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOA , &GPIO_InitStructure);

          /* 设置 USART1 的Rx脚(PA.10)为浮空输入脚 */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          GPIO_Init(GPIOA , &GPIO_InitStructure);

          /* 将 PB.0 设置为模拟输入脚 */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
          GPIO_Init(GPIOB , &GPIO_InitStructure);


          /* 将 PA.1 PA.3 设置为浮空输入脚 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_3;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          GPIO_Init(GPIOA , &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          GPIO_Init(GPIOC , &GPIO_InitStructure);
               
          /* 将 PA.0 PA.2 设置为推挽输出脚 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

}




/*******************************************************************************
* 函数名                  : USART_Configuration
* 函数描述            : 设置USART1
* 输入参数      : 无
* 输出结果      : 无
* 返回值        : 无
*******************************************************************************/

void USART_Configuration(void)
{
        /* 定义 USART 初始化结构体 USART_InitStructure */
          USART_InitTypeDef USART_InitStructure;

        /*        波特率为115200bps;
        *        8位数据长度;
        *        1个停止位,无校验;
        *        禁用硬件流控制;
        *        禁止USART时钟;
        *        时钟极性低;
        *        在第2个边沿捕获数据
        *        最后一位数据的时钟脉冲不从 SCLK 输出;
        */

        USART_InitStructure.USART_BaudRate = 115200;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No ;
        USART_InitStructure.USART_HardwareFlowControl =  USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART1 , &USART_InitStructure);

          /* 使能 USART1 */
          USART_Cmd(USART1 , ENABLE);
}



/*******************************************************************************
* 函数名                  : fputc
* 函数描述            : 将printf函数重定位到USATR1
* 输入参数            : 无
* 输出结果            : 无
* 返回值                : 无
*******************************************************************************/

int fputc(int ch, FILE *f)
{
        USART_SendData(USART1, (u8) ch);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        return ch;
}




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-4-3
在线时间
0 小时
 楼主| 发表于 2018-4-3 15:15:49 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-4-4 00:55:13 | 显示全部楼层
帮顶
回复

使用道具 举报

7

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2018-3-28
在线时间
43 小时
发表于 2018-4-4 08:20:17 | 显示全部楼层
帮顶
回复

使用道具 举报

7

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2017-4-6
在线时间
67 小时
发表于 2018-4-4 09:00:19 | 显示全部楼层
别上来就贴代码啊,你不把问题描述清楚,谁愿意看这么长代码
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 22:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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