文号
t70104
阅读
16277
回复
22
收藏
12
超声波测距~~~~~~~
2015/02/17
IP:浙江
收拾东西发现一块12年买的超声波测距模块,闲的没事 发上来骗分...........
原理很简单,模块四个引脚,vcc5v电源,gnd,trig是测试端,单片机的pa8把trig置高10us以上,模块发出超声波,超声波碰到物体后被模块接收,echo脚的高电平时间就是超声波从发送到接收的时间
将stm32 的定时器2配置为捕获模式,上升沿触发,进入中断后将定时器的累计寄存器清零,再将触发模式改为下降沿触发,再次进入TIM2中断,获取定时器的累计的值,对应的就是模块的高电平时间了

attachment icon stm32超声波测距tim2捕获模式.rar 6.06MB RAR 59次下载
60cm.jpg

100cm.jpg



100cm2.jpg

270cm.jpg

470cm.jpg


关键程序


/*定时器初始化*/
     
/*定义一个TIM_TimeBaseInitTypeDef 类型的结构体,名字叫TIM_TimeBaseStructure*/
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
/*定义一个TIM_ICInitTypeDef 类型的结构体,名字叫TIM_ICInitStructure*/
TIM_ICInitTypeDef  TIM_ICInitStructure;
/* 定时器基本设置:*/
/*计数器每次计数的最高值*/
TIM_TimeBaseStructure.TIM_Period = 0xffff;
/* 时钟预分频数 72M/1+1 = 36M   所采集的频率的最小值应该为 36M/60000=600HZ*/
TIM_TimeBaseStructure.TIM_Prescaler = 720;
/* 采样分频 */
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
/* 向上计数模式 */
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
/*调用库函数,初始化TIM2*/
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/*输入捕获设置*/
/*设置频道1,即PA0*/
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
/*设置捕获模式为上升沿捕获*/
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
/*设置输入1与IC1相连*/
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
/*设置TIM捕获在捕获输入上每探测到一个边沿执行一次*/
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
/*设置输入比较滤波器*/
TIM_ICInitStructure.TIM_ICFilter = 0x00;
/*初始化输入捕获设置*/
TIM_ICInit(TIM2, &TIM_ICInitStructure);
     
TIM_Cmd(TIM2, ENABLE);
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
/*定时器初始化*/
void NVIC_Config(void)
{
    /*定义一个NVIC_InitTypeDef 类型的结构体,名字叫NVIC_InitStructure*/
    NVIC_InitTypeDef NVIC_InitStructure;
    /**********************************************
    NVIC_PriorityGroup_0:先占优先级0位从优先级4位
    NVIC_PriorityGroup_1:先占优先级1位从优先级3位
    NVIC_PriorityGroup_2:先占优先级2位从优先级2位
    NVIC_PriorityGroup_3:先占优先级3位从优先级1位
    NVIC_PriorityGroup_4:先占优先级4位从优先级0位
    ***********************************************/
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    /*配置选中的中断向量*/
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;; //TIM2捕获比较中断
     
    /*设置了成员NVIC_IRQChannel中的先占优先级*/
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
     
    /*设置了成员NVIC_IRQChannel中的响应优先级*/
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
     
    /*使能中断向量*/
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     
    /*调用库函数,初始化中断向量*/
    NVIC_Init(&NVIC_InitStructure);
     
     
}
void TIM2_GPIO_Config(void)
{
    /*定义一个GPIO_InitTypeDef 类型的结构体,名字叫GPIO_InitStructure*/
    GPIO_InitTypeDef GPIO_InitStructure;
    /*开启TIM2的时钟*/
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    /*开启GPIOA的时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
    /*选择PA0引脚*/
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 ;
    /*引脚模式设置为下拉输入*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    /*设置引脚速度*/
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    /*初始化所设置的PA管脚*/
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}
unsigned int Tim_RIsing_count = 0; //上升沿计数
unsigned int Tim_Falling_count = 0;//下降沿计数
     
static char Time_State = RIsing;
     
void TIM2_IRQHandler(void)       //中断函数
{
    /*检测中断标志位*/
    if (TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET)       /*重置中断标志位*/
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
     
    if (Time_State == RIsing)
    {
        Time_State = Falling;
        TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Falling);
        TIM2->CNT = 0x04;
        Tim_RIsing_count = TIM_GetCapture1(TIM2);
    }
    else
    {
        Time_State = RIsing;
        TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Rising);
        Tim_Falling_count = TIM_GetCapture1(TIM2);
    }
    //TIM_UpdateRequestConfig(TIM2, TIM_UpdateSource_Global); 中断源
     
}
[ 修改于11年10个月前 - 2015/02/17 17:22:53 ]
22
张静茹作者
11年10个月前IP:香港
749073
4楼
引用 yanli12321:
大赞~我的FPGA 控制LED显示屏放bad apple也快搞定了
刷屏有多少帧?
引用
评论
张静茹作者
11年10个月前IP:浙江
749088
6楼
要是能刷液晶就好了
引用
评论
张静茹作者
11年10个月前IP:北京
749293
10楼
引用 天易:
测距精度如何?
厘米级,不过也有非常准的时候 摆在钢卷尺的一米上显示0.9999400 瞬间醉了
引用
评论
张静茹作者
11年10个月前IP:北京
749324
13楼
引用 20!不曾存在:
测试对象是人肉怎么样,没有骨头的部分
也挺准的,白色泡沫也没问题
引用
评论
张静茹作者
11年10个月前IP:北京
749547
16楼
引用 天易:
有效量程呢?
4米
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的