從類比到數位轉換器讀取值

類比數位轉換器 (ADC) 是可讀取類比輸入電壓值的裝置,並將其轉換成數位值。 ADC 可用來讀取來自熱阻器、電位計和其他裝置的值,這些裝置會根據特定條件變更電阻。

在本主題中,您將使用 .NET 來讀取 ADC 的值,因為您使用壓計來調整輸入電壓。

必要條件

  • ARM 型 (ARMv7 或更新版本) 單板電腦 (SBC)
  • MCP3008 類比轉數位轉換器
  • 三接腳電位計
  • 試驗電路板
  • 跳線
  • Raspberry Pi GPIO 分線板 (可選擇/建議使用)
  • .NET SDK 7 或更新版本

注意

本教學課程是以 Raspberry Pi 為目標裝置所撰寫。 不過,本教學課程可用於支援 .NET 的任何 Linux 型 SBC,例如 Orange Pi、ODROID 等等。

準備 SBC

請確定您的 SBC 已設定為支援下列服務:

  • SSH
  • SPI

對於許多裝置,不需要額外的設定。 針對 Raspberry Pi,請使用 raspi-config 命令。 如需 raspi-config 的詳細資訊,請參閱 Raspberry Pi 文件

準備硬體

使用硬體元件來建置線路,如下圖所示:

Fritzing 圖表顯示具有 MCP3008 ADC 和電位計的線路

MCP3008 使用串列週邊介面 (SPI) 進行通訊。 以下是從 MCP3008 到 Raspberry Pi 和電位計的連接方式:

  • VDD 到 3.3V (以紅色顯示)
  • VREF 到 3.3V (紅色)
  • DGND 到地面 (黑色)
  • CLK 到 SCLK (橘色)
  • DOUT 到 MISO (橘色)
  • DIN 到 MOSI (橘色)
  • CS/SHDN 到 CE0 (綠色)
  • DGND 到地面 (黑色)
  • CH0 到電位計上的可變 (中間) 接腳 (黃色)

將 3.3V 和地面接到電位計的外部接腳。 順序不重要。

請視需要參閱下列插腳輸出圖:

MCP3008 Raspberry Pi GPIO
顯示 MCP3008 插腳輸出的圖表 顯示 Raspberry Pi GPIO 接頭插腳的圖表。圖片由 Raspberry Pi 基金會提供。
圖片由 Raspberry Pi 基金會提供

提示

建議將 GPIO 分線板與試驗電路板搭配使用,以簡化 GPIO 接頭的連接過程。

建立應用程式

在慣用的開發環境中完成下列步驟:

  1. 使用 .NET CLIVisual Studio建立新的 .NET 主控台應用程式。 將其命名為 AdcTutorial

    dotnet new console -o AdcTutorial
    cd AdcTutorial
    
  2. Iot.Device.Bindings 套件新增至專案。 從專案目錄或Visual Studio使用.NET CLI

    dotnet add package Iot.Device.Bindings --version 2.2.0-*
    
  3. 以下列程式碼取代 Program.cs 的內容:

    using System;
    using System.Device.Spi;
    using System.Threading;
    using Iot.Device.Adc;
    
    var hardwareSpiSettings = new SpiConnectionSettings(0, 0);
    
    using SpiDevice spi = SpiDevice.Create(hardwareSpiSettings);
    using var mcp = new Mcp3008(spi);
    while (true)
    {
        Console.Clear();
        double value = mcp.Read(0);
        Console.WriteLine($"{value}");
        Console.WriteLine($"{Math.Round(value/10.23, 1)}%");
        Thread.Sleep(500);
    }
    

    在上述程式碼中:

    • hardwareSpiSettings 會設定為 SpiConnectionSettings 的新執行個體。 建構函式會將 busId 參數設定為 0,並將 chipSelectLine 參數也設定為 0。
    • using 宣告會藉由呼叫 SpiDevice.Create 並傳入 hardwareSpiSettings 來建立 SpiDevice 的執行個體。 此 SpiDevice 代表 SPI 匯流排。 using 宣告可確保物件已遭處置,且正確釋放了硬體資源。
    • 另一個 using 宣告會建立 Mcp3008 的執行個體,並將 SpiDevice 傳遞至建構函式。
    • while 迴圈會無限期執行。 每個反覆項目:
      1. 清除主控台。
      2. 呼叫 mcp.Read(0) 來讀取 ADC 上的 CH0 值。
      3. 將原始值寫入主控台。
      4. 將值以百分比的格式寫入主控台。
        • 若要計算百分比,此值除以 10.23。 MCP3008 是 10 位元 ADC,這表示它會傳回 1024 個範圍介於 0 至 1023 的可能值。 將值除以 10.23 代表以百分比表示值。
        • 百分比會四捨五入至最接近的 0.1。
      5. 睡眠 500 毫秒。
  4. 建置應用程式。 如果使用 .NET CLI,請執行 dotnet build 。 若要在 Visual Studio 中建置,請按 Ctrl+Shift+B

  5. 將應用程式部署至 SBC 做為獨立應用程式。 如需指示,請參閱 將 .NET 應用程式部署至 Raspberry Pi。 請務必使用 chmod +x 提供可執行檔「執行」權限。

  6. 切換至部署目錄並執行可執行檔,以在 Raspberry Pi 上執行應用程式。

    ./AdcTutorial
    

    請在旋轉電位計旋鈕時觀察輸出。 這是由於電位計改變了提供給 ADC 上 CH0 的電壓。 ADC 會將 CH0 上的輸入電壓與提供給 VREF 的參考電壓進行比較,以產生值。

  7. Ctrl+C 以終止程式。

恭喜! 您使用了 SPI 從類比數位轉換器中讀取值。

取得原始程式碼

本教學課程中的來源位於 GitHub

下一步