文号
t70104
阅读
16272
回复
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:云南
749028
1楼
拜见大师
引用
评论
11年10个月前IP:湖南
749068
2楼
玩过51单片机超声波测距,STM32有可能还玩不转. 给个小建议:用两个超声波模块,两个超声波发射方向90度放置,把一个当X的坐标,一个当Y坐标, 这样当手指放到两个模块发射方向上,可以得到XY坐标.实现手式输入
引用
评论
11年10个月前IP:内蒙古
749071
3楼
大赞~我的FPGA 控制LED显示屏放bad apple也快搞定了
引用
评论
张静茹作者
11年10个月前IP:香港
749073
4楼
引用 yanli12321:
大赞~我的FPGA 控制LED显示屏放bad apple也快搞定了
刷屏有多少帧?
引用
评论
11年10个月前IP:内蒙古
749084
5楼
引用 张静茹:
刷屏有多少帧?
目前打算24帧每秒。。。。。。。之前用12864LCD放屏幕花的要死,正好手上有个超大号的双色LED12864显示屏。。。。。。。今天一下午基本把硬件驱动搞定了
引用
评论
张静茹作者
11年10个月前IP:浙江
749088
6楼
要是能刷液晶就好了
引用
评论
11年10个月前IP:内蒙古
749218
7楼
引用 张静茹:
要是能刷液晶就好了
彩屏扔学校了5555555555555555这段时间没彩屏都要抓狂了
引用
评论
11年10个月前IP:四川
749236
8楼
这个小数点位数这么多……是要精确到普朗克长度吗……
引用
评论
11年10个月前IP:广西
749281
9楼
测距精度如何?
引用
评论
张静茹作者
11年10个月前IP:北京
749293
10楼
引用 天易:
测距精度如何?
厘米级,不过也有非常准的时候 摆在钢卷尺的一米上显示0.9999400 瞬间醉了
引用
评论
11年10个月前IP:广东
749309
11楼
引用 张静茹:
厘米级,不过也有非常准的时候 摆在钢卷尺的一米上显示0.9999400 瞬间醉了
测试对象是人肉怎么样,没有骨头的部分
引用
评论
11年10个月前IP:湖南
749321
12楼
这个我以前也用arduino玩过。。。用来做个吓人箱挺好玩的。。。
引用
评论
张静茹作者
11年10个月前IP:北京
749324
13楼
引用 20!不曾存在:
测试对象是人肉怎么样,没有骨头的部分
也挺准的,白色泡沫也没问题
引用
评论
11年10个月前IP:浙江
749447
14楼
厉害
引用
评论
11年10个月前IP:广西
749537
15楼
引用 张静茹:
厘米级,不过也有非常准的时候 摆在钢卷尺的一米上显示0.9999400 瞬间醉了
有效量程呢?
引用
评论
张静茹作者
11年10个月前IP:北京
749547
16楼
引用 天易:
有效量程呢?
4米
引用
评论
11年9个月前IP:台湾
758376
17楼
這東西是用在哪裡的??
引用
评论
11年8个月前IP:广东
760226
18楼
引用 华蓥:
玩过51单片机超声波测距,STM32有可能还玩不转. 给个小建议:用两个超声波模块,两个超声波发射方向90度放置,把一个当X的坐标,一个当Y坐标, 这样当手指放到两个模块发射方向上,可以得到XY坐标.实现手式输入
想法非常好,但可能存在互相影响吧,精确度和准确度够呛。不过想法确实很好!
引用
评论
11年8个月前IP:广东
760228
19楼
引用 华蓥:
玩过51单片机超声波测距,STM32有可能还玩不转. 给个小建议:用两个超声波模块,两个超声波发射方向90度放置,把一个当X的坐标,一个当Y坐标, 这样当手指放到两个模块发射方向上,可以得到XY坐标.实现手式输入
以前看过超声波做的雷达帖子,不知道到底可行不?
引用
评论
11年8个月前IP:广东
760229
20楼
看完回帖,发现很多还没用过超声传感器,偷笑一下[s:;P]
引用
评论
11年8个月前IP:陕西
760316
21楼
做毕设的时候买了两个,打算安装在四轴飞行器上,做定高时使用,但是还没实施。
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的