Оглавление:

Знаете ли вы о настройке АЦП ESP32 ?: 29 шагов
Знаете ли вы о настройке АЦП ESP32 ?: 29 шагов

Видео: Знаете ли вы о настройке АЦП ESP32 ?: 29 шагов

Видео: Знаете ли вы о настройке АЦП ESP32 ?: 29 шагов
Видео: Программирование МК ESP32. Урок 19. Wi-Fi. Режим STA (Станция) 2024, Июль
Anonim
Image
Image
Используемые ресурсы
Используемые ресурсы

Сегодня я собираюсь поговорить о более технической проблеме, но я думаю, что каждый, кто работает с ESP32, должен знать: проблема регулировки чтения АЦП (аналого-цифровой преобразователь). Я считаю это важным, потому что при выполнении «измерения», особенно с помощью прибора с аналоговым выходом, вы должны быть абсолютно уверены в том, что показания выполняются правильно.

Поэтому в сегодняшнем видео мы проведем измерения с использованием «аналого-цифрового преобразователя» ESP32, проследим расхождения преобразования и применим метод настройки / калибровки АЦП.

Шаг 1. Что такое AD-конвертер?

АЦП - это схема, способная переводить аналоговую (непрерывную) величину в цифровые (дискретные) значения. Что это обозначает? Это означает, что в то время как цифровые значения могут принимать только дискретные значения, образованные комбинацией нулей и единиц, аналоговая величина может принимать любое значение в пределах диапазона. Например, если мы измерили напряжение идеального элемента AA, мы могли бы найти любое значение от 0 В до 1,5 В, поскольку это аналоговая величина. Выходное состояние идеальной лампы должно принимать только два состояния (выключено или включено), что является дискретной величиной. Поскольку микроконтроллеры работают с использованием этой дискретной логики, нам нужна схема, способная переводить аналоговую величину в цифровую (или дискретную).

Шаг 2. Используемые ресурсы

• Одна карта Lolin32 Lite v1.0.0

• Осциллограф Tektronix TDS1001C для захвата

• Один USB-кабель для ESP32

• Осциллограф Hantek DSO4102C в качестве генератора сигналов

Шаг 3: АЦП ESP32

ESP32 АЦП
ESP32 АЦП

Согласно данным Espressif, чипы ESP32 могут иметь разницу +/- 6% от одного чипа к другому в результатах измерений.

Кроме того, преобразование НЕ имеет линейного ответа для каждого доступного диапазона для чтения. Espressif предоставляет метод калибровки и предлагает пользователям использовать другие методы, если они сочтут это необходимым для достижения желаемой точности.

Мы выполним сбор данных, а затем покажем отклики АЦП и пример применения математического процесса для считывания настройки.

Есть несколько (более простых или более сложных) способов выполнить эти исправления. Вам решать, что лучше всего подходит для вашего проекта.

Показанный здесь будет иметь иллюстративную цель и попытаться затронуть интересные моменты, которые можно заметить во время настройки.

Шаг 4: Используемая схема

Используемая цепь
Используемая цепь

Я использовал осциллограф с генератором сигналов до 25 МГц, Hantek DSO4102C. Мы сгенерировали волну, которую считывали аналого-цифровой преобразователь ESP и осциллограф. Собранные данные были записаны в CSV и в электронную таблицу, которую я оставлю в конце статьи для загрузки.

Шаг 5: Используемый знак

Используемый знак
Используемый знак

Мы выбрали низкочастотный трапециевидный сигнал, который позволяет получить доступ к рампам, которые проходят через весь диапазон преобразования. Это позволяет использовать большое количество образцов на этих пандусах.

Шаг 6: данные, полученные с помощью осциллографа

Данные, полученные с помощью осциллографа
Данные, полученные с помощью осциллографа

Изображение захвата производилось осциллографом. Данные хранились в файле csv. Обратите внимание на небольшую кривизну на подъеме и спаде сигнала.

Шаг 7. Данные, полученные с помощью осциллографа (файл CSV в Excel)

Данные, полученные с помощью осциллографа (файл CSV в Excel)
Данные, полученные с помощью осциллографа (файл CSV в Excel)

Здесь у нас есть образцы.

Шаг 8: данные, полученные АЦП

Данные, полученные АЦП
Данные, полученные АЦП

Изменяя скорость передачи последовательного порта, мы можем просматривать данные, захваченные АЦП. Обратите внимание на деформацию трапециевидного сигнала.

Данные, полученные на последовательном плоттере Arduino IDE

Шаг 9: данные, полученные ADC - Excel

