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

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

100cm.jpg



100cm2.jpg

270cm.jpg

470cm.jpg


关键程序


<code class="lang-cpp">/*定时器初始化*/
     
/*定义一个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);
/*定时器初始化*/</code>
<code class="lang-cpp">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);
}</code>
<code class="lang-cpp">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); 中断源
     
}</code>

[修改于 9年10个月前 - 2015/02/17 17:22:53]

来自:综合交流区 / 极客DIY
22
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
张静茹 作者
9年10个月前 IP:香港
749073
引用 yanli12321:
大赞~我的FPGA 控制LED显示屏放bad apple也快搞定了
刷屏有多少帧?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
张静茹作者
9年10个月前 IP:浙江
749088
要是能刷液晶就好了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
张静茹作者
9年10个月前 IP:北京
749293
引用 天易:
测距精度如何?
厘米级,不过也有非常准的时候 摆在钢卷尺的一米上显示0.9999400 瞬间醉了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
张静茹作者
9年10个月前 IP:北京
749324
引用 20!不曾存在:
测试对象是人肉怎么样,没有骨头的部分
也挺准的,白色泡沫也没问题
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
张静茹作者
9年10个月前 IP:北京
749547
引用 天易:
有效量程呢?
4米
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
张静茹
进士 学者 机友 笔友
文章
139
回复
1869
学术分
1
2010/12/30注册,1个月24天前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}