OpenEdv-开源电子网

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

关于HC-SR04超声波传感器的实验,希望会的大神指点一下哪里错误?找了好久真的找不到错误在哪里

[复制链接]

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2018-3-11
在线时间
11 小时
发表于 2018-5-13 14:10:48 | 显示全部楼层 |阅读模式
5金钱
我用的开发板是mini板,学了原子哥的输入捕获实验后,就自己想做个东西玩玩,看着非常简单的东西,确不知道错误出在哪里?这是非常痛苦的,希望懂的大神指点一下哪里出错了
本人思路:超声波传感器就是你给他发送一个10us以上的高电平,便能激活超声波,然后他会将距离的值反应在高电平的持续时间输出,那么我就用输入捕获来测高电平的时间,然后根据时间与距离的关系来算得距离值。
出现的问题:距离测量相当不准确,不管传感器放在什么位置,它的距离值都是递增的

这是我写的输入捕获程序:
#include "csb.h"
#define TRIG PBout(1)      //ê1ó&#195B1×÷Îa3¬éù2¨′«¸DÆ÷μÄ′¥·¢êäèë¶Ë
#define ECHO PAin(0)       //ê1ó&#195A0×÷Îa»ØÏìDÅoÅμÄêäèë¶ËECHO

void csb_init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_InitT;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitT;
  TIM_ICInitTypeDef TIM_ICInitT;
        NVIC_InitTypeDef NVIC_InitT;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA,ENABLE);//ê1ÄüGBIOBμÄê±Öó
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//ê1Äü¶¨ê±Æ÷μÄê±Öó
        /*  
          PB1×÷Îa3¬éù2¨′«¸DÆ÷μÄ′¥·¢êä3ö¶ËTRIG
        */
        GPIO_InitT.GPIO_Mode =GPIO_Mode_Out_PP;
        GPIO_InitT.GPIO_Pin =GPIO_Pin_1;
        GPIO_InitT.GPIO_Speed =GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitT);
        GPIO_ResetBits(GPIOB,GPIO_Pin_1);//ÖÃ0
       
        /*
          PA0×÷Îa»ØÏìμçÆ½μÄêäèë¶ËECHO
        */
        GPIO_InitT.GPIO_Mode =GPIO_Mode_IPD;
        GPIO_InitT.GPIO_Pin =GPIO_Pin_1;
        GPIO_Init(GPIOA,&GPIO_InitT);
        GPIO_ResetBits(GPIOA,GPIO_Pin_1);//ÖÃ0
        /*
          ÅäÖö¨ê±Æ÷TIM5
        */
        TIM_TimeBaseInitT.TIM_ClockDivision =TIM_CKD_DIV1;
        TIM_TimeBaseInitT.TIM_CounterMode =TIM_CounterMode_Up;
        TIM_TimeBaseInitT.TIM_Period =arr;
        TIM_TimeBaseInitT.TIM_Prescaler =psc;
        TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitT);
       
        /*
         ÅäÖÃêäèë2¶»ñí¨μà
        */
        TIM_ICInitT.TIM_Channel =TIM_Channel_2;
        TIM_ICInitT.TIM_ICFilter =0X00;
        TIM_ICInitT.TIM_ICPolarity =TIM_ICPolarity_Rising;
        TIM_ICInitT.TIM_ICPrescaler =TIM_ICPSC_DIV1;
        TIM_ICInitT.TIM_ICSelection =TIM_ICSelection_DirectTI;
        TIM_ICInit(TIM5,&TIM_ICInitT);
       
        /*
         ÅäÖÃÖD¶ÏóÅÏè¼¶oí′ò¿aÖD¶Ï
         ê1Äü¶¨ê±Æ÷
        */
        NVIC_InitT.NVIC_IRQChannel =TIM5_IRQn;//éèÖÃÄĸöÖD¶Ï
        NVIC_InitT.NVIC_IRQChannelCmd =ENABLE;//í¨μàê1Äü′ò¿a
        NVIC_InitT.NVIC_IRQChannelPreemptionPriority =2;
        NVIC_InitT.NVIC_IRQChannelSubPriority =0;
        NVIC_Init(&NVIC_InitT);//5.ÖD¶ÏóÅÏè¼¶éèÖÃ
       
        TIM_ITConfig(TIM5,TIM_IT_Update | TIM_IT_CC2 ,ENABLE);//6.′ò¿a¸üDÂÖD¶Ïoí2¶»ñÖD¶Ï
       
        TIM_Cmd(TIM5,ENABLE);//7.′ò¿a¶¨ê±Æ÷

}


