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


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

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

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

Предпосылки

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

Примечание.

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

Подготовка SBC

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

  • SSH
  • SPI

Для многих устройств дополнительная конфигурация не требуется. Для Raspberry Pi используйте 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 Схема, показывающая распиновку заголовка Raspberry Pi GPIO. Изображение предоставлено любезно фондом Raspberry Pi.
Изображение любезно 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 package add Iot.Device.Bindings --version 4.1.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 как автономное приложение. Инструкции см. в разделе Deploy .NET приложения в Raspberry Pi. Обязательно предоставьте исполняемому файлу разрешение на выполнение с помощью chmod +x.

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

    ./AdcTutorial
    

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

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

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

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

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

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