Данные, полученные ADC - Excel
Данные, полученные ADC - Excel

Используя более высокую скорость и последовательный терминал, мы можем зафиксировать значения и применить их в Excel для наших сравнений.

Шаг 10: Сравнение рамп для набора высоты

Сравнение рамп для подъема
Сравнение рамп для подъема

Сравним две аппарели двух зацепов.

Обратите внимание на кривизну на обоих пандусах.

Также обратите внимание, что для одного и того же пилообразного сигнала у нас есть намного больше отсчетов ESP32, чем с осциллографа.

Шаг 11: приравнивание количества образцов

Приравнивание количества образцов
Приравнивание количества образцов
Приравнивание количества образцов
Приравнивание количества образцов

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

Для этого проведем прямое сравнение.

У нас есть 305 отсчетов для линейного нарастания осциллографа и 2365 отсчетов для линейного нарастания АЦП.

Поскольку линейные изменения имеют один и тот же диапазон, мы можем сказать, что у нас есть примерно 7,75 отсчетов АЦП для каждого осциллографа.

Умножение индекса каждой выборки осциллографа дает ту же кривую, но с индексами, эквивалентными АЦП и перераспределенным данным.

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

Шаг 12: Заполнение пробелов - линия тренда

Заполнение пробелов - линия тренда
Заполнение пробелов - линия тренда
Заполнение пробелов - линия тренда
Заполнение пробелов - линия тренда

Выбрав известные данные (синие точки), щелкнув, а затем щелкнув правой кнопкой, мы выбираем: «Добавить линию тренда…»

В появившемся окне выбираем Тип Полинома (порядка 2 будет достаточно).

Мы также проверили параметры «Просмотр уравнения на диаграмме» и «Отображение значения R-квадрата на диаграмме».

Щелкаем «Закрыть».

Шаг 13: Заполнение пробелов - полиномиальная кривая 2 степени

Заполнение пробелов - полиномиальная кривая 2 степени
Заполнение пробелов - полиномиальная кривая 2 степени

Excel дает нам две новые части информации; уравнение второго порядка, которое лучше всего соответствует данным, и уравнение R-квадрата, которое количественно оценивает эту адекватность.

Просто помните, что чем ближе к 1, тем правильнее уравнение.

Не будем углубляться в математику, давайте просто воспользуемся ею как инструментом.

Шаг 14: Заполнение пробелов - оценка функции

Давайте заполним пробелы в выборке данными, полученными с помощью уравнения. А затем сравните их по пунктам.

у = -9E-08x2 + 0, 0014x + 0, 1505

R² = 0 9999

Напряжение осциллографа = -9E-08 * index2 + 0, 0014 * index + 0, 1505

Шаг 15: преобразование напряжения осциллографа в эквивалентное значение для сравнения с АЦП

Преобразование напряжения осциллографа в эквивалентное значение для сравнения с АЦП
Преобразование напряжения осциллографа в эквивалентное значение для сравнения с АЦП

Давайте воспользуемся этим, чтобы также преобразовать значение напряжения осциллографа в эквивалентное значение АЦП.

Поскольку максимальное значение, полученное в ADP ESP32, было 4095, что эквивалентно показанию 2,958 В для того же индекса, мы можем сказать, что:

Каждый вольт в измерениях осциллографа равен примерно 1384,4 единиц AD. Следовательно, мы можем умножить все измерения осциллографа на это значение.

Шаг 16: сравнение двух полученных рамп

Сравнение двух полученных рамп
Сравнение двух полученных рамп

Визуализация различий, полученных в двух показаниях.

Шаг 17: Поведение разницы показаний АЦП (ОШИБКА)

Поведение разницы показаний АЦП (ОШИБКА)
Поведение разницы показаний АЦП (ОШИБКА)

Кривая ниже показывает, как разница в показаниях АЦП ведет себя в зависимости от измерения. Этот сбор данных позволит нам найти корректирующую функцию.

Чтобы найти эту кривую, мы просто наносим на график разность, найденную в каждом измерении, как функцию каждого возможного положения AD (от 0 до 4095).

Шаг 18: поведение разницы при считывании АЦП - поиск корректирующей функции

Поведение разницы при чтении АЦП - поиск корректирующей функции
Поведение разницы при чтении АЦП - поиск корректирующей функции

Мы можем определить в Excel функцию коррекции, добавив линию тренда, теперь более высокой степени, до тех пор, пока она не будет в достаточной степени соответствовать нашим данным.

Шаг 19: Использование другого программного обеспечения

Использование другого программного обеспечения
Использование другого программного обеспечения
Использование другого программного обеспечения
Использование другого программного обеспечения
Использование другого программного обеспечения
Использование другого программного обеспечения
Использование другого программного обеспечения
Использование другого программного обеспечения

Другое интересное программное обеспечение для определения кривых - PolySolve, которое можно использовать прямо по ссылке: https://arachnoid.com/polysolve/ или загрузить как приложение Java.

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

Чтобы использовать его, просто введите данные в первое текстовое поле. Данные должны следовать в порядке X, Y, разделенных запятой или табуляцией. Соблюдайте осторожность при правильном использовании точки в качестве десятичной точки.

Если введенные данные правильно отформатированы, в следующем поле появится диаграмма.

Вот как прошла кривая ошибок АЦП.

В этом окне будет представлен результат регрессии, включая данные об адекватности функции, которые, в свою очередь, могут иметь несколько форматов вывода: как функция C / C ++, список коэффициентов, функция, написанная на Java, и т. Д.

Примечание. Обратите внимание на десятичные разделители.

Шаг 20: Константы и настройка ()

Я указываю здесь GPIO, используемый для аналогового захвата. Я инициализирую последовательный порт, а также контакт, определенный для аналогового захвата.

const int pin_leitura = 36; // GPIO используется для аналогового ввода void setup () {Serial.begin (1000000); // Создание последовательного порта для отладки pinMode (pin_leitura, INPUT); // Pino utilizado para captura analógica}

Шаг 21: цикл () и функция коррекции

Мы фиксируем отрегулированное напряжение и печатаем значения с правильными поправками или без них.

