Оглавление:

Сверхбыстрые аналоговые напряжения от Arduino: 10 шагов (с изображениями)
Сверхбыстрые аналоговые напряжения от Arduino: 10 шагов (с изображениями)

Видео: Сверхбыстрые аналоговые напряжения от Arduino: 10 шагов (с изображениями)

Видео: Сверхбыстрые аналоговые напряжения от Arduino: 10 шагов (с изображениями)
Видео: ЧТО ТАКОЕ АНАЛОГОВЫЕ И ЦИФРОВЫЕ СИГНАЛЫ [Уроки Ардуино #10] 2024, Июль
Anonim
Image
Image

В этом руководстве показано, как генерировать сверхбыстрые аналоговые изменения напряжения с помощью Arduino и простой пары резистора и конденсатора. Одно из приложений, где это полезно, - создание графики на осциллографе. Есть несколько других проектов, которые сделали это. Johngineer показывает простую рождественскую елку с использованием широтно-импульсной модуляции (ШИМ). Другие усовершенствовали этот проект за счет использования резисторной лестницы или специальной микросхемы цифро-аналогового преобразователя.

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

Сначала я проведу вас через процесс построения схемы. Затем я научу вас, как добавить собственное изображение. Наконец, я расскажу о том, что делает его быстрее.

Если вам понравилась эта инструкция, пожалуйста, проголосуйте за нее!:)

Шаг 1: построение схемы

Построение схемы
Построение схемы

Для построения схемы вам понадобится следующее:

а) Arduino на базе Atmel ATmega328P 16 МГц, например Arduino Uno или Arduino Nano.

б) Два резистора номиналом R не менее 150 Ом.

c) Два конденсатора номиналом C такие, что C = 0,0015 / R, примеры:

  • R = 150 Ом и C = 10 мкм
  • R = 1,5 кОм и C = 1 мкм
  • R = 15 кОм и C = 100 нФ
  • R = 150 кОм и C = 10 нФ

Причины выбора этих значений двоякие. В первую очередь, мы хотим, чтобы ток на выводах Arduino был ниже максимального номинального тока 40 мА. Использование значения 150 Ом ограничивает ток до 30 мА при использовании с напряжением питания Arduino 5 В. Большие значения R уменьшают ток и поэтому приемлемы.

Второе ограничение заключается в том, что мы хотим сохранить постоянную времени, которая является произведением R и C, равной примерно 1,5 мс. Программное обеспечение специально настроено для этой постоянной времени. Хотя значения R и C можно регулировать в программном обеспечении, существует узкий диапазон, в котором это будет работать, поэтому выбирайте компоненты как можно ближе к предлагаемому соотношению.

Более подробное объяснение того, почему постоянная RC важна, будет дано в разделе теории после того, как я покажу вам, как собрать демонстрационную схему.

Шаг 2: Настройка осциллографа

Настройка осциллографа
Настройка осциллографа

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

a) Настройте горизонтальную развертку для управления каналом B (ось X).

б) Установите осциллограф в двухканальный режим.

c) Установите вольт / деление на обоих каналах так, чтобы он мог отображать напряжения от 0 В до 5 В. Я установил свой на 0,5 В / дел.

d) Установите режим связи DC на обоих каналах.

e) Отрегулируйте положение X и Y так, чтобы точка находилась в нижнем левом углу экрана, когда Arduino выключен.

Шаг 3. Загрузите и запустите программное обеспечение

Image
Image

Загрузите программное обеспечение из репозитория Fast Vector Display For Arduino. Программное обеспечение находится под лицензией GNU Affero Public License v3 и может свободно использоваться и изменяться в соответствии с условиями этой лицензии.

Откройте файл fast-vector-display-arduino.ino в среде Arduino IDE и загрузите его на свой Arduino. На мгновение вы увидите анимацию «С Новым годом» на экране осциллографа.

Я разработал этот проект как личный хакатон за несколько недель до Рождества, поэтому есть тематическое сообщение Рождества и Нового года, которое вы можете увидеть, изменив переменную PATTERN в коде.

Шаг 4: Создайте свой собственный рисунок

Понять, почему ШИМ такой медленный
Понять, почему ШИМ такой медленный

Если вы хотите создать свой собственный рисунок, вы можете вставить координаты точки в эскиз Arduino на линии, определяющей USER_PATTERN.

