Поделиться через


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

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

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

Предпосылки

  • Компьютер на основе ARM (ARMv7 или более поздней версии) с одной платой (SBC)
  • MCP3008 аналоговый преобразователь в цифровой
  • Трехконтактный потенциометр
  • Макет
  • Перемычки
  • Плата расширения для Raspberry Pi GPIO (необязательно/рекомендуется)
  • Пакет SDK для .NET 8 или более поздней версии

Примечание.

В этом руководстве предполагается, что целевое устройство — Raspberry Pi. Однако это руководство можно использовать для любого SBC на основе Linux, который поддерживает .NET, например 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,3 В (красный)
  • AGND к земле (черный)
  • CLK в SCLK (оранжевый)
  • Подключение DOUT к MISO (оранжевый)
  • DIN к MOSI (оранжевый)
  • CS/SHDN до CE0 (зелёный)
  • DGND на заземление (черный)
  • CH0 к среднему выводу потенциометра (желтый)

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

При необходимости ознакомьтесь со следующими схемами закреплений:

MCP3008 Raspberry Pi GPIO
Схема, показывающая распиновку 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 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. Считывает значение CH0 в ADC путем вызова mcp.Read(0).
      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
    

    Наблюдайте за выходными данными при повороте ручки потенциометра. Это связано с потенциометром, изменяющим напряжение, подаваемое на вход CH0 ADC. ADC сравнивает входное напряжение на CH0 с эталонным напряжением, предоставленным VREF , чтобы создать значение.

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

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

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

Источник этого руководства доступен на сайте GitHub.

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