硬件准备
超声波模块选用的US-100,0 与常见的 HC-SR04 外观相似,但多了一颗温度补偿芯片和串口功能。背面有一个跳线帽,它决定了工作模式:
跳线帽插上:UART 串口模式
跳线帽拔掉:GPIO 电平触发模式(HC-SR04 兼容)
UART 模式下,向传感器的 Trig/TX 引脚发送 0x55,它会从 Echo/RX 引脚返回两个字节,构成 16 位距离值,单位毫米。发送 0x50 则返回一个温度字节,实际温度 = 返回值 − 45℃。
关键参数:供电范围 2.4V–5.5V,测距范围 2cm–450cm,可以和 A153 的 3.3V 逻辑直接相连,不需要电平转换。

接线方案
本次实践选择 UART 模式。A153 的 LPUART 引脚分布在 mikroBUS 和 Arduino 接口上。为了方便,使用 mikroBUS 接口(J5/J6) 上的 LPUART2:
| VCC | 3.3V(J5 或 J6 的 3.3V 引脚) | 供电,3.3V 即可 |
| GND | GND | 共地 |
| Trig/TX | LPUART2_TX(P3_15) | A153 发送 → 传感器接收 |
| Echo/RX | LPUART2_RX(P3_14) | 传感器发送 → A153 接收 |
注意:传感器的 Trig/TX 是接收 A153 数据的引脚,所以应接 A153 的 TX。Echo/RX 是传感器发送数据的引脚,接 A153 的 RX。交叉连接。
A153 的 LPUART2 在 Port3 的 14/15 号引脚上,ALT2 功能即为 LPUART2。具体板载位置需要对照 FRDM-MCXA153 的 pinout 图确认。
软件实现
SDK 准备
在 MCUXpresso SDK 中,lpuart_polling 或 lpuart_interrupt 示例是最好的起点。本次使用轮询模式实现,逻辑最直观。
代码框架
c#include "fsl_lpuart.h"#include "fsl_port.h"#include "fsl_clock.h"#define US100_LPUART LPUART2#define US100_LPUART_CLK_FREQ CLOCK_GetLPUARTClkFreq(2U)#define US100_BAUDRATE 9600Ustatic void US100_Init(void){
lpuart_config_t config;
/* 使能时钟与引脚复用 */
CLOCK_EnableClock(kCLOCK_GatePORT3);
RESET_ReleasePeripheralReset(kLPUART2_RST_SHIFT_RSTn);
RESET_ReleasePeripheralReset(kPORT3_RST_SHIFT_RSTn);
/* P3_14 作为 LPUART2_RX, P3_15 作为 LPUART2_TX */
PORT_SetPinMux(PORT3, 14U, kPORT_MuxAlt2);
PORT_SetPinMux(PORT3, 15U, kPORT_MuxAlt2);
/* LPUART 配置:9600 8N1 */
LPUART_GetDefaultConfig(&config);
config.baudRate_Bps = US100_BAUDRATE;
config.enableTx = true;
config.enableRx = true;
LPUART_Init(US100_LPUART, &config, US100_LPUART_CLK_FREQ);}/* 返回距离,单位毫米;失败返回 0 */static uint16_t US100_ReadDistance(void){
uint8_t cmd = 0x55;
uint8_t rxBuf[2] = {0};
status_t status;
/* 发送测距命令 */
status = LPUART_WriteBlocking(US100_LPUART, &cmd, 1);
if (status != kStatus_Success) {
return 0;
}
/* 读取两个字节的高位和低位 */
status = LPUART_ReadBlocking(US100_LPUART, rxBuf, 2);
if (status != kStatus_Success) {
return 0;
}
/* 距离 = 高字节 × 256 + 低字节,单位 mm */
return ((uint16_t)rxBuf[0] << 8) | rxBuf[1];}主循环
cint main(void){
US100_Init();
while (1) {
uint16_t distance_mm = US100_ReadDistance();
if (distance_mm > 0) {
PRINTF("Distance: %u mm (%u cm)\r\n", distance_mm, distance_mm / 10);
} else {
PRINTF("Read failed\r\n");
}
SDK_DelayAtLeastUs(100000, SystemCoreClock); /* 等待 100ms */
}}实测数据
上电后,在 20cm–150cm 范围内用手或纸板遮挡传感器,串口输出稳定。每次读取耗时约 100–200ms,符合 US-100 的响应特性。近距离(<5cm)偶尔返回无效值,这与超声波传感器的物理特性有关,属于正常现象。
小结
A153 驱动 US-100 的核心工作量集中在LPUART 的引脚复用和波特率配置上。一旦串口通了,US-100 的协议本身极其简单:发一个字节,读两个字节。相比 GPIO 模式需要精确测量回波脉宽,UART 模式把时序负担交给了传感器内部的 MCU,A153 端只需要标准的串口读写。
我要赚赏金
