Перейти к содержанию
Материалы раздела

ADC

Модуль измеряет аналоговое напряжение с помощью встроенного или внешнего аналого-цифрового преобразователя (АЦП).

АЦП преобразует напряжение между VRef- и VRef+ в число. Например, 12-битный АЦП с диапазоном 0–3,3 В вернёт 0 для 0 В, 4095 для 3,3 В и примерно 2048 для 1,65 В.

Сначала подключите канал, затем считайте его значение:

local channel = adc.attach(adc.ADC1, pio.GPIO32)
local raw, millivolts = channel:read()
print(raw, millivolts)

Внутренний АЦП

Lua RTOS предоставляет доступ к adc.ADC1 со следующими параметрами:

  • разрешение 9, 10, 11 или 12 бит;
  • восемь каналов: от adc.ADC_CH0 до adc.ADC_CH7;
  • отрицательное опорное напряжение 0 В и номинальное внутреннее опорное напряжение около 1,1 В;
  • программируемое ослабление входного сигнала, которое драйвер выбирает по аргументу max_value функции adc.attach().

Канал можно указать константой adc.ADC_CHx, его номером от 0 до 7 или соответствующим GPIO:

КаналGPIO
036
137
238
339
432
533
634
735

Фактическое внутреннее опорное напряжение отличается у разных микросхем. Функция adc.calibrate() выводит опорное напряжение на GPIO 25, 26 или 27, измеряет его внешним АЦП и возвращает результат в милливольтах:

local vref = adc.calibrate(
    adc.ADC1,
    pio.GPIO26,
    adc.ADS1115,
    adc.ADC_CH0
)
print(vref)

К выбранному GPIO нужно подключить канал внешнего АЦП. Функция доступна только при наличии поддерживаемого внешнего АЦП в прошивке.

Диапазон выше примерно 1,1 В достигается за счёт ослабления. Оно расширяет диапазон, но снижает точность. Для более точного измерения повышенного напряжения используйте внешний АЦП или резистивный делитель и не превышайте допустимое напряжение GPIO.

Внешний АЦП

Внешние АЦП используют тот же API. Конкретная модель должна поддерживаться прошивкой устройства.

adc.ADS1015

ADS1015 — 12-битный АЦП с четырьмя каналами, подключаемый по I2C. В однополярном режиме доступны каналы от 0 до 3. Аргумент max_value выбирает ближайший подходящий диапазон PGA от ±256 до ±6144 мВ; по умолчанию выбирается ±4096 мВ.

Диапазон PGA задаёт масштаб преобразования, а не допустимое напряжение на выводе. Напряжение каждого аналогового входа должно оставаться между GND и VDD; не подавайте 6,144 В на вход АЦП, питаемый от 3,3 В.

Техническое описание ADS1015

adc.ADS1115

ADS1115 — 16-битный АЦП с четырьмя каналами, подключаемый по I2C. В однополярном режиме API использует 15 бит результата. Аргумент max_value выбирает ближайший подходящий диапазон PGA от ±256 до ±6144 мВ; по умолчанию выбирается ±4096 мВ.

Как и у ADS1015, диапазон PGA не отменяет ограничения входных выводов: напряжение каждого входа должно оставаться между GND и VDD.

Техническое описание ADS1115

adc.MCP3008

MCP3008 — 10-битный АЦП с восемью каналами, подключаемый по SPI. В аргументе vref функции adc.attach() укажите фактическое напряжение на выводе VREF: программно оно не устанавливается. Если аргумент равен 0 или nil, для пересчёта используется напряжение питания, заданное прошивкой. Аргумент max_value для этой модели не поддерживается.

Техническое описание MCP3008

adc.MCP3208

MCP3208 — 12-битный АЦП с восемью каналами, подключаемый по SPI. В аргументе vref функции adc.attach() укажите фактическое напряжение на выводе VREF: программно оно не устанавливается. Если аргумент равен 0 или nil, для пересчёта используется напряжение питания, заданное прошивкой. Аргумент max_value для этой модели не поддерживается.

Техническое описание MCP3208

vref = adc.calibrate(internal_id, gpio, external_id, channel)

Измерить внутреннее опорное напряжение adc.ADC1 внешним АЦП.

Аргументы:

  • internal_id: adc.ADC1;
  • gpio: GPIO 25, 26 или 27, на который выводится внутреннее опорное напряжение;
  • external_id: идентификатор поддерживаемого внешнего АЦП;
  • channel: канал внешнего АЦП, подключённый к выбранному GPIO.

Возвращает измеренное опорное напряжение в милливольтах или вызывает исключение.

channel = adc.attach(id, channel [, resolution [, vref [, max_value]]])

Настроить канал АЦП.

Аргументы:

  • id: adc.ADC1 или идентификатор внешнего АЦП;
  • channel: канал АЦП. Для внутреннего АЦП можно передать adc.ADC_CHx, номер канала или соответствующий GPIO;
  • resolution (необязательно): разрешение в битах. Значение 0 или nil выбирает разрешение по умолчанию; внешний АЦП поддерживает только собственное фиксированное разрешение;
  • vref (необязательно): положительное опорное напряжение в милливольтах для MCP3008 или MCP3208. Для внутреннего АЦП, ADS1015 и ADS1115 аргумент должен быть равен 0 или nil;
  • max_value (необязательно): максимальное ожидаемое входное напряжение в милливольтах. Для adc.ADC1 оно выбирает ослабление, а для ADS1015 и ADS1115 — диапазон PGA. Значение по умолчанию — 3900 мВ для adc.ADC1 и 4096 мВ для ADS1015 и ADS1115. MCP3008 и MCP3208 этот аргумент не поддерживают.

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

local channel = adc.attach(adc.ADS1115, adc.ADC_CH0, nil, nil, 1100)

raw, millivolts = channel:read()

Выполнить одно измерение.

Возвращает сырое значение АЦП и рассчитанное напряжение в милливольтах либо вызывает исключение.

local channel = adc.attach(adc.ADC1, pio.GPIO32)
local raw, millivolts = channel:read()
print(raw, millivolts)