Бөлісу құралы:


Использование ADC в высокоуровневых приложениях

В этом разделе описывается, как использовать аналого-цифровые преобразователи (АЦП) в высокоуровневом приложении. Сведения об использовании ADC в RTApp см. в статье Использование периферийных устройств в приложении с поддержкой реального времени .

Azure Sphere поддерживает преобразование аналогового в цифровое. ADC преобразует аналоговый вход в соответствующее цифровое значение. Количество входных каналов и разрешение (как количество выходных бит ADC) зависят от устройства.

В примере ADC_HighLevelApp показано, как получить доступ к ADC на устройстве MT3620.

Фрагменты периферийных устройств ADC демонстрируют два способа взаимодействия с ADC с помощью упрощенных или расширенных функций.

MT3620 содержит 12-разрядный ADC с 8 входными каналами. ADC сравнивает входное напряжение с эталонным напряжением и выдает значение в диапазоне от 0 до 4095 в качестве выходных данных. Входные каналы ADC и контакты GPIO от GPIO41 до GPIO48 сопоставляют с теми же контактами на MT3260. Однако если приложение использует ADC, все 8 контактов выделяются для использования в качестве входных данных ADC. Ни один из них не может использоваться для GPIO.

Требования к ADC

Приложения, взаимодействующие с ADC, должны включать файл заголовка adc.h и добавлять параметры ADC в манифест приложения.

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

Файлы заголовков

 #include <applibs/adc.h>
 #include "path-to-your-target-hardware.h"

Замените path-to-your-target-hardware.h путем к файлу заголовка для оборудования.

Параметры манифеста приложения

Параметр ADC в манифесте приложения перечисляет контроллеры ADC, к которым обращается приложение. Чтобы настроить эти параметры, добавьте возможность в Adc манифест приложения, а затем добавьте в возможность каждый контроллер ADC. Дополнительные сведения см. в разделе манифеста приложения Azure Sphere.

В коде используйте константы, определенные для оборудования, для идентификации контроллеров ADC. Компилятор преобразует эти значения в необработанные значения при сборке приложения.

Например, ниже приведен фрагмент манифеста приложения для приложения, предназначенного для эталонной платформы разработки (RDB) MT3620.

   "Adc": [ "$MT3620_RDB_ADC_CONTROLLER0" ]

В следующем фрагменте показано, как указать тот же контроллер ADC в приложении, которое предназначено для начального комплекта Avnet MT3620:

   "Adc": [ "$AVNET_MT3620_SK_ADC_CONTROLLER0" ]

Общие сведения о реализации

Чтобы реализовать приложение для доступа к ADC, используйте один из двух подходов:

В этом разделе описаны оба метода. Полный пример кода для каждого метода можно найти здесь:

Доступ к ADC с помощью упрощенных функций

Высокоуровневые приложения Azure Sphere могут получать доступ к ADC, вызывая API ADC Applibs.

Открытие контроллера ADC

Чтобы открыть контроллер ADC для доступа, вызовите ADC_Open и передайте идентификатор контроллера в качестве параметра. В случае успешного вызова будет возвращен дескриптор файла. В противном случае будет возвращено значение ошибки.

int ADC_Open(ADC_ControllerId id);

Чтение из ADC

Для чтения из ADC вызовите ADC_Poll. В ADC_Poll передайте следующие параметры: дескриптор файла, возвращенный ADC_Open, канал ADC и указатель на то, где будет храниться значение ADC.

Чтобы получить количество допустимых битов (разрешение), возвращаемое функцией ADC_Poll, вызовите ADC_GetSampleBitCount.

Установка опорного напряжения ADC

Вызовите ADC_SetReferenceVoltage , чтобы задать опорное напряжение ADC.

MT3620 имеет встроенный 2,5-вольтовый справочник. Кроме того, его можно подключить к внешней ссылке напряжения, которая меньше или равна 2,5 вольт.

Доступ к ADC с помощью расширенных функций

В качестве альтернативы высокоуровневым упрощенным функциям для взаимодействия с периферийным устройством можно воспользоваться преимуществами библиотеки ioctl, чтобы открыть функциональные возможности. В этом разделе объясняется, как это сделать и чем использование ioctls отличается от использования универсальных функций Linux.

Фрагмент фрагмента расширенных функций ADC показывает, как считывать ADC с помощью расширенных функций Azure Sphere.

В качестве примера можно увидеть параллельное сравнение чтения ADC с упрощенными, расширенными и linux sysfs реализациями:

Открытие канала ADC

Чтобы открыть контроллер ADC для доступа, используйте вызов Linux open , передав путь в каталог, который будет начинаться с /dev/adc<number> , где "number" — это идентификатор контроллера. В случае успешного вызова возвращается дескриптор файла. В противном случае возвращается значение ошибки.

