这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【2026Let'sdo第2期】简易超声波测距仪实践成果帖--超声波测距仪

共1条 1/1 1 跳转至页

【2026Let'sdo第2期】简易超声波测距仪实践成果帖--超声波测距仪

工程师
2026-10-08 16:38:29     打赏

主要连接框架

image.png

基于 FRDM-MCXA153 的超声波测距与 LCD 显示系统

  • 平台:NXP FRDM-MCXA153(MCXA153,Cortex-M33 cm33_core0,96 MHz,裸机)

    传感器:HC-SR04 超声波测距模块(5V)

  • 显示:Newhaven NHD-0116AZ-FL-YBW(16×1 字符 LCD,HD44780/ST7066 兼容,4-bit 并口)

  • 日期:2026/10/08



1. 概述

实现"测距 →  开发板→ 显示 "的完整闭环:

  • 引脚与接线(摘要)


  • LCD RS / ENP3_1 / P3_30J6-2 / J6-1
    LCD D4–D7P1_0 / P1_1 / P1_2 / P1_3J6-6 / J6-4 / J6-5 / J6-3
    LCD RW / VDD / VSSGND / 5V / GNDV0 经对比度网络(不可直接接 GND)
    HC-SR04 TRIGP3_7触发输出
    HC-SR04 ECHOP1_8(CT_INP8)经 10kΩ/20kΩ 分压到 ~3.3V

  • image.png1. 编译:工程基于 CMake + MCUXpresso SDK。引脚与 CTIMER 由 Config Tools(`hello_world.mex`)生成,编译入口 `CMakeLists.txt`,产物为 `.bin`。

  • 2. 烧录:通过板载 MCU-Link,USB 连接 J15,下载固件。

  • 3. 运行:上电后 `BOARD_InitHardware()` 完成引脚/时钟/外设初始化,`HCSR04_Init()` 启动定时器,`LCD_Init()` 初始化屏并显示 `HC-SR04 ready`,随后进入测距主循环。

  • 实现步骤与关键代码

  • 软件分层:芯片层(mex 生成的 `pin_mux.c`/`peripherals.c`)负责"脚是什么功能",驱动层(`hcsr04.c`/`lcd_st7066u.c`)负责"按协议说话"。

  • ① 超声状态机(`Idle→WaitRise→WaitFall→Done`),CTIMER 回调里只记时间、置标志:

  • void SR04_CtimerCallback(uint32_t flags)  

  •     {  

  •         if (((flags & (uint32_t)kCTIMER_Capture0Flag) != 0U) &&  

  •             ((s_state == kHcsr04_WaitRise) || (s_state == kHcsr04_WaitFall)))  

  •         {  

  •             uint32_t cap = CTIMER_GetCaptureValue(SR04_CTIMER, SR04_CAPTURE);  

  •             if (s_state == kHcsr04_WaitRise) {  

  •                 s_riseTicks = cap;  

  •                 s_state     = kHcsr04_WaitFall;  

  •             } else {  

  •                 s_echoUs = cap - s_riseTicks;     

  •                 s_valid  = (s_echoUs >= 116U) && (s_echoUs <= 20000U);  

  •                 s_state  = kHcsr04_Done;  

  •             }  

  •         }  

  •         if (((flags & (uint32_t)kCTIMER_Match0Flag) != 0U) &&  

  •             ((s_state == csr04_WaitRise) || (s_state == csr04_WaitFall))) {  

  •             s_echoUs = 0U; s_valid = false; s_state = csr04_Done;  

  •         }  

  •     } 

发射信号→ 等待返回→ 换算距离 → 中值滤波 → 刷屏

while (1) {  
        HCSR04_Start();  
        while (!HCSR04_IsDone()) { }  
        mm    = HCSR04_GetDistanceMm();   /* 无效返回 -1 */  
        shown = DistanceFilter(mm);       /* 3 点中值,飞点剔除 */  
        LCD_ShowDistance(shown);  
        PRINTF("dist=%d.%d cm  (raw %d.%d)  echo=%u us\r\n", ...);  
        SDK_DelayAtLeastUs(100000U, CLOCK_GetCoreSysClkFreq());  
    }

;

image.png



共1条 1/1 1 跳转至页

回复

匿名不能发帖!请先 [ 登陆 注册 ]