void loop () {int valor_analogico = analogRead (pin_leitura); // реализация захвата из тензора //Serial.print(valor_analogico + f (valor_analogico)); // очистить значения для отладки (COM CORREÇÃO) Serial.print (valor_analogico); // сохранить значения для отладки (SEM CORREÇÃO) Serial.print (","); Serial.print (4095); // cria uma linha para marcar o valor máximo de 4095 Serial.print (","); Serial.println (0); // cria uma linha para marcar o valor minimo de 0}

Обратите внимание в строке 12, что у нас есть возможность распечатать данные с добавлением разностной функции f (analog_value).

Шаг 22: Использование функции исправления PolySolve

Здесь мы используем функцию PolySolve внутри Arduino IDE.

/ * Режим: нормальный Полиномиальная степень 6, 2365 пар данных x, y Коэффициент корреляции (r ^ 2) = 9, 907187626418e-01 Стандартная ошибка = 1, 353761109831e + 01 Форма вывода: Функция C / C ++: Copyright © 2012, P. Lutus - https://www.arachnoid.com. Все права защищены. * / double f (double x) {return 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2) + -3.470360275448e-07 * pow (x, 3) + 2.082790802069e- 10 * pow (x, 4) + -5.306931174991e-14 * pow (x, 5) + 4.787659214703e-18 * pow (x, 6); }

Обратите внимание на замену десятичного разделителя на запятую.

Шаг 23: Захват с коррекцией - последовательный порт плоттера

Захват с коррекцией - серийный плоттер
Захват с коррекцией - серийный плоттер

Шаг 24: вычислительные затраты

Вычислительная стоимость
Вычислительная стоимость
Вычислительная стоимость
Вычислительная стоимость

Для выполнения полиномиальных вычислений процессор должен справиться с этой задачей. Это может привести к задержкам в выполнении, в зависимости от исходного кода и доступной вычислительной мощности.

Здесь мы видим таблицу результатов теста с использованием многочленов с несколькими степенями. Обратите внимание на разницу между временем, когда функция pow () использовалась, и когда она не использовалась.

Шаг 25: Тестовый код - Настройка () и запуск цикла ()

Здесь у нас есть код, использованный в нашем тесте.

void setup () {Serial.begin (1000000); // Запуск последовательного порта для отладки} void loop () {float valor_analogico = 500.0; // хм доблесть arbtrario float quantidade = 10000.0; // количество chamadas float contador = 0.0; // contador de chamadas

Шаг 26: тестовый код - цикл () и обработка

Я использовал функцию micros (), чтобы получить значение в микросекундах.

// ============= инициация или процесс float agora = micros (); // марка начального экземпляра while (contador <quantidade) {// v (valor_analogico); // função vazia // r (valor_analogico); // função com retorno // f0 (valor_analogico); // грау 0 // f1 (valor_analogico); // грау 1 // f2 (valor_analogico); // грау 2 // f3 (valor_analogico); // грау 3 // f4 (valor_analogico); // грау 4 // f5 (valor_analogico); // грау 5 // f6 (valor_analogico); // грау 6 // f13_semPow (valor_analogico); // grau 13º SEM função POW // f13_comPow (valor_analogico); // grau 13º COM a função POW contador ++; } agora = (micros () - agora) / quantidade; // определение интервала очередности перехода // ============= финализация процесса

Шаг 27: тестовый код - цикл () - результаты

Мы печатаем значение, возвращаемое функцией 13 класса с POW и без него, для сравнения, а также интервал обработки.

// показать доблесть, возвращаемую из функции grau 13 com e sem POW для сравнения Serial.print (f13_semPow (valor_analogico)); // grau 13º SEM функция POW Serial.print ("-"); Serial.print (f13_comPow (valor_analogico)); // grau 13º COM функция POW Serial.print ("-"); // очистить интервал выполнения процесса Serial.println (agora, 6); }

Шаг 28: Тестовый код - используемые функции

Пустые функции (только с возвратом) степени 0 и 1.

// FUNÇÃO VAZIAdouble v (double x) {} // FUNÇÃO SOMENTE COM RETORNO double r (double x) {return x; } // FUNÇÃO DE GRAU 0 double f0 (double x) {return 2.202196968876e + 02; } // FUNÇÃO DE GRAU 1 double f1 (double x) {return 2.202196968876e + 02 + 3.561383996027e-01 * x; }

Функции 2-го, 3-го и 4-го классов.

// FUNÇÃO DE GRAU 2double f2 (double x) {return 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2); } // FUNÇÃO DE GRAU 3 double f3 (double x) {return 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2) + -3.470360275448e-07 * pow (x, 3); } // FUNÇÃO DE GRAU 4 double f4 (double x) {return 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2) + -3.470360275448e-07 * pow (x, 3) + 2.082790802069e-10 * pow (x, 4); }

Функции 5-го и 6-го классов.

// FUNÇÃO DE GRAU 5double f5 (double x) {return 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2) + -3.470360275448e-07 * pow (x, 3) + 2.082790802069e-10 * pow (x, 4) + -5.306931174991e-14 * pow (x, 5); } // FUNÇÃO DE GRAU 6 double f6 (double x) {return 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2) + -3.470360275448e-07 * pow (x, 3) + 2.082790802069e-10 * pow (x, 4) + -5.306931174991e-14 * pow (x, 5) + 4.787659214703e-18 * pow (x, 6); }

13 класс функционирует с помощью военнопленного.

// FUNÇÃO DE GRAU 13 USANDO O POWdouble f13_comPow (double x) {return 2, 161282383460e + 02 + 3, 944594843419e-01 * x + 5, 395439724295e-04 * pow (x, 2) + -3, 968558178426e-06 * pow (x, 3) + 1, 047910519933e-08 * pow (x, 4) + -1, 479271312313e-11 * pow (x, 5) + 1, 220894795714e-14 * pow (x, 6) + -6, 136200785076e-18 * pow (x, 7) + 1, 910015248179e-21 * pow (x, 8) + -3, 566607830903e-25 * pow (x, 9) + 5, 000280815521e-30 * pow (x, 10) + 3, 434515045670e-32 * pow (x, 11) + -1, 407635444704e-35 * pow (x, 12) + 9, 871816383223e-40 * pow (x, 13); }

13 класс функционирует без использования военнопленных.

// FUNÇÃO DE GRAU SEM USAR O POWdouble f13_semPow (double x) {return 2, 161282383460e + 02 + 3, 944594843419e-01 * x + 5, 395439724295e-04 * x * x + -3, 968558178426e-06 * x * x * x + 1, 047910519933e-08 * x * x * x * x + -1, 479271312313e-11 * x * x * x * x * x + 1, 220894795714e-14 * x * x * x * x * x * х + -6, 136200785076e-18 * x * x * x * x * x * x * x + 1, 910015248179e-21 * x * x * x * x * x * x * x * x + -3, 566607830903e- 25 * x * x * x * x * x * x * x * x * x + 5, 000280815521e-30 * x * x * x * x * x * x * x * x * x * x + 3, 434515045670e- 32 * x * x * x * x * x * x * x * x * x * x * x + -1, 407635444704e-35 * x * x * x * x * x * x * x * x * x * x * х * х + 9, 871816383223e-40 * х * х * х * х * х * х * х * х * х * х * х * х * х; }

Шаг 29: файлы

Загрузите файлы:

PDF

Я НЕТ

Таблица

Рекомендуемые: