US-016是市场上唯有的一款模拟量输出的超声波测距模块,输出的模拟电压和距离值成正比,可以方便的和其他系统相连,US-016工作稳定可靠。
US-016超声波测距模块可实现2cm~3m的非接触测距功能,供电电压为5V,工作电流为3.8mA,支持模拟电压输出,工作稳定可靠。本模块根据不同应用场景可设置成不同的量程(大测量距离分别为1m和3m);当Range管脚悬空时,量程为3m。US-016能将测量距离转化为模拟电压输出,输出电压值与测量距离成正比。
一、模块来源
二、规格参数
工作电压:3.3V-5V
工作电流:3.8MA
感应角度:小于15度
探测距离:2CM-300CM
探测精度:0.3CM+1%
输出方式: 模拟电压
管脚数量:4 Pin
以上信息见厂家资料文件
三、移植过程
我们的目标是将例程移植至MSPM0G3507开发板上【能够判断前方障碍物距离的功能】。首先要获取资料,查看数据手册应如何实现读取数据,再移植至我们的工程。
1、查看资料
模块上电后,系统首先判断 Range 引脚的输入电平,根据输入电平状态来设置不同的量程。当 Range 引脚为高电平时,量程为 3m,当 Range 管脚为低电平时,量程为 1m。然后,系统开始连续测距,同时将测距结果通过模拟电压在 Out 管脚输出。当距离变化时,模拟电压也会随之进行变化。模拟电压与测量距离成正比,模拟电压的输出范围是0~Vcc。
- 当系统量程为 1m 时,测量距离为:L = 1024*Vout/Vcc(mm)。当输出电压为 0V 对应距离为 0m,输出 Vcc 对应为 1.024m。
- 当系统量程为 3m 时,测量距离为:L = 3096*Vout/Vcc(mm)。 当输出电压为 0V 对应距离为 0m,输出 Vcc 对应为 3.072m。
2、引脚选择
这里选择使用PA27的附加ADC功能。
3、移植至工程
接下来我们配置 SYSCONFIG
- 双击 empty.syscfg 文件,打开它。
- 在 empty.syscfg 文件界面点击 Tools,然后点击 SYSCONFIG 工具。
- 点击 ADD 添加配置
- 添加配置【根据下方图片进行添加】
- 点击保存
WARNING
出现只要出现下面的框就一定要选择:Yes to All
- 然后点击编译(可能会报错,我们不用管!)
- 然后我们所有设定的引脚和功能就会在 ti_msp_dl_config.h 中定义。因为这个文件我们包含进了 board.h 所以我们只需要引用 board.h 即可。【这里的 board.h 就充当了芯片头文件的作用】
移植步骤中的导入.c和.h文件与传感器章节的【DHT11温湿度传感器】相同,只是将.c和.h文件更改为bsp_US016.c与bsp_US016.h。这里不再过多讲述,移植完成后面修改相关代码。
在文件bsp_US016.c中,编写如下代码。
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:https://oshwhub.com/forum
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-07-02 LCKFB-LP first version
*/
#include "bsp_US016.h"
#include "stdio.h"
//超声波量程 Range接地量程为1 Range接VCC量程为3 浮空量程为3
//测试时,Range浮空,故量程为3
#define RANGE 0 //=0则量程为3米 =1则量程为1米
volatile bool gCheckADC; //ADC采集成功标志位
/******************************************************************
* 函 数 名 称:US016_Init
* 函 数 说 明:US016超声波模块初始化
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:
******************************************************************/
void US016_Init(void)
{
//开启ADC中断
NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);
}
/**********************************************************
* 函 数 名 称:ADC_GET
* 函 数 功 能:读取一次ADC数据
* 传 入 参 数:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:LP
**********************************************************/
uint32_t ADC_GET(void)
{
unsigned int gAdcResult = 0;
int timeout = 20;
//软件触发ADC开始转换
DL_ADC12_startConversion(ADC12_0_INST);
//如果当前状态为正在转换中则等待转换结束
while (false == gCheckADC)
{
delay_us(1);
timeout--;
if(timeout <= 0)
{
printf("DL_ADC12_startConversion ERROR!! LINE:%d\r\n",__LINE__);
return 1;
}
}
//获取数据
gAdcResult = DL_ADC12_getMemResult(ADC12_0_INST, ADC12_0_ADCMEM_ADC_CH0);
//清除标志位
gCheckADC = false;
return gAdcResult;
}
/******************************************************************
* 函 数 名 称:Get_ADC_Value
* 函 数 说 明:对ADC值进行平均值计算后输出
* 函 数 形 参:num采集次数
* 函 数 返 回:对应扫描的ADC值
* 作 者:LC
* 备 注:无
******************************************************************/
unsigned int Get_ADC_Value(unsigned int num)
{
unsigned int Data=0;
int i = 0;
for( i = 0; i < num; i++ )
{
/* 读取ADC常规组数据寄存器 */
Data += ADC_GET();
delay_ms(10);
}
Data = Data / num;
return Data;
}
/******************************************************************
* 函 数 名 称:Get_distance
* 函 数 说 明:读取测距距离
* 函 数 形 参:无
* 函 数 返 回:浮点型的测距的距离
* 作 者:LC
* 备 注:
量程为3米时距离公式为:L = (A*3072/4096)*(Vref/Vcc)
量程为1米时距离公式为:L = (A*1024/4096)*(Vref/Vcc)
Vref 为 ADC 的参考电压,Vcc 为 US-016 的电源电压
******************************************************************/
float Get_distance(void)
{
float distance = 0;
unsigned int d = Get_ADC_Value(50);
#if !RANGE
distance = d * 0.75;
#else
distance = d * 0.25;
#endif
return distance;
}
//ADC中断服务函数
void ADC12_0_INST_IRQHandler(void)
{
//查询并清除ADC中断
switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST))
{
//检查是否完成数据采集
case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
gCheckADC = true;//将标志位置1
break;
default:
break;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
在文件bsp_US016.h中,编写如下代码。
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:https://oshwhub.com/forum
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-07-02 LCKFB-LP first version
*/
#ifndef _BSP_US016_H_
#define _BSP_US016_H_
#include "board.h"
void US016_Init(void);
float Get_distance(void);
#endif
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
四、移植验证
在empty.c中输入代码如下:
#include "board.h"
#include <stdio.h>
#include "bsp_US016.h"
int main(void)
{
//开发板初始化
board_init();
US016_Init();
printf("Demo Start\r\n");
while(1)
{
uint32_t value = Get_distance() * 10;
printf("距离障碍物 = %d.%02dCM\r\n\n",value/100, value%100 );
delay_ms(500);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
上电效果:距离20CM处摆放障碍物,输出换算后的实际距离。
移植成功案例代码下载链接: