首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

STM32 .NET MF 開發板實作:超聲波測距模組完整指南

     編輯:關於C語言

專案背景:賦予智能小車「視覺」

智能小車已實現多種遙控方式,但要邁向真正的「智能」,必須具備環境感知能力。超聲波測距模組是邁出的第一步,後續將擴展循跡、視覺等感測器,構建完整感知系統。

硬體介面選擇:觸發/脈衝 vs 串口

市面超聲波模組主流兩種介面:

  • 觸發/脈衝輸出(GPIO):即時性要求高,精度取決於程式實作,成本較低。
  • 串口通訊(RS232/TTL):程式開發簡單(單純串口讀取),但售價較高。

本文專注於 GPIO 觸發模式,掌握核心時序控制。

模組工作原理與測距公式

  1. IO 觸發:給予至少 10µs 高電位 訊號。
  2. 模組自動發射 8 個 40kHz 方波,並啟動回波偵測。
  3. 若有回波,Echo 腳位輸出高電位,**高電位持續時間 = 超聲波往返時間**。

測距公式:

距離 (cm) = (高電位時間 (µs) × 聲速 340 m/s) / 2
          = 高電位時間 × 0.017

關鍵在於精確量測高電位脈寬。實測精度可達 3mm 等級。

硬體接線對照表

序號超聲波模組腳位.NET MF 開發板腳位
1EchoPA0
2TrigPC4
3GNDGND
4VCC3.3V

軟體架構:非受控代碼封裝托管介面

高精度脈寬量測需硬體計時器支援,C# 托管代碼無法直接實現。採用分層架構:

  • 底層(C/C++):配置 Timer 硬體捕獲模式,中斷記錄上升/下降沿時間戳,計算脈寬。
  • 中介層:封裝為原生函式庫。
  • 上層(C# 托管):透過 P/Invoke 呼叫原生介面。

托管端介面定義

using System;

namespace YFSoft.Hardware
{
    public sealed class Ultrasonic
    {
        // timer: 使用的硬體計時器編號
        // pin: Echo 腳位對應的 GPIO 編號
        public Ultrasonic(byte timer, int pin);

        // 回傳距離,單位:毫米
        public uint GetValue();
    }
}

測試程式範例

public static void Main()
{
    // 使用 Timer 2,Echo 接 PA0 (對應 GPIO 編號視開發板定義)
    Ultrasonic sonar = new Ultrasonic(2, 0); 
    
    while (true)
    {
        uint distanceMm = sonar.GetValue();
        Debug.Print("Distance: " + distanceMm + " mm");
        Thread.Sleep(200); // 適當延遲避免觸發過快
    }
}

關鍵實作細節提示

  • Timer 設定:輸入捕獲模式,雙邊緣觸發,預分頻使計數頻率適合 µs 級量測(如 1MHz → 1 計數 = 1µs)。
  • 中斷處理:上升沿記錄計數器值;下降沿計算差值得脈寬,轉換為距離並存入共用緩衝區。
  • 觸發邏輯:GPIO 輸出模式,拉高 10µs 以上(可用 `Thread.Sleep` 或忙等待),再拉低。
  • 異常處理:超時無回波、脈寬異常(過大/過小)需回傳錯誤碼或特定值。
  • 電源與共地:模組 VCC 接 3.3V,務必與開發板共地,否則訊號不穩。

總結

透過硬體計時器捕獲 Echo 脈寬,封裝為簡潔的托管類別,即可在 .NET MF 平台輕鬆實現高精度超聲波測距。此架構分離了即時性關鍵路徑與應用邏輯,既保證精度又維持開發效率,是嵌入式感測器開發的典型範式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved