Считывание значений с аналогово-цифрового преобразователя

Аналогово-цифровой преобразователь (ADC) — это устройство, которое может считывать аналоговое значение входного напряжения и преобразовывать его в цифровое значение. ADC используются для считывания значений с терморезисторов, потенциометров и других устройств, которые изменяют сопротивление в зависимости от определенных условий.

В этом разделе вы будете использовать .NET для считывания значений с аналогово-цифрового преобразователя при модуляции входного напряжения с помощью потенциометра.

Предварительные требования

  • Однопанерный компьютер (SBC) на основе ARM (ARMv7 или более поздней версии)
  • Аналогово-цифровой преобразователь MCP3008
  • 3-контактный потенциометр
  • монтажная плата;
  • оптоволоконные кабеля с разъемами на обоих концах;
  • Коммутационная плата GPIO Raspberry Pi (необязательно/рекомендуется)
  • Пакет SDK для .NET 7 или более поздней версии

Примечание

В этом руководстве предполагается, что целевым устройством является Raspberry Pi. Однако это руководство можно использовать для любого SBC под управлением Linux, поддерживающего .NET, например Orange Pi, ODROID и т. д.

Подготовка SBC

Убедитесь, что SBC настроен для поддержки следующих служб:

  • SSH
  • SPI

Для многих устройств дополнительная настройка не требуется. Для Raspberry Pi используйте raspi-config команду . Дополнительные сведения о raspi-config см. в документации по Raspberry Pi.

Подготовка оборудования

Используйте компоненты оборудования для создания цепи, как показано на следующей схеме:

Схема Fritzing, демонстрирующая цепь с устройством ADC MCP3008 и потенциометром

Для взаимодействия MCP3008 использует последовательный интерфейс для периферийных устройств (SPI). Ниже перечислены подключения от MCP3008 к устройству Raspberry Pi и потенциометру.

  • VDD к 3,3V (показано красным цветом)
  • VREF к 3,3V (показано красным цветом)
  • AGND к заземлению (показано черным цветом)
  • CLK к SCLK (показано оранжевым цветом)
  • DOUT к MISO (показано оранжевым цветом)
  • DIN к MOSI (показано оранжевым цветом)
  • CS/SHDN к CE0 (показано зеленым цветом)
  • DGND к заземлению (показано черным цветом)
  • CH0 к переменному (среднему) контакту на потенциометре (показано желтым цветом)

Подайте напряжение 3,3 и заземление на внешние контакты на потенциометре. Последовательность не имеет значения.

При необходимости смотрите следующую схему контактов:

MCP3008 GPIO Raspberry Pi
Схема контактов MCP3008 Диаграмма, показывающая схему контактов верхнего контактного ряда GPIO Raspberry Pi. Изображение взято с Raspberry Pi Foundation.
Изображение взято с Raspberry Pi Foundation.

Совет

Для упрощения подключения к заголовку GPIO рекомендуется использовать коммутационную плату GPIO в сочетании с монтажной платой для макетирования или тестирования.

Создайте приложение

Выполните следующие действия в предпочитаемой среде разработки.

  1. Создайте консольное приложение .NET с помощью .NET CLI или Visual Studio. Назовите его AdcTutorial.

    dotnet new console -o AdcTutorial
    cd AdcTutorial
    
  2. Добавьте пакет Iot.Device.Bindings в проект. Используйте либо .NET CLI из каталога проекта, либо Visual Studio.

    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 путем вызова SpiDevice.Create и передачи hardwareSpiSettings. SpiDevice представляет шину SPI. Объявление using гарантирует, что объект удален и аппаратные ресурсы освобождены должным образом.
    • Другое объявление using создает экземпляр Mcp3008 и передает SpiDevice конструктору.
    • Цикл while выполняется бесконечно. Каждая итерация:
      1. Очищает окно консоли.
      2. Считывает значение CH0 из устройства ADC путем вызова mcp.Read(0).
      3. Записывает необработанное значение в консоль.
      4. Выводит значение на консоль в виде процента.
        • Для вычисления процента значение делится на 10,23. MCP3008 — это 10-битное устройство ADC, что означает, что оно возвращает 1024 возможных значений в диапазоне от 0 до 1023. Деление значения на 10,23 представляет значение в процентах.
        • Процент округляется до ближайшего значения 0,1.
      5. Переходит в спящий режим на 500 мс.
  4. Построение приложения. При использовании интерфейса командной строки .NET выполните команду dotnet build. Чтобы выполнить сборку в Visual Studio, нажмите клавиши CTRL+SHIFT+B.

  5. Разверните приложение в SBC как автономное приложение. Инструкции см. в статье Развертывание приложений .NET в Raspberry Pi. Обязательно предоставьте исполняемому файлу разрешение execute с помощью chmod +x.

  6. Запустите приложение на устройстве Raspberry Pi, перейдя в каталог развертывания и запустив исполняемый файл.

    ./AdcTutorial
    

    Обратите внимание на изменение выходных данных, происходящее при вращении ручки потенциометра. Это происходит из-за того, что потенциометр меняет напряжение, подаваемое в CH0 на устройстве ADC. Для создания значения ADC сравнивает входное напряжение в CH0 с опорным напряжением, подаваемым на VREF.

  7. Завершите работу программы, нажав клавиши CTRL+C.

Поздравляем! Вы считали значения с аналогово-цифрового преобразователя с помощью SPI.

Получение исходного кода

Исходный код для этого учебника доступен на сайте GitHub.

Дальнейшие действия