Я обнаружил, что Inkscape - довольно хороший инструмент для создания нестандартного рисунка:

  1. Создавайте текст, используя крупный жирный шрифт, например Impact.
  2. Выделите текстовый объект и выберите «Object to Path» в меню «Path».
  3. Выделите отдельные буквы и наложите их, чтобы получилась связная форма.
  4. Выберите «Объединение» в меню «Путь», чтобы объединить их в одну кривую.
  5. Если в каких-либо буквах есть отверстия, вырежьте небольшую выемку, нарисовав прямоугольник с помощью инструмента «Прямоугольник», и вычтите его из контура с помощью инструмента «Разница».
  6. Дважды щелкните путь, чтобы отобразить узлы.
  7. Прямоугольником выделите все узлы и нажмите инструмент «Сделать выбранные узлы угловыми».
  8. Сохраните файл SVG.

Важно то, что ваш рисунок должен иметь единственный замкнутый контур и без дырок. Убедитесь, что в вашем дизайне меньше 130 точек.

Шаг 5. Вставьте координаты из файла SVG в среду разработки Arduino

  1. Откройте файл SVG и скопируйте координаты. Они будут встроены в элемент «путь». Первую пару координат можно игнорировать; замените их на 0, 0.
  2. Вставьте координаты в эскиз Arduino в скобках сразу после "#define USER_PATTERN".
  3. Замените все пробелы запятыми, иначе вы получите ошибку компиляции. Инструмент «Заменить и найти» может оказаться полезным.
  4. Скомпилируйте и запустите!
  5. Если у вас есть проблемы, следите за последовательной консолью на предмет ошибок. В частности, вы увидите сообщения, если в вашем шаблоне слишком много точек для внутреннего буфера. В таких случаях изображение будет чрезмерно мерцать.

Шаг 6: понять, почему ШИМ такой медленный

Для начала рассмотрим поведение конденсатора во время зарядки.

Конденсатор, подключенный к источнику напряжения Vcc, будет увеличивать свое напряжение в соответствии с экспоненциальной кривой. Эта кривая является асимптотической, что означает, что она будет замедляться по мере приближения к целевому напряжению. Для всех практических целей через 5 секунд RC напряжение "достаточно близко". RC называется «постоянной времени». Как мы видели ранее, это произведение номиналов резистора и конденсатора в вашей схеме. Проблема в том, что 5 RC - это довольно долгое время для обновления каждой точки графического дисплея. Это приводит к сильному мерцанию!

Когда мы используем широтно-импульсную модуляцию (ШИМ) для зарядки конденсатора, нам не лучше. С ШИМ напряжение быстро переключается между 0 В и 5 В. На практике это означает, что мы быстро чередуем между подачей заряда в конденсатор и его вытягиванием снова - это толкание и оттягивание больше похоже на попытку пробежать марафон, сделав большой шаг вперед, а затем небольшой шаг назад. снова и снова.

Когда вы усредняете все это, поведение зарядки конденсатора с использованием ШИМ точно такое же, как если бы вы использовали постоянное напряжение Vpwm для зарядки конденсатора. Нам все еще требуется около 5 секунд RC, чтобы "достаточно" приблизиться к желаемому напряжению.

Шаг 7: переходите от пункта А к пункту Б немного быстрее

Доберитесь от А до Б, немного быстрее
Доберитесь от А до Б, немного быстрее

Предположим, у нас есть конденсатор, который уже заряжен до Va. Предположим, мы используем analogWrite () для записи нового значения b. Какое минимальное время нужно ждать достижения напряжения Vb?

Если вы угадали 5 секунд RC, это здорово! Подождав 5 секунд RC, конденсатор будет заряжен почти до Vb. Но если мы хотим, мы можем подождать немного меньше.

Посмотрите на кривую заряда. Видите ли, конденсатор уже был на Va, когда мы начали. Это означает, что нам не нужно ждать времени t_a. Нам нужно было бы это сделать, только если бы мы заряжали конденсатор с нуля.

Так что, не дожидаясь этого времени, мы видим улучшение. Время t_ab на самом деле немного меньше 5 RC.

Но подождите, мы можем сделать намного лучше! Посмотрите на все пространство над v_b. Это разница между Vcc, максимальным доступным нам напряжением, и Vb, которого мы намереваемся достичь. Вы видите, как это дополнительное напряжение может помочь нам достичь того, чего мы хотим, намного быстрее?

Шаг 8: Переходите от А к Б с помощью турбо-зарядного устройства

Доберитесь от А до Б с турбонаддувом!
Доберитесь от А до Б с турбонаддувом!

Верно. Вместо того, чтобы использовать ШИМ при целевом напряжении V_b, мы удерживаем его на постоянном Vcc в течение гораздо более короткого периода времени. Я называю это методом турбо-зарядного устройства, и он дает нам то, чего мы хотим, очень, очень быстро! После временной задержки (которую мы должны вычислить) мы нажимаем на тормоза, переключаясь на ШИМ на V_b. Это предохраняет напряжение от выхода за цель.