См . пример реализации параметров, разрешений и проверки ошибок.

Получение спецификации канала

При использовании расширенных функций получите спецификацию канала с помощью вызовов ioctl перед опросом, установкой опорного напряжения или получением количества битов выборки. Этот шаг можно пропустить, жестко закодив некоторые из полученных значений, но это не рекомендуется. Обратите внимание, что этот шаг обрабатывается кодом, предоставленным в простых функциях.


// Used to get the size of the buffer to allocate for the channel specification

IIO_GET_CHANNEL_SPEC_BUFFER_TOTAL_SIZE_IOCTL
// Used to get the channel specification and set the ‘iio_ioctl_chan_spec_buffer’ struct properly

IIO_GET_CHANNEL_SPEC_BUFFER_IOCTL

Установка опорного напряжения

Чтобы задать опорное напряжение канала с помощью расширенного API, выполните следующие действия:

  1. Задайте сведения об ADC, заполненные в iio_ioctl_chan_spec_buffer структуре, полученной в спецификации Get Channel.

  2. Получите индекс свойства, заданного для канала.

  3. Запишите эталонное напряжение с помощью индекса свойства и сведений о спецификации канала.

Чтобы получить индекс свойства опорного напряжения, выполните следующие действия:

  1. Из структуры, полученной iio_ioctl_chan_spec_buffer в спецификации Get Channel, используйте значение из channel поля, а из channel поля — значение из ext_info поля. Поле ext_info является структурой iio_ioctl_chan_spec_ext_info , которая является головой связанного списка дескрипторов свойств для канала.

  2. Начиная с 0, просматривайте список, подсчитывая узлы, пока поле не name будет соответствовать строке reference_voltage .

    • Каждый узел в списке имеет поле next, указывающее на следующий узел в списке. Последний узел указывает на ЗНАЧЕНИЕ NULL.
    • Результирующий счетчик является индексом свойства .
  3. Чтобы задать опорное напряжение, используйте IIO_WRITE_CHANNEL_EXT_INFO_IOCTL ioctl, который принимает структуру типа iio_ioctl_write_chan_ext_info, которая содержит соответствующие данные (в данном случае напряжение), заданный канал и конкретное свойство (опорное напряжение), заданное для этого канала.

Получение примера числа битов

Чтобы задать опорное напряжение с помощью расширенных API, выполните следующие действия:

  1. Убедитесь, что вы получаете сведения о правильном канале ADC. Эти сведения заполняются в структуре, полученной iio_ioctl_chan_spec_buffer в разделе Get Channel Specification (Получение спецификации канала).

  2. Получите индекс свойства, которое требуется прочитать для канала, который в данном случае является примером числа битов.

  3. Используйте ioctls Linux, чтобы получить пример числа битов с помощью индекса свойств и спецификации канала.

Чтобы получить индекс свойств для числа битов выборки, используйте процесс, идентичный параметру Задать ссылочное напряжение. Однако при выполнении итерации по связанному списку, который называется ext_info типом iio_ioctl_chan_spec_ext_info, соответствует строке current_bits.

Вызовите ioctl IIO_READ_CHANNEL_EXT_INFO_IOCTL , чтобы заполнить структуру типа iio_ioctl_read_chan_ext_info необходимыми данными bufferв поле.

Чтение канала ADC

Чтобы прочитать канал ADC, выполните опрос с помощью вызова IIO_READ_RAW_CHANNEL_INFO_IOCTLioctl , передав структуру iio_ioctl_raw_channel_info , которая будет заполнена данными из канала ADC.

Пример реализации

Чтобы прочитать ADC с помощью расширенной реализации Azure Sphere, ознакомьтесь с фрагментом примера расширенного приложения ADC.

Чтобы сравнить различия в семантике взаимодействия с периферийным устройством при кодировании для Azure Sphere и кодировании для универсальной системы Linux, см. статью LinuxSysfsNodes.

Поддержка MT3620

Поддерживаемые функции ADC для MT3620 перечислены в разделе Состояние поддержки MT3620. Руководство пользователя на плате разработки MT3620 описывает макет и функции закрепления.

Папка HardwareDefinitions в каталоге установки пакета SDK microsoft Azure Sphere содержит определения для общих плат разработки, модулей и микросхем Azure Sphere. Он содержит файлы заголовков и JSON, определяющие интерфейсы master для MT3620, MT3620 RDB, а также другого оборудования MT3620. Папка HardwareDefinitions по умолчанию находится C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions в Windows и /opt/azurespheresdk/HardwareDefinitions Linux.