OpenEdv-开源电子网

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

分享一个输入捕获做的超声波测距

[复制链接]

18

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-6-21
在线时间
34 小时
发表于 2016-3-1 18:31:30 | 显示全部楼层 |阅读模式
还是比较准的

超声波测距(输入捕获).zip

2.63 MB, 下载次数: 14645

努力吧,骚年
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

342

主题

1462

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
8023
金钱
8023
注册时间
2015-10-15
在线时间
2901 小时
发表于 2016-3-1 18:48:30 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2016-1-18
在线时间
26 小时
发表于 2016-3-3 16:00:59 | 显示全部楼层
谢谢分享。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-4-22
在线时间
3 小时
发表于 2016-4-22 23:33:45 | 显示全部楼层
先看看哈。。。。。。。。。。
回复 支持 反对

使用道具 举报

3

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-4-21
在线时间
26 小时
发表于 2016-5-7 13:02:55 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2016-5-9
在线时间
7 小时
发表于 2016-5-9 23:18:54 | 显示全部楼层
谢谢分型
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

高级会员

Rank: 4

积分
509
金钱
509
注册时间
2016-2-24
在线时间
123 小时
发表于 2016-5-10 11:24:15 | 显示全部楼层
感谢
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-9-5
在线时间
1 小时
发表于 2016-9-6 14:05:38 | 显示全部楼层

你这为什么只有一个引脚啊,
Echo这个引脚不要连         
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-5-21
在线时间
3 小时
发表于 2017-5-25 20:54:59 | 显示全部楼层
哪位大佬给分享一下超声波测距的代码
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2017-5-8
在线时间
14 小时
发表于 2017-5-29 01:17:54 | 显示全部楼层
本帖最后由 Jim0706 于 2017-5-29 01:19 编辑
stthb 发表于 2017-5-25 20:54
哪位大佬给分享一下超声波测距的代码

[mw_shl_code=c,true]int main(void)
{
        u8 key;
        u32 distance,temp;
        NVIC_SetPriorityGrouping(7-2);//分组写在主函数里,只写一次
        led_init();
        key_init();
        uart1_init(115200);
  HC_SR04_Init();
        
        while(1)
        {
                Trig = 0;
                delay_ms(20);
                Trig = 1;
                delay_us(20);
                Trig = 0;
               
                if(TIM2CH3_CAPTURE_STA & 0x80)
                {
                        temp = TIM2CH3_CAPTURE_STA & 0x3f;
                        temp *= 0XFFFFFFFF;                                          //溢出时间总和
                        temp += TIM2CH3_CAPTURE_VAL;
                        TIM2CH3_CAPTURE_STA = 0;
                }
                distance = (temp*340/200)/100;
                printf("distance %d cm\r\n",distance);
                delay_ms(500);
        }
}[/mw_shl_code]
[mw_shl_code=c,true]#ifndef _HC_SR04_H
#define _HC_SR04_H

//PA1 Trig  PA2 Echo
#include "stm32f4xx.h"
#include "io_bit.h"
#define Echo PAin(2)
#define Trig PAout(1)


extern u8  TIM2CH3_CAPTURE_STA;        //输入捕获状态                                                   
extern u32        TIM2CH3_CAPTURE_VAL;        //输入捕获值
void HC_SR04_Init(void);
void TIM2_Init(void);
        



#endif
[/mw_shl_code]
[mw_shl_code=c,true]#include "stm32f4xx.h"
#include "HC_SR04.h"

void HC_SR04_Init(void)
{
        //PA1 Trig  PA2 Echo 复用功能
        RCC->AHB1ENR        |=            0X01<<0;
        GPIOA->MODER         &=          ~(0x03<<2|0x03<<4);
        GPIOA->MODER         |=                  (0x01<<2|0x02<<4);
        GPIOA->OTYPER         &=         ~(0x03<<1);
        GPIOA->OSPEEDR  &=         ~(0x03<<2);
        GPIOA->OSPEEDR  |=          (0x02<<2);
        GPIOA->PUPDR    &=         ~(0x03<<2);
        GPIOA->AFR[0]   &= 0xfffff0ff;
        GPIOA->AFR[0]   |= 0x000001ff;
        TIM2_Init();
}
//用定时器2来捕获
void TIM2_Init(void)
{
        //PA2 通道3
        RCC->APB1ENR |= 0X01<<0;//开启定时器2
        TIM2->ARR = 9999;
        TIM2->PSC = 83;
        
        TIM2->CCMR2 |= 0X01;//CC3配置为输入,IC3映射到TI3上
        TIM2->CCMR2 |= 0X00<<2;//无预分频
        TIM2->CCMR2 |= 0X03<<4;//配置输入滤波器 8个定时器时钟周期滤波
        
        TIM2->CCER  |= 0X01<<8;  //CC1E=1         允许捕获计数器的值到捕获寄存器中
        TIM2->CCER  |= 0X00<<9;  //CC1P=0        上升沿捕获
        TIM2->DIER  |= 0X01<<3;  //允许CC3IE捕获中断                                
        TIM2->DIER  |= 0X01<<0;         //允许更新中断        
        
        TIM2->CR1   |= 0X01<<0;  //使能
        
        NVIC_SetPriority(TIM2_IRQn,NVIC_EncodePriority(7-2,1,2));
        NVIC_EnableIRQ(TIM2_IRQn);
}

//定时器2输入捕获中断
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数(对于32位定时器来说,1us计数器加1,溢出时间:4294秒)
u8  TIM2CH3_CAPTURE_STA;        //输入捕获状态                                                   
u32        TIM2CH3_CAPTURE_VAL;        //输入捕获值
void TIM2_IRQHandler(void)
{
        if((TIM2CH3_CAPTURE_STA&0x80) == 0)//还未成功捕获        
        {
                if((TIM2->SR & 0x01))
                {
                        if((TIM2CH3_CAPTURE_STA&0x40))//已经捕获到高电平
                        {
                                if((TIM2CH3_CAPTURE_STA&0x3f) == 0x3f)//是否溢出
                                {
                                        TIM2CH3_CAPTURE_STA = 0x80;//标记成功捕获了一次
                                        TIM2CH3_CAPTURE_VAL = 0xFFFF;
                                }
                                else
                                        TIM2CH3_CAPTURE_STA++;
                        }               
                }
                if(TIM2->SR & (0X01<<3))//捕获3发生捕获事件
                {
                        if((TIM2CH3_CAPTURE_STA&0x40))//捕获到升沿
                        {
                                TIM2CH3_CAPTURE_STA |= 0x80;//标记成功捕获了一次
                                TIM2CH3_CAPTURE_VAL = TIM2->CCR3 ;//& 0X00FF;
                                TIM2->CCER &= ~(0X03<<9);//改为上升沿捕获
                        }
                        
                        else//第一次捕获上升沿
                        {
                                TIM2CH3_CAPTURE_VAL = 0;
                                TIM2CH3_CAPTURE_STA = 0;
                                TIM2->CNT = 0;
                                TIM2CH3_CAPTURE_STA |= 0x40;//标记捕获到了上升沿
                                TIM2->CCER |= 0X01<<9;//改为下降沿捕获
                        }
                }
        }
        TIM2->SR &= ~(0X01|0X01<<3);//清除中断标志位
}



[/mw_shl_code]这是我根据这个贴来弄的F4mini板,可以运行的代码。你参考下
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-5-21
在线时间
3 小时
发表于 2017-5-31 09:20:28 | 显示全部楼层
Jim0706 发表于 2017-5-29 01:17
[mw_shl_code=c,true]int main(void)
{
        u8 key;

大佬,主函数的头文件有哪些
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-5-21
在线时间
3 小时
发表于 2017-5-31 09:41:12 | 显示全部楼层
Jim0706 发表于 2017-5-29 01:17
[mw_shl_code=c,true]int main(void)
{
        u8 key;

#include "io_bit.h" 这个头文件没有被发现
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2017-5-8
在线时间
14 小时
发表于 2017-5-31 16:00:51 | 显示全部楼层
stthb 发表于 2017-5-31 09:20
大佬,主函数的头文件有哪些

[mw_shl_code=c,true]#ifndef _HC_SR04_H
#define _HC_SR04_H

//PA1 Trig  PA2 Echo
#include "stm32f4xx.h"
#include "io_bit.h"
#define Echo PAin(2)
#define Trig PAout(1)


extern u8  TIM2CH3_CAPTURE_STA;        //输入捕获状态                                                   
extern u32        TIM2CH3_CAPTURE_VAL;        //输入捕获值
void HC_SR04_Init(void);
void TIM2_Init(void);
         



#endif[/mw_shl_code]
这段就是HC_SR04的头文件。
主函数不怎么需要什么头文件,如果你需要串口打印,自己增加。



io_bit.zip

726 Bytes, 下载次数: 256

回复 支持 反对

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-4-16
在线时间
19 小时
发表于 2017-7-9 09:52:20 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-10-9
在线时间
1 小时
发表于 2020-11-29 22:29:06 | 显示全部楼层
超声波头文件的Trig,需要改成PA0才可以正常使用噢,楼主大意了
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-10-9
在线时间
1 小时
发表于 2020-11-29 22:30:12 | 显示全部楼层
超声波头文件的Trig,需要改成PA0才可以正常使用
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-10-9
在线时间
1 小时
发表于 2020-11-29 22:31:25 | 显示全部楼层
超声波头文件的Trig,需要改成PA0才可以正常使用。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-30 03:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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