С помощью этого метода можно изменить напряжение на конденсаторе с V_a на V_b за меньшее время, чем при использовании только ШИМ. Вот как ты попадаешь в места, детка!

Шаг 9. Изучите код

Понять Кодекс
Понять Кодекс

Картинка стоит тысячи слов, поэтому на диаграмме показаны данные и операции, которые выполняются в коде. Слева направо:

  • Графические данные хранятся в PROGMEM (то есть во флэш-памяти) в виде списка точек.
  • Любая комбинация операций перемещения, масштабирования и вращения объединяется в матрицу аффинного преобразования. Это делается один раз в начале каждого кадра анимации.
  • Точки считываются одна за другой из графических данных и каждая умножается на сохраненную матрицу преобразования.
  • Преобразованные точки пропускаются через алгоритм обрезки, который обрезает любые точки за пределами видимой области.
  • Используя справочную таблицу задержки RC, точки преобразуются в управляющие напряжения и временные задержки. Таблица поиска задержки RC хранится в EEPROM и может повторно использоваться для нескольких запусков кода. При запуске таблица поиска RC проверяется на точность, и все неверные значения обновляются. Использование EEPROM экономит ценную оперативную память.
  • Управляющие напряжения и задержки записываются в неактивный кадр в буфере кадров. Буфер кадра содержит пространство для активного кадра и неактивного кадра. После записи полного кадра неактивный кадр становится активным.
  • Подпрограмма обслуживания прерывания постоянно перерисовывает картинку, считывая значения напряжения и задержки из активного буфера кадра. На основе этих значений он регулирует рабочие циклы выходных контактов. Таймер 1 используется для измерения временной задержки с точностью до нескольких наносекунд, а таймер 2 используется для управления рабочим циклом контактов.
  • Вывод с наибольшим изменением напряжения всегда находится в режиме «турбо-зарядки» с рабочим циклом от нуля до 100%, что обеспечивает самое быстрое время зарядки или разрядки. Вывод с меньшим изменением напряжения приводится в действие с рабочим циклом, выбранным, чтобы соответствовать времени перехода первого вывода - это согласование времени важно для обеспечения того, чтобы линии были нарисованы прямо на осциллографе.

Шаг 10: с большой скоростью приходит большая ответственность

Поскольку этот метод намного быстрее ШИМ, почему его не использует analogWrite ()? Ну, потому что использование только ШИМ достаточно для большинства программ и гораздо более снисходительно. Однако метод "Turbo Charger" требует тщательного кодирования и подходит только для определенных случаев:

  1. Он чрезвычайно чувствителен к времени. Как только мы достигнем целевого уровня напряжения, ведущий штифт должен быть немедленно переключен в обычный режим ШИМ, чтобы избежать превышения целевого напряжения.
  2. Это требует знания константы RC, поэтому эти значения необходимо ввести заранее. При неправильных значениях время будет неправильным, а напряжения будут неправильными. При использовании обычного ШИМ есть гарантия, что через некоторое время вы установите правильное напряжение, даже если постоянная RC неизвестна.
  3. Вычисление точного интервала времени для зарядки конденсатора требует логарифмических уравнений, которые слишком медленны для вычислений в реальном времени на Arduino. Они должны быть предварительно вычислены перед каждым кадром анимации и где-то кэшироваться в памяти.
  4. Программы, работающие с этим методом, должны учитывать тот факт, что задержки очень нелинейны (фактически, они экспоненциальны). Целевые напряжения около Vcc или GND потребуют на много порядков больше времени для достижения, чем напряжения около средней точки.

Чтобы преодолеть эти ограничения, мой код векторной графики выполняет следующие действия:

  1. Он использует таймер 1 на частоте 16 кГц и процедуру обработки прерывания для точного управления выходом и синхронизации.
  2. Это требует использования определенного значения постоянной времени RC, ограничивающего выбор номиналов конденсатора и резистора.
  3. Он сохраняет временные задержки для всех точек кадра анимации в буфере памяти. Это означает, что подпрограмма, вычисляющая временные задержки, выполняется гораздо медленнее, чем подпрограмма обслуживания прерывания, обновляющая выходные контакты. Любой данный кадр может быть нарисован несколько десятков раз, прежде чем новый набор задержек для следующего кадра будет готов к использованию.
  4. Использование буфера памяти накладывает ограничение на количество точек, которые можно нарисовать за кадр. Я использую кодирование с эффективным использованием пространства, чтобы максимально использовать доступную оперативную память, но оно по-прежнему ограничено примерно 150 точками. При превышении сотни или около того, дисплей все равно начнет мерцать, так что это спорный вопрос!

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