完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
基于STM32的超声波测距(外部中断+定时器)
首先说明一下我使用的硬件: stm32f103c8t6最小系统、0.96寸OLED、超声波模块HC-SR04。 再就是程序设计的一个思路: 超声波模块的使用说明已经指出,给TRIG引脚一个不少于10微秒的高电平,模块自动发送8个40KHz的方波,接收到返回信号后引脚ECHO会输出高电平,其距离为ECHO引脚高电平时间*声速/2,每次测量间隔建议60ms以上。由此,我们可提取到需要使用到的三个芯片功能:1、定时器,2、外部中断,3、IO输出。 下面是配置代码,进行一一介绍(不想看我哔哔的最下方有完整得超声波配置.c和.h +_+ ): 1、外部中断和IO输出都是使用的GPIO所以使用一个配置函数 1.1 GPIO宏定义参数: 1.2 GPIO端口配置函数Ultrasound_GPIO_Conf(): 这里要注意,中断的触发方式为上下边沿,用处在中断服务函数里面体现。 2、定时器配置(定时器在这里比较忙,它要进行返回信号高电平的计时,和测距间隔时间计时,所以要配置中断) 2.1 定时器宏定义参数: 2.2 定时器配置函数Ultrasound_TIM_Conf(): 这里值得注意的是,在配置中断的时候必须要清除中断标志位,不然程序会死在NVIC_Init函数里面 3、超声波模块初始化函数(将上面写的两个函数调用一下下就好了) 4、超声波启动函数 5、距离获取函数 这里比较花里胡哨,因为进行了一下数据筛选。ULTRASOUND_DIS_INDEX是一个宏定义,它是我设定的获取多少次数据,进行一次数据筛选。 5、外部中断服务函数(敲黑板,比较绕请细品) 这里总体说一说此程序比较理想的执行情况: (1)超声波被调用初始化函数,定时器被设定为可中断,并且定时器开始计数; (2)计数到溢出,触发定时器中断,它会调用超声波启动函数Ultrasound_start(); (3)超声波启动后,有回波信号,将触发外部中断(上边沿),进入外部中断直接关掉定时器中断和定时器,判断确实有回波信号,进入到(检测到返回信号)代码段,清空定时器的CNT寄存器,重设重载值ARR寄存器,开启定时器。此时,定时器进行ECHO引脚得高电平持续时间检测; (4)再一次中断来临(下降沿),还是直接关掉定时器中断触发和定时器,这次进入(返回信号结束)代码段,首先判断定时器是不是计数的高电平时间。若是,就判断我的获取次数是否已满,满了就置位flag, 没有满,就将定时器CNT寄存器里面的值提出来参与距离公式运算得到当前所测距离。执行到最后继续开启定时器中断和定时器,并重新设定重载值。此时定时器进行间隔时间计数。所以,定时器计数到溢出中断后,又会去调用一次超声波启动函数Ultrasound_start(); (5)外部中断函数则在此等待下一次工作来临; 6、主函数 7、下面是超声波配置完整的.c和.h == ultrasound.c == == ultrasound.c == |
|
|
|
只有小组成员才能发言,加入小组>>
4324个成员聚集在这个小组
加入小组3281 浏览 0 评论
航顺(HK)联合德赢Vwin官网 推出“近距离体验高性能Cortex-M3,免费申请价值288元评估板
4228 浏览 1 评论
4231 浏览 0 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 11:46 , Processed in 0.509875 second(s), Total 45, Slave 39 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号