ADC
Этот модуль содержит функции для доступа к модулю аналого-цифрового преобразователя (АЦП).
АЦП - это система, которая преобразует аналоговый сигнал в числовое представление.
Внутренне АЦП калибруется для работы в диапазоне напряжений, определяемых VRef- и VRef+, и преобразует аналоговый входной сигнал с заданной разрешающей способностью в двоичное число, которое пропорционально [VRef-, VRef+]. Например, если у АЦП разрешение 12 бит и VRef- = 0, а VRef+ = 3.3 В, то при аналоговом сигнале 0 В преобразование равно 0, при аналоговом сигнале 3.3 В преобразование равно 4095, а при входном сигнале 1,65 В преобразование равно 2048.
Для работы с модулем необходимо сделать следующее:
-
Подключите устройство АЦП к каналу АЦП, используя функцию adc.attach. Функция attach возвращает экземпляр канала АЦП, к которому подключено устройство. Этот экземпляр необходимо сохранить в переменной для дальнейшей работы с ним.
device = adc.attach(.....)
-
Прочитайте данные АЦП
device:read()
Внутренний АЦП
В ESP32 достпен только один АЦП:
adc.ADC1:
- Это внутренний модуль АЦП.
- АЦП может работать с разрешением 9, 10, 11 и 12 бит.
- Опорное напряжение VRef- составляет 0.0 В, а VRef+ установлено на уровне 1.1 В. Эти опорные напряжения программист установить не может.
- Программист может установить максимальное значение входного сигнала АЦП для данного канала. Это используется внутренне для установки коэффициента ослабления.
- Предоставляется 8 каналов АЦП, с 0 по 7.
При использовании внутреннего АЦП программист может ссылаться на канал по его номеру или по GPIO:
Канал | GPIO |
---|---|
0 | 36 |
1 | 37 |
2 | 38 |
3 | 39 |
4 | 32 |
5 | 32 |
6 | 34 |
7 | 35 |
АЦП должен быть откалиброван, поскольку внутреннее опорное напряжение составляет около 1100 милливольт, но может варьироваться. Для этого используйте функцию adc.calibrate и внешний АЦП. Эта функция предоставляет значение внутреннего опорного напряжения в милливольтах.
-- Get the internal voltage reference for ADC1 using GPIO26, and measure it with an ADS1115 connecting
-- channel 0 to GPIO26
/ > adc.calibrate(adc.ADC1, pio.GPIO26, adc.ADS1115, 0)
i2c0 at pins scl=GPIO21/sdc=GPIO25 at speed 400000 hz
adc ADS1115 channel 0 at i2c0, PGA +/- 2048 mvolts, address 0, 15 bits of resolution
1108
В ESP32 показания выше 1.1 В достигаются с использованием коэффициента ослабления, который уменьшает входное напряжение, но тесты, проведенные командой Whitecat, показывают, что использование ослабления может привести к неточным показаниям. Мы рекомендуем использовать делитель напряжения или внешнее аппаратное обеспечение АЦП, если вам нужно измерить напряжения выше 1.1 В.
Внешний АЦП
Lua RTOS позволяет программисту получить доступ к внешним устройствам АЦП, используя тот же API.
adc.ADS1015:
Этот блок отображается на внешний чип ADS1015 (интерфейс I2C).
Рабочее разрешение составляет 12 бит.
Внутреннее опорное напряжение, которое нельзя установить аппаратно или программно.
Значения входного сигнала АЦП могут варьироваться от 0 до 6144 милливольт.
Программист может установить максимальное значение входного сигнала АЦП для данного канала. Это используется внутренне для установки PGA.
Предоставляется 4 канала АЦП, с 0 по 3.
adc.ADS1115:
Этот блок отображается на внешний чип ADS1115 (интерфейс I2C).
Рабочее разрешение составляет 15 бит.
Внутреннее опорное напряжение, которое нельзя установить аппаратно или программно.
Значения входного сигнала АЦП могут варьироваться от 0 до 6144 милливольт.
Программист может установить максимальное значение входного сигнала АЦП для данного канала. Это используется внутренне для установки PGA.
Предоставляется 4 канала АЦП, с 0 по 3.
adc.MCP3008:
Этот блок отображается на внешний чип MCP3008 (интерфейс SPI), с максимальным разрешением 10 бит.
Рабочее разрешение составляет 10 бит.
Программист может указать значения VRef+ и VRef- при использовании этого блока (см. функцию adc.attach). Стандартные значения VRef+ и VRef- составляют 3.3 В и 0 В.
Максимальное значение входного сигнала АЦП, которое может установить программист, не предусмотрено. Предполагается, что максимальное значение равно Vref+.
Предоставляется 8 каналов АЦП, с 0 по 7.
adc.MCP3208:
Этот блок отображается на внешний чип MCP3208 (интерфейс SPI), с максимальным разрешением 12 бит.
Рабочее разрешение составляет 12 бит.
Программист может указать значения VRef+ и VRef- при использовании этого блока (см. функцию adc.attach). Стандартные значения VRef+ и VRef- составляют 3.3 В и 0 В.
Максимальное значение входного сигнала АЦП, которое может установить программист, не предусмотрено. Предполагается, что максимальное значение равно Vref+.
Предоставляется 8 каналов АЦП, с 0 по 7.
instance = adc.attach(id, channel, [resolution, vref, max value])
Подключение к каналу АЦП.
Аргументы:
-
id: идентификатор модуля АЦП. Для этого используйте одну из констант, определенных во Внутренний АЦП или Внешний АЦП.
-
channel: идентификатор канала АЦП. Используйте константу adc.ADC_CHx для этой цели.
-
resolution (опционально): разрешение для использования. Доступно не во всех поддерживаемых устройствах АЦП. Если разрешение не предоставлено, или его значение равно 0 или nil, применяется разрешение по умолчанию.
-
vref (опционально): положительное опорное напряжение в милливольтах. Доступно не во всех поддерживаемых устройствах АЦП (см. Поддерживаемые устройства АЦП). Если vref не предоставлено, или его значение равно 0 или nil, применяется опорное напряжение по умолчанию.
-
max value (опционально): максимальное входное напряжение, приложенное к каналу. Доступно не во всех поддерживаемых устройствах АЦП (см. Поддерживаемые устройства АЦП). Если максимальное значение не предоставлено, или его значение равно 0 или nil, применяется опорное напряжение по умолчанию.Это значение используется внутренне для настройки АЦП для получения наилучшего измерения. Например, если нам нужно измерить значение датчика, которое дает максимальное напряжение 1100 милливольт и мы используем внешний чип ADS1115, это будет установка настройки PGA на +/- 2048.
Возвращает: экземпляр канала АЦП или исключение. Этот экземпляр необходимо сохранить в переменной для дальнейшей работы с ним.
-- Setup device attached to ADC1 on GPIO32
channel = adc.attach(adc.ADC1, pio.GPIO32)
raw, millivolts = instance:read()
Чтение значения АЦП экземпляра канала.
Возвращает: необработанное значение, преобразованное в милливольты, или исключение.
- raw (сырое значение): необработанное значение.
- millivolts (милливольты): преобразованное в милливольты.
-- Setup device attached to ADC1 on GPIO32
channel = adc.attach(adc.ADC1, pio.GPIO32)
-- Read
raw, millivolts = channel:read()