/*
  ÖD¶Ï·tÎñoˉêy
*/

//TIM_CH1_SR¼ùÏóËüÎaò»¸ö¼Ä′æÆ÷
//0-5 ¶¨ê±Æ÷μÄòç3ö′Îêy
//6 2¶»ñμ½¸ßμçÆ½±ê־λ
//7 2¶»ñíê3é±ê־λ
u8 TIM_CH2_SR=0;
u16 TIM_VAL;


u16 TIM5_IRQHandler()
{
        if((TIM_CH2_SR & 0x80)==0)
        {
          if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
         {
           if(TIM_CH2_SR & 0x40)
                 {
                   if((TIM_VAL & 0x3f)==0x3f)
                         {
                           TIM_CH2_SR |=0x80;
                                 TIM_VAL=0xffff;
                         }
                         else
                         {
                           TIM_CH2_SR++;
                         }
                 }
         }
    if(TIM_GetITStatus(TIM5,TIM_IT_CC2)!=RESET)
         {
           if(TIM_CH2_SR & 0x40)
                 {
                         TIM_CH2_SR|=0x80;
                         TIM_VAL=TIM_GetCapture2(TIM5);
                         TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Rising);
                 }
                 else
                 {
                         TIM_CH2_SR=0;
                   TIM_VAL=0;
                         TIM_CH2_SR|=0x40;
                         TIM_SetCounter(TIM5,0);
                   TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Falling);
                 }
         }
        }
        TIM_ClearITPendingBit(TIM5,TIM_IT_Update | TIM_IT_CC2);
}
这是主程序:
#include "csb.h"
#include "delay.h"
#include "lcd.h"
#include "usart.h"
extern u8 TIM_CH2_SR;
extern u16 TIM_VAL;

int main(void)
{
  u16 time;
        u8 i=0;
        float sum=0;
        float juli=0;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  delay_init();
        uart_init(9600);
       
        csb_init(65535,71);
       

        while(1)
        {
                for(i=0;i<5;i++)
                {
                        PBout(1)=1;
                        delay_us(20);
                        PBout(1)=0;
                        delay_ms(60);
                //        while(PAin(0)==0);
                        time=TIM_CH2_SR &0x3f;
                        time=time*65535+TIM_VAL;
                        juli=((float)time/58.0);
                        sum=sum+juli;
                }
                juli=sum/5.0;
    printf("距离:%f  cm\r\n",juli);
        }

}

本来是在定时器5上的通道1上,出现问题,后来改到定时器5上的通道2上,还是出现问题,希望会的大神指导一下。

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

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2018-3-11
在线时间
11 小时
 楼主| 发表于 2018-5-13 18:15:37 | 显示全部楼层
主函数中少了个TIM_CH2_SR=0;,但是测试之后还是有错,还有宏定义的,其实我没有用
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2018-3-11
在线时间
11 小时
 楼主| 发表于 2018-5-13 18:17:12 | 显示全部楼层
具体问题目前还不知道哪边出错,不过客服那边说要补发一个,可能是传感器坏了,也可能是程序的问题,如果是程序的问题,希望路过的大神能够给我指导一二
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-5-14 00:49:24 | 显示全部楼层
帮顶
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2018-3-11
在线时间
11 小时
 楼主| 发表于 2018-5-14 08:00:50 | 显示全部楼层

原子哥,能否在百忙之中抽出一丁点时间,帮忙看下呢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 00:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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