从模拟到数字转换器读取值

模拟到数字转换器(ADC)是一种设备,可以读取模拟输入电压值并将其转换为数字值。 ADC 用于从热敏器、强量计和其他设备读取值,这些设备会根据某些条件更改阻力。

在本主题中,您将使用 .NET 从 ADC 读取值,同时使用电位计调节输入电压。

先决条件

  • 基于 ARM 的单板计算机(ARMv7 或更高版本)(SBC)
  • MCP3008 模拟数字转换器
  • 三引脚强量计
  • 试验板
  • 跳线
  • Raspberry Pi GPIO 分线板(可选/推荐)
  • .NET SDK 8 或更高版本

注释

本教程编写为假设目标设备为 Raspberry Pi。 但是,本教程可用于支持 .NET 的任何基于 Linux 的 SBC,例如 Orange Pi、ODROID 等。

准备 SBC

确保 SBC 配置为支持以下服务:

  • SSH
  • SPI

对于许多设备,无需其他配置。 对于 Raspberry Pi,请使用 raspi-config 命令。 有关详细信息 raspi-config,请参阅 Raspberry Pi 文档

准备硬件

使用硬件组件生成线路,如下图所示:

显示具有MCP3008 ADC 和强量计的线路的 Fritzing 示意图

MCP3008使用串行外围接口(SPI)进行通信。 以下是从 MCP3008 到 Raspberry Pi 和强量计的连接:

  • VDD 到 3.3V(以红色显示)
  • VREF 连接到 3.3V(红色)
  • AGND 连接到地面(黑色)
  • CLK 连接到 SCLK(橙色)
  • DOUT 连接到 MISO(橙色)
  • DIN 连接到 MOSI(橙色)
  • CS/SHDN 连接到 CE0(绿色)
  • DGND 连接到地面(黑色)
  • CH0 连接到电位差计上的可变(中间)引脚(黄色)

为电位差计上的外部引脚提供 3.3V 的电源并接地。 顺序并不重要。

根据需要,请参阅以下引脚分配关系图:

MCP3008 Raspberry Pi GPIO
显示 MCP3008 的引脚分配关系图 这是一张示意图,显示了 Raspberry Pi GPIO 接口的引脚分布。图片由 Raspberry Pi Foundation 提供。
图片由 Raspberry Pi Foundation 提供

小提示

建议将 GPIO 扩展板与面包板结合使用,以简化与 GPIO 接头的连接。

创建应用

在首选开发环境中完成以下步骤:

  1. 使用 .NET CLIVisual Studio 创建新的 .NET 控制台应用。 将其命名为 AdcTutorial

    dotnet new console -o AdcTutorial
    cd AdcTutorial
    
  2. Iot.Device.Bindings 包添加到项目。 可以从项目目录使用.NET CLI,或者使用Visual Studio

    dotnet add package Iot.Device.Bindings --version 3.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 和传入 SpiDevice.Create 来创建 hardwareSpiSettings 的实例。 这 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。 请确保使用 指定可执行的 execute 权限chmod +x

  6. 切换到部署目录并运行可执行文件,在 Raspberry Pi 上运行应用。

    ./AdcTutorial
    

    旋转电位差计刻度时观察输出。 这是因为强量计会改变在 ADC 上提供给 CH0 的电压。 ADC 将 CH0 上的输入电压与提供给 VREF 的参考电压进行比较,以生成值。

  7. Ctrl+C 终止程序。

祝贺! 你已使用 SPI 从模拟到数字转换器读取值。

获取源代码

本教程的源 在 GitHub 上提供

后续步骤