基于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 ==
基于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 ==
举报