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 |
|---|---|
| 0 | 36 |
| 1 | 37 |
| 2 | 38 |
| 3 | 39 |
| 4 | 32 |
| 5 | 33 |
| 6 | 34 |
| 7 | 35 |
Фактическое внутреннее опорное напряжение отличается у разных микросхем.
Функция 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 В.
adc.ADS1115
ADS1115 — 16-битный АЦП с четырьмя каналами, подключаемый по I2C. В
однополярном режиме API использует 15 бит результата. Аргумент max_value
выбирает ближайший подходящий диапазон PGA от ±256 до ±6144 мВ; по умолчанию
выбирается ±4096 мВ.
Как и у ADS1015, диапазон PGA не отменяет ограничения входных выводов: напряжение каждого входа должно оставаться между GND и VDD.
adc.MCP3008
MCP3008 — 10-битный АЦП с восемью каналами, подключаемый по SPI. В аргументе
vref функции adc.attach() укажите фактическое напряжение на выводе VREF:
программно оно не устанавливается. Если аргумент равен 0 или nil, для
пересчёта используется напряжение питания, заданное прошивкой. Аргумент
max_value для этой модели не поддерживается.
adc.MCP3208
MCP3208 — 12-битный АЦП с восемью каналами, подключаемый по SPI. В аргументе
vref функции adc.attach() укажите фактическое напряжение на выводе VREF:
программно оно не устанавливается. Если аргумент равен 0 или nil, для
пересчёта используется напряжение питания, заданное прошивкой. Аргумент
max_value для этой модели не поддерживается.
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)