Многие любители электроники периодически сталкиваются с необходимостью отслеживания различных процессов, с помощью такого прибора, как осциллограф. Не секрет, что стоимость профессиональной системы является весьма «кусачей» и поэтому постоянно предпринимаются попытки сделать данную систему своими руками.
С появлением ардуино, увлекающиеся получили новый шанс по созданию данного аппарата «дешево и сердито». В этой статье мы сделали попытку провести краткий обзор возможностей ардуино в этом направлении.
▍Немного теории
Аналого-цифровой преобразователь (АЦП, англ. Analog-to-digital converter, ADC) — устройство, преобразующее входной аналоговый сигнал в дискретный код (цифровой сигнал).
Обратное преобразование осуществляется при помощи цифро-аналогового преобразователя (ЦАП, DAC).
Как правило, АЦП — электронное устройство, преобразующее напряжение в двоичный цифровой код. Тем не менее, некоторые неэлектронные устройства с цифровым выходом следует также относить к АЦП, например, некоторые типы преобразователей угол-код. Простейшим одноразрядным двоичным АЦП является компаратор.»
Разрешение АЦП — минимальное изменение величины аналогового сигнала, которое может быть преобразовано данным АЦП — связано с его разрядностью. В случае единичного измерения без учёта шумов разрешение напрямую определяется разрядностью АЦП.
Разрядность АЦП характеризует количество дискретных значений, которые преобразователь может выдать на выходе. В двоичных АЦП измеряется в битах.
Разрешение по напряжению равно разности напряжений, соответствующих максимальному и минимальному выходному коду, делённой на количество выходных дискретных значений.
Например:
Диапазон входных значений = от 0 до 10 вольт
Разрядность двоичного АЦП 12 бит: 2^12 = 4096 уровней квантования
Разрешение двоичного АЦП по напряжению: (10-0)/4096 = 0,00244 вольта = 2,44 мВ»
На практике, разрешение АЦП ограничено отношением сигнал/шум входного сигнала. При большой интенсивности шумов на входе АЦП различение соседних уровней входного сигнала становится невозможным, то есть ухудшается разрешение. При этом реально достижимое разрешение описывается эффективной разрядностью (англ. effective number of bits, ENOB), которая меньше, чем реальная разрядность АЦП. При преобразовании сильно зашумлённого сигнала младшие разряды выходного кода практически бесполезны, так как содержат шум.
Для достижения заявленной разрядности отношение сигнал/шум входного сигнала должно быть примерно 6 дБ на каждый бит разрядности (6 дБ соответствует двукратному изменению уровня сигнала).
▍Возможности
❒ Теперь попробуем рассмотреть возможности ардуино, в этой области cогласно этому источнику:
«Аналоговые пины могут принимать напряжение от 0 (GND) до опорного напряжения и преобразовывать его в цифровое значение, просто в какие-то условные единицы. АЦП у нас имеет разрядность в 10 бит, т.е. мы получаем измеренное напряжение в виде числа от 0 до 1023».Проверим данное утверждение: так как напряжение, которое может быть подано на аналоговый вход ардуино составляет до 5 вольт, то получим:
Диапазон входных значений = от 0 до 5 вольт
Разрядность двоичного АЦП 10 бит: 2^10 = 1024 уровней квантования
Разрешение двоичного АЦП по напряжению: (5-0)/1024 = 0,004882813 вольта = 4,88 мВ
❒ Для считывания значений с аналоговых входов ардуино используется функция analogRead():
«Функция считывает значение с указанного аналогового входа. Большинство плат Arduino имеют 6 каналов (8 каналов у платы Mini и Nano, 16 у Mega) c 10-битным аналого-цифровым преобразователем (АЦП). Напряжение поданное на аналоговый вход, обычно от 0 до 5 вольт будет преобразовано в значение от 0 до 1023, это 1024 шага с разрешением 0.0049 Вольт. Разброс напряжение и шаг может быть изменен функцией analogReference().
Считывание значение с аналогового входа занимает примерно 100 микросекунд (0.0001 сек), т.е. максимальная частота считывания приблизительно 10,000 раз в секунду.
❒ Попробуем пояснить это подробнее:
«Число 1023 здесь появилось неспроста. Дело в том, что у каждого устройства АЦП есть такой важный параметр как разрядность. Чем больше значение этого параметра, тем точнее работает прибор. Предположим, что у нас есть АЦП с разрядностью 1. Подавая на вход любое напряжения от 0 до 2,5 Вольт, на выходе мы получим 0. Любое же напряжение от 2,5 до 5 вольт даст нам единицу. То есть 1-битный АЦП сможет распознать только два уровня напряжения. Графически это можно изобразить следующим образом:
Источник картинки — www.robotclass.ru
АЦП с разрядностью 2 распознает уже четыре уровня напряжения:
от 0 до 1,25 — это 0;
от 1,25 до 2,5 — это 1;
от 2,5 до 3,75 — это 2;
наконец, от 3,75 до 5 — это 3.
На следующих двух картинках изображена работа АЦП с разрядностью 2 и 3 бит:
Источник картинки — www.robotclass.ru
В Arduino Uno установлен 10-битный АЦП, и это значит, что любое напряжение на аналоговом входе в диапазоне от 0 до 5 вольт будет преобразовано в число с точностью 1/1024 вольта. На графике будет сложно изобразить столько ступенек. Имея такую точность, 10-битный АЦП может «почувствовать» изменение напряжение на входе величиной всего 5 милливольт.
❒ И еще немного теории, касательно опорного напряжения:
«Опорное напряжение играет главную роль в измерении аналогового сигнала, потому что именно от него зависит максимальное измеряемое напряжение и вообще возможность и точность перевода полученного значения 0-1023 в Вольты.
Изучим следующую функцию – analogReference(mode), где mode:
DEFAULT: опорное напряжение равно напряжению питания МК. Активно по умолчанию
INTERNAL: встроенный источник опорного на 1.1V для ATmega168 или ATmega328P и 2.56V на ATmega8
INTERNAL1V1: встроенный источник опорного на 1.1V (только для Arduino Mega)
INTERNAL2V56: встроенный источник опорного на 2.56V (только для Arduino Mega)
EXTERNAL: опорным будет считаться напряжение, поданное на пин AREF
После изменения источника опорного напряжения (вызова analogReference() ) первые несколько измерений могут быть нестабильными (сильно шумными).
Значение 1023 функции analogRead() будет соответствовать выбранному опорному напряжению или напряжению выше его, но не выше 5.5V, что спалит плату. То есть при режиме DEFAULT мы можем оцифровать напряжение от 0 до напряжения питания. Если напряжение питания 4.5 Вольта, и мы подаём 4.5 Вольт – получим оцифрованное значение 1023. Если подаём 5 Вольт – опять же получим 1023, т.к. выше опорного. Это правило работает и дальше, главное не превышать 5.5 Вольт. Как измерять более высокое напряжение (12 Вольт, например) я расскажу в отдельном уроке.
Что касается точности: при питании от 5V и режиме DEFAULT мы получим точность измерения напряжения (5 / 1024) ~4.9 милливольт. Поставив INTERNAL мы можем измерять напряжение от 0V до 1.1V с точностью (1.1 / 1024) ~0.98 милливольт. Весьма неплохо, особенно если баловаться с делителем напряжения.
Что касается внешнего источника опорного напряжения. Нельзя использовать напряжение меньше 0V или выше 5.5V в качестве внешнего опорного в пин AREF. Также при использовании режима EXTERNAL нужно вызвать analogReference(EXTERNAL) до вызова функции analogRead(), иначе можно повредить микроконтроллер. Можно подключить опорное в пин AREF через резистор на ~5 кОм, но так как вход AREF имеет собственное сопротивление в 32 кОм, реальное опорное будет, например 2.5 * 32 / (32 + 5) = ~2.2V. »
❒ Далее, поговорим о частоте дискретизации, — еще одном важном параметре для осциллографа:
«Частота дискретизации (или частота сэмплирования, англ. sample rate) — частота взятия отсчётов непрерывного по времени сигнала при его дискретизации (в частности, аналого-цифровым преобразователем). Измеряется в герцах.
Термин применяется и при обратном, цифро-аналоговом преобразовании, особенно если частота дискретизации прямого и обратного преобразования выбрана разной (этот приём, называемый также «масштабированием времени», встречается, например, при анализе сверхнизкочастотных звуков, издаваемых морскими животными).
Чем выше частота дискретизации, тем более широкий спектр сигнала может быть представлен в дискретном сигнале. Как следует из теоремы Котельникова, для того, чтобы однозначно восстановить исходный сигнал, частота дискретизации должна более чем в два раза превышать наибольшую частоту в спектре сигнала.»
❒ И еще: «Из теоремы Котельникова следует, что при дискретизации аналогового сигнала потерь информации не будет только в том случае, если (спектральная плотность) наивысшая частота полезного сигнала равна половине или меньше частоты дискретизации (в англоязычной литературе под обозначением половины частоты дискретизации употребляют термин частота Найквиста). В противном случае при восстановлении аналогового сигнала будет иметь место наложение спектральных «хвостов» (подмена частот, маскировка частот, алиасинг), и форма восстановленного сигнала будет искажена. Если спектр сигнала не имеет составляющих выше частоты Найквиста, то сигнал может быть (теоретически) продискретизирован и затем восстановлен без искажений. Фактически «оцифровка» сигнала (превращение аналогового сигнала в цифровой) сопряжена с квантованием отсчётов — каждый отсчёт записывается в виде цифрового кода конечной разрядности, в результате чего к отсчётам добавляются ошибки квантования (округления), при определённых условиях рассматриваемые как «шум квантования».
Реальные сигналы конечной длительности всегда имеют бесконечно широкий спектр, более или менее быстро убывающий с ростом частоты. Поэтому дискретизация сигналов всегда приводит к потерям информации (искажению формы сигнала при дискретизации—восстановлении), как бы ни была высока частота дискретизации. При выбранной частоте дискретизации искажение можно уменьшить, если обеспечить подавление спектральных составляющих аналогового сигнала (до дискретизации), лежащих выше частоты Найквиста, для чего требуется противоподменный фильтр очень высокого порядка, чтобы избежать наложения «хвостов». Практическая реализация такого фильтра весьма сложна, так как амплитудно-частотные характеристики фильтров имеют не прямоугольную, а гладкую форму, и образуется некоторая переходная полоса частот между полосой пропускания и полосой подавления. Поэтому частоту дискретизации выбирают с запасом, к примеру, в аудио компакт-дисках используется частота дискретизации 44100 Герц, в то время как высшей частотой в спектре звуковых сигналов, которую может услышать человек, считается частота 20000 Гц.
Запас по частоте Найквиста в 44100 / 2 — 20000 = 2050 Гц позволяет избежать подмены частот при использовании реализуемого фильтра невысокого порядка.»
Каким же образом взаимосвязаны рассмотренные ранее — частота дискретизации и разрешение двоичного АЦП? Это можно легко понять по следующему графику:
Теперь рассмотрим, какие возможности у ардуино, по частоте дискретизации.
Согласно данному источнику, для максимального разрешения, рекомендуется работать в пределах частоты АЦП от 50 кГц до 200 кГц. Там же была проведена проверка с использованием чистого синусоидального тона, для воспроизведения, сэмплов для различных тактовых частот АЦП.
Результаты показаны здесь.
Таким образом, видно, как сильно падает разрешение, по мере роста частоты сэмплирования.
Судя по данным одного из авторов, при работе с Arduino IDE используется стандартная функция analogRead(), которая позволяет считывает значение с указанного аналогового входа. Считывание значение с аналогового входа занимает примерно 100 микросекунд (0.0001 сек), то есть максимальная частота считывания приблизительно 10000 раз в секунду (10 кГц).
Если более точно рассмотреть это число, то получается, следующая картина (зная величину тактовой частоты = 16 МГц): (16:128):13 ≈ 9.6 кГц.
Где 128 – делитель, а 13 – количество тактовых периодов, требующихся на одно преобразование.
Следующий автор провел практические исследования этого вопроса и у него получилась такая картина:
«Длительность переключения в 62 нс и время циклического возврата к началу работы программы в 124 нс не превышают погрешность измерения на этом временном масштабе и мы можем пренебречь этими временными промежутками. Отсюда видно, что время, которое затрачивается на аналого-цифровое преобразование примерно равно 112 мкс, поэтому максимальная частота выборки при использовании функции analogRead не превышает 8.9 кГц.»
Таким образом, подытожим всё вышесказанное:
Несмотря, на то, что тактовая частота процессора ардуино (если брать для примера ATMega328 – на котором основаны Arduino Uno, Arduino Nano) составляет 16 МГц, диапазон частоты АЦП, на котором могут быть получены более-менее точные данные, составляет от 8,9 до 9,6 кГц (данные могут быть не совсем точны, но для ориентира и общего понимания ситуации – годятся).
К аналоговым пинам можно подключать напряжение от 0 (GND) до опорного напряжения и преобразовывать его в цифровое значение, или в некие условные единицы. АЦП имеет разрядность в 10 бит, т.е. мы получаем измеренное напряжение в виде числа от 0 до 1023.
Если говорить о точности измерений, то при входном напряжении в 5 вольт, точность измерения напряжения составит (5 / 1024) ~4.9 милливольт. Также возможно измерить напряжение от 0V до 1.1V с точностью (1.1 / 1024) ~0.98 милливольт.
То есть, можно говорить о достаточно медленной работе функции analogRead ().
Шумовая же составляющая АЦП ардуино, согласно источнику, составляет единицы милливольт.
Теперь, ознакомившись с общими основами, проанализируем, что собирают различные авторы в направлении создания своего осциллографа на базе ардуино.
Если устраивает система со считыванием показателей с компьютера, то можно остановиться на следующих самоделках:
❒ Вариант 1:
Автор картинки: amansinghaljpr
- 10 бит, частота дискретизации — стандартная (если с высоким разрешением, до: 9,6 кГц);
- Состоит из 5 деталей;
❒ Вариант 2:
Источник картинки: www.randomnerdtutorials.com
- 10 бит, частота дискретизации — стандартная (если с высоким разрешением, до: 9,6 кГц);
- Состоит из 8 деталей, требуется среда Processing;
Если требуется миниатюрный экран, то можно использовать вариант, с отображением данных на экране смартфона:
❒ Вариант 3:
Автор картинки: loboat
- 10 бит, частота дискретизации 150 Гц – 15 кГц;
- Состоит из 32 деталей;
Или на миниатюрном интегрированном экране:
❒ Вариант 4:
Автор картинки: Peter Balch
- 8 бит, частота дискретизации до 500 кГц (однако автор рекомендует использовать не более 250 кГц, так как иначе все показатели сливаются в сплошную полосу и трудно рассмотреть);
- Состоит из 15 деталей;
Этот осциллограф может работать:
- в режиме измерения аналогового сигнала;
- в режиме измерения цифрового сигнала;
- как частотомер;
- вольтметр;
Особенности: есть предусилитель, поэтому доступно измерение не только следующих диапазонов (как в стандартном осциллографе на ардуино):
- От 0 В до 5 В;
- От -0,55 В до + 0,55 В;
Но и более расширенного числа диапазонов:
- От 0 В до 5 В;
- От -0,55 В до + 0,55 В;
- От -117 мВ до + 117 мВ;
- От -25 мВ до + 25 мВ;
- Цифровые диапазоны (для замеров прямоугольных сигналов);
Этот осциллограф может генерировать прямоугольную волну на следующих частотах:
- 31250/1 = 31250 Гц;
- 31250/8 = 3906 Гц;
- 31250/32 = 977 Гц;
- 31250/64 = 488 Гц;
- 31250/128 = 244 Гц;
- 31250/256 = 122 Гц;
- 31250/1024 = 31 Гц;
Другими словами, можно сказать, что данный осциллограф ничем не отличается от предыдущих видов, кроме наличия предусилителя (что дает повышенную чувствительность) и наличия экрана.
❒ Ещё одна версия самодельного осциллографа, которая не упомянута еще в этой статье, использует предварительную буферизацию данных с применением кругового буфера.
Автор картинки: Caffeinomane
В принципе, этот осциллограф ничем особо не примечателен, за исключением того, что предварительная буферизация данных позволяет несколько ускорить процесс в целом, так как медленный способ передачи данных в последовательный порт используется не постоянно, а только с предварительной буферизацией данных, используя систему прерываний (при возникновении события, на которое настроены прерывания).
Автор картинок: Caffeinomane
▍Что же делать, если хочется большего?
Источник картинки: www.nutsvolts.com
В статье проделали ряд манипуляций (стандартная частота выборок, согласно автору статьи составляет 8900 выборок в секунду, с затрачиваемым временем в 11200 микросекунд):
- Снизили частоту АЦП – до минимально безопасной (это позволило ускориться до 100 000 выборок в секунду, с затрачиваемым временем в 1000 микросекунд);
- Установили повторное включение АЦП сразу после чтения данных, так как прошивка ардуино обычно сразу отключает его (это позволило ускориться до 116 000 выборок в секунду, с затрачиваемым временем в 860 микросекунд);
- Использовали цифровой способ сбора данных вместо аналогового и, соответственно, команды digitalRead вместо analogRead (это позволило ускориться до 232 000 выборок в секунду, с затрачиваемым временем в 424 микросекунды);
- Применили метод, который автор называет «подробным» и который является по сути трюком, известным под названием «разворачивание цикла» и ставит его в альтернативу использованию циклов (это позволило ускориться до 5 000 000 выборок в секунду, с затрачиваемым временем в 20 микросекунд на сбор 100 образцов).
Так как дальнейшее ускорение (согласно автору рассматриваемой статьи) было невозможно, была сделана попытка применения внешнего АЦП, а именно — шестибитного АЦП CA3306 15 MC.
С его помощью была достигнута частота в 25 000 000 выборок в секунду. Сам автор делает предположение, что, вероятно, использование «правильного» АЦП позволило бы достичь и 100 млн. выборок в секунду.
В целом, можно сказать следующее: в основном, все представленные выше самоделки на базе ардуино — функционируют в рамках физических пределов АЦП ардуино и чуда от них ожидать не стоит. Однако, тем не менее, они вполне применимы для любительских целей и просты в создании.
▍А как же обстоит дело насчет более мощных плат – esp32?
Источник картинки: www.easyvolts.com
В рамках подготовки этой статьи, автору удалось найти только 1 проект, разработчик которого был вынужден остановить его разработку в 2018 году ввиду непреодолимых проблем. Впрочем, позволим ему самому сказать об этом:
Всем привет, с момента моего первого поста о проекте, я сделал пару демонстраций видео и построил несколько прототипов. Я вложил в проект огромное количество времени, но сейчас самое время признать, что проект провалился. И я хочу объяснить почему.
Самая большая проблема — неполная непонятная и вводящая в заблуждение документация микросхемы esp32. Согласно спецификации, ESP32 I2S может работать с тактовой частотой 40 МГц, но это не так (по крайней мере, для параллельного режима). Согласно моим экспериментам и некоторым данным других разработчиков, максимальная скорость составляет 20 МГц, но даже на этой скорости работают не все режимы FIFO. Я потратил пару недель на изучение проблемы и испытываю недоумение, почему I2S на высокой скорости помещает в буфер 2 абсолютно идентичных образца. Я обнаружил, что у других разработчиков такая же проблема, и, очевидно, это ограничение esp32.
Вторая проблема — отсутствие поддержки отладки JTAG. К сожалению, мне не удалось заставить работать JTAG для esp32 должным образом. Разработчики «Sloeber IDE» проделали огромную работу по созданию полнофункциональной IDE для платформ Arduino, но по некоторым причинам мой j-Link не работает должным образом с сервером OCD esp32 от Espressif. Когда нет надлежащей документации для чипа, правильный отладчик становится критически важной частью успешной разработки. Но это не относится к esp32 (по крайней мере, сейчас; надеюсь, в будущем будет лучше).
Проблема третья — аналоговый интерфейс высокоскоростного осциллографа (вещь непростая). Да, мои познания в аналоговой электронике относительно ограничены, и мне потребовалось некоторое время, прежде чем я понял, что недооценил сложность этой части проекта. Моей целью было создать очень простое и дешевое оборудование, которое мог бы легко собрать любитель, но, похоже, это невозможно. Без экранирования, драйверов шины, операционных усилителей и других компонентов надлежащего аналогового интерфейса, он просто не будет работать с должным качеством. И когда все это вложишь в проект, это не станет ни простым, ни дешевым.
▍Итак, подведем итог:
Мои первоначальные цели для проекта (40 Мбит/с, недорогая и простая схема) недостижимы с помощью esp32 и выбранной аппаратной архитектуры. Я считаю, что 20 Мбит/с — это слишком низкая скорость.
Усилия по разработке для esp32 недопустимо высоки из-за плохой документации и отсутствия надлежащих инструментов отладки. Но это утверждение верно только тогда, когда вы делаете что-то необычное. С типичными задачами, такими как
Автор: DAN_SEA