Считывание значений с аналогово-цифрового преобразователя
Аналогово-цифровой преобразователь (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.
Подготовка оборудования
Используйте компоненты оборудования для создания цепи, как показано на следующей схеме:
Для взаимодействия 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 |
---|---|
Изображение взято с Raspberry Pi Foundation. |
Совет
Для упрощения подключения к заголовку GPIO рекомендуется использовать коммутационную плату GPIO в сочетании с монтажной платой для макетирования или тестирования.
Создайте приложение
Выполните следующие действия в предпочитаемой среде разработки.
Создайте консольное приложение .NET с помощью .NET CLI или Visual Studio. Назовите его AdcTutorial.
dotnet new console -o AdcTutorial cd AdcTutorial
Добавьте пакет Iot.Device.Bindings в проект. Используйте либо .NET CLI из каталога проекта, либо Visual Studio.
dotnet add package Iot.Device.Bindings --version 2.2.0-*
Замените содержимое 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
выполняется бесконечно. Каждая итерация:- Очищает окно консоли.
- Считывает значение CH0 из устройства ADC путем вызова
mcp.Read(0)
. - Записывает необработанное значение в консоль.
- Выводит значение на консоль в виде процента.
- Для вычисления процента значение делится на 10,23. MCP3008 — это 10-битное устройство ADC, что означает, что оно возвращает 1024 возможных значений в диапазоне от 0 до 1023. Деление значения на 10,23 представляет значение в процентах.
- Процент округляется до ближайшего значения 0,1.
- Переходит в спящий режим на 500 мс.
- Для
Построение приложения. При использовании интерфейса командной строки .NET выполните команду
dotnet build
. Чтобы выполнить сборку в Visual Studio, нажмите клавиши CTRL+SHIFT+B.Разверните приложение в SBC как автономное приложение. Инструкции см. в статье Развертывание приложений .NET в Raspberry Pi. Обязательно предоставьте исполняемому файлу разрешение execute с помощью
chmod +x
.Запустите приложение на устройстве Raspberry Pi, перейдя в каталог развертывания и запустив исполняемый файл.
./AdcTutorial
Обратите внимание на изменение выходных данных, происходящее при вращении ручки потенциометра. Это происходит из-за того, что потенциометр меняет напряжение, подаваемое в CH0 на устройстве ADC. Для создания значения ADC сравнивает входное напряжение в CH0 с опорным напряжением, подаваемым на VREF.
Завершите работу программы, нажав клавиши CTRL+C.
Поздравляем! Вы считали значения с аналогово-цифрового преобразователя с помощью SPI.
Получение исходного кода
Исходный код для этого учебника доступен на сайте GitHub.