ATK-MB019 模块使用说明
这里以正点原子M48Z-M3最小系统板STM32F103版为例,给大家介绍一下模块和板卡的连接方法。其它板卡与模块的硬件连接方法,请大家在“ATK-MB019 超声波测距模块\3,程序源码\相应板卡例程文件夹\readme.txt”路径下查看。
ATK-MB019超声波测距模块可通过杜邦线与正点原子M48Z-M3最小系统板STM32F103版进行连接,具体的连接关系,如下表所示:

表1.1超声波测距模块与M48Z-M3最小系统板STM32F103版连接关系
在本实验中,串口会打印超声波测距模块所测量的距离值。需要查看这部分实验信息的用户,可用杜邦线将最小系统板STM32F103的PA9引脚和GND连接至外部的USB转串口设备,这样就可以通过XCOM上位机查看串口打印的信息了。
开发板的LED0闪烁,提示程序运行。
打开本实验的工程文件夹,能够在./Drivers/BSP目录下看到ATK_ULTRASONIC文件夹和TIM文件夹,其中ATK_ULTRASONIC文件夹中包含了ATK-MB019超声波测距模块的驱动文件,TIM文件夹中包含了通用定时器的驱动文件,如下图所示:

图2.1.2.1 ATK-MB019超声波测距模块驱动代码

图2.1.2.2 通用定时器驱动代码
下面简要介绍atk_ultrasonic.c中几个重要的API函数。
1. 函数atk_ultrasonic_init()
该函数用于初始化ATK-MB019超声波测距模块,具体的代码如下所示:
/**
* @brief 初始化超声波测距模块
* @param 无
* @retval 无
*/
void atk_ultrasonic_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
/* 使能GPIO端口时钟 */
TRIG_GPIO_CLK_ENABLE();
/* 配置TRIG控制引脚 */
gpio_init_struct.Pin = TRIG_GPIO_PIN; /* TRIG引脚 */
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 不上下拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(TRIG_GPIO_PORT, &gpio_init_struct); /* 初始化TRIG引脚 */
/* 配置PA3去捕获ECHO的输出的高电平持续时间 */
gtim_timx_cap_chy_init(0xFFFF - 1, 72 - 1); /* 以1Mhz的频率计数 捕获 */
}
atk_ultrasonic_init()函数非常简单,这里进行了TRIG引脚初始化,便于控制该引脚的电平,以发出测试信号。除此之外,还配置了定时器的计数频率以及计数值,以1MHz的频率计数,后续将会用定时器2的通道4(PA3引脚)来捕获ECHO引脚的输出的高电平持续时间。
2. 测距相关的系列函数
该系列函数用于启动测距和计算距离值,具体代码如下所示:
/**
* @brief 开启测距
* @param 无
* @retval 无
*/
void atk_ultrasonic_start(void)
{
TRIG(1);
delay_us(50);
TRIG(0);
}
/**
* @brief 测距函数
* @param high_timer : ECHO 高电平持续时间
* @retval 测距距离 单位cm
*/
float atk_ultrasonic_distance(uint32_t high_timer)
{
atk_ultrasonic_start();
/* 距离 = ECHO高电平时间时间 * 340/2。(其中声速:340M/S) */
return ((float)(high_timer * 170) / 10000.0f);
}
上述的两个函数分别用于启动测距功能和获取测量的距离值。在atk_ultrasonic_start()函数中,先拉高TRIG相关引脚,然后延时50us,接着拉低引脚,即可开启测量。在atk_ultrasonic_distance()函数中,先调用开启测量函数,然后计算距离值并返回。
在图2.1.2.2中,gtim.c和gtim.h为通用定时器驱动文件,包含了定时器的初始化,输入捕获的配置等内容。关于通用定时器的驱动介绍,请查看正点原子各个开发板对应的开发指南中通用定时器章节。
实验的测试代码在demo.c文件中,该文件在工程根目录下的 User文件夹。测试代码的入口函数为demo_run(),具体的代码,如下所示:
/**
* @brief 例程演示入口函数
* @param 无
* @retval 无
*/
void demo_run(void)
{
uint32_t temp = 0;
uint8_t t = 0;
atk_ultrasonic_init(); /* 初始化超声波测距模块 */
while (1)
{
atk_ultrasonic_start();
if (g_timxchy_cap_sta & 0X80) /* 成功捕获到了一次高电平 */
{
temp = g_timxchy_cap_sta & 0X3F;
temp *= 0xFFFF; /* 溢出时间总和 */
temp += g_timxchy_cap_val; /* 得到总的高电平时间 */
g_timxchy_cap_sta = 0; /* 开启下一次捕获 */
if(atk_ultrasonic_distance(temp) > 560)
{
printf("超过测距范围\r\n");
}
else
{
/* 测距结果 */
printf("测距距离:%.2f cm\r\n", atk_ultrasonic_distance(temp));
}
}
t++;
if (t > 2) /* 200ms进入一次 */
{
t = 0;
LED0_TOGGLE(); /* LED0闪烁 ,提示程序运行 */
}
delay_ms(100);
}
}
从上面代码可以看出,整个测试代码的逻辑相对简单。初始化超声波测距模块后,在while循环中调用相关函数开始测距值,如果距离超过了测距的范围,则打印“超出测距范围”;如果测距正常,则打印测出的距离值。LED0闪烁表示程序正常运行。
将ATK-MB019超声波测距模块按照第一节“硬件连接”中介绍的连接方式与开发板连接,并将实验代码编译烧录至开发板中。本实验使用串口输出调试信息,因此需将开发板的PA9连接至DAP虚拟串口(或USB转TTL模块)的RX引脚。完成连接后,可通过串口调试助手XCOM查看实验信息输出,如下图所示:

图2.1.3.1串口调试助手显示内容
注:其它现象请看2.1.1功能说明。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040860/viewspace-3080362/ ,如需转载,请注明出处,否则将追究法律责任。