Оглавление:

Генератор сигналов Arduino: 5 шагов (с изображениями)
Генератор сигналов Arduino: 5 шагов (с изображениями)

Видео: Генератор сигналов Arduino: 5 шагов (с изображениями)

Видео: Генератор сигналов Arduino: 5 шагов (с изображениями)
Видео: Генератор с регулировкой частоты на Arduino 2024, Ноябрь
Anonim
Генератор сигналов Arduino
Генератор сигналов Arduino

Обновление от февраля 2021 года: ознакомьтесь с новой версией с 300-кратной частотой дискретизации, основанной на Raspberry Pi Pico

В лаборатории часто требуется повторяющийся сигнал определенной частоты, формы и амплитуды. Это может быть проверка усилителя, проверка цепи, компонента или исполнительного механизма. Мощные генераторы сигналов доступны в продаже, но относительно легко сделать полезный самостоятельно с помощью Arduino Uno или Arduino Nano, см., Например:

www.instructables.com/id/Arduino-Waveform-…

www.instructables.com/id/10-Resister-Ardui…

Вот описание еще одного со следующими характеристиками:

* Точные формы сигналов: 8-битный вывод с использованием ЦАП R2R, 256-образная форма

* Быстро: частота дискретизации 381 кГц

* Точность: диапазон частот с шагом 1 МГц. Так же точен, как кристалл Arduino.

* Простота в эксплуатации: форма сигнала и частота настраиваются с помощью одного поворотного энкодера.

* Широкий диапазон амплитуд: от милливольт до 20В

* 20 предопределенных форм волны. Легко добавить больше.

* Легко сделать: стандартные компоненты Arduino Uno или Nano plus

Шаг 1. Технические соображения

Создание аналогового сигнала

Одним из недостатков Arduino Uno и Nano является то, что у них нет цифро-аналогового преобразователя (ЦАП), поэтому невозможно вывести аналоговое напряжение непосредственно на контакты. Одним из решений является лестница R2R: 8 цифровых выводов подключены к цепи резисторов, так что можно достичь 256 уровней выходного сигнала. Благодаря прямому доступу к порту Arduino может установить 8 контактов одновременно с помощью одной команды. Для резисторной сети необходимо 9 резисторов номиналом R и 8 резисторами номиналом 2R. Я использовал 10 кОм в качестве значения R, которое поддерживает ток от контактов до 0,5 мА или меньше. Думаю, R = 1 кОм тоже может работать, поскольку Arduino может легко выдавать 5 мА на контакт, 40 мА на порт. Важно, чтобы соотношение между резисторами R и 2R действительно было 2. Этого легче всего достичь, если последовательно соединить 2 резистора номиналом R, всего 25 резисторов.

Фазовый аккумулятор

Затем генерация сигнала сводится к повторной отправке последовательности 8-битных чисел на контакты Arduino. Форма сигнала хранится в массиве из 256 байтов, и этот массив дискретизируется и отправляется на контакты. Частота выходного сигнала определяется тем, насколько быстро человек продвигается по массиву. Надежный, точный и элегантный способ сделать это - использовать фазовый аккумулятор: 32-битное число увеличивается через равные промежутки времени, и мы используем 8 старших битов в качестве индекса массива.

Быстрый отбор проб

Прерывания позволяют производить выборку в строго определенное время, но накладные расходы на прерывания ограничивают частоту дискретизации до ~ 100 кГц. Бесконечный цикл для обновления фазы, выборки формы сигнала и установки контактов занимает 42 тактовых цикла, таким образом достигая частоты дискретизации 16 МГц / 42 = 381 кГц. Вращение или нажатие поворотного энкодера вызывает изменение вывода и прерывание, которое выходит из цикла для изменения настройки (формы сигнала или частоты). На этом этапе 256 чисел в массиве пересчитываются, поэтому в основном цикле не требуется выполнять фактические вычисления формы сигнала. Абсолютная максимальная частота, которая может быть сгенерирована, составляет 190 кГц (половина частоты дискретизации), но тогда есть только две выборки за период, поэтому не нужно много контролировать форму. Таким образом, интерфейс не позволяет устанавливать частоту выше 100 кГц. При 50 кГц имеется 7-8 отсчетов за период, а при 1,5 кГц и ниже все 256 чисел, хранящихся в массиве, выбираются за каждый период. Для сигналов, в которых сигнал изменяется плавно, например для синусоидальной волны, пропуск выборок не проблема. Но для сигналов с узкими пиками, например прямоугольной волны с малым рабочим циклом, существует опасность, что для частот выше 1,5 кГц пропуск одного отсчета может привести к тому, что форма сигнала будет вести себя не так, как ожидалось.

Точность частоты

Число, на которое увеличивается фаза для каждой выборки, пропорционально частоте. Таким образом, частота может быть установлена с точностью 381 кГц / 2 ^ 32 = 0,089 МГц. На практике такая точность вряд ли когда-либо понадобится, поэтому интерфейс ограничивает установку частоты с шагом 1 МГц. Абсолютная точность частоты определяется точностью тактовой частоты Arduino. Это зависит от типа Arduino, но большинство указывает частоту 16,000 МГц, поэтому точность составляет ~ 10 ^ -4. Код позволяет изменять соотношение частоты и приращения фазы, чтобы исправить небольшие отклонения от предположения о 16 МГц.

Буферизация и амплификация

Сеть резисторов имеет высокое выходное сопротивление, поэтому ее выходное напряжение быстро падает при подключении нагрузки. Это можно решить путем буферизации или усиления вывода. Здесь буферизация и усиление выполняются операционным усилителем. Я использовал LM358, потому что он у меня был. Это медленный операционный усилитель (скорость нарастания 0,5 В в микросекунду), поэтому на высокой частоте и большой амплитуде сигнал искажается. Хорошо то, что он может выдерживать напряжения, очень близкие к 0 В. Однако выходное напряжение ограничено ~ 2 В ниже шины, поэтому использование мощности +5 В ограничивает выходное напряжение до 3 В. Повышающие модули компактны и дешевы. Подавая +20 В на операционный усилитель, он может генерировать сигналы с напряжением до 18 В. (Обратите внимание, на схеме указано LTC3105, потому что это был единственный шаг вверх, который я нашел во Fritzing. На самом деле я использовал модуль MT3608, см. Изображения в следующих шагах). Я решил применить переменное затухание к выходу ЦАП R2R, затем использовать один из операционных усилителей для буферизации сигнала без усиления, а другой - для усиления на 5,7, чтобы сигнал мог достичь максимального выходного напряжения около 20 В. Выходной ток довольно ограничен, ~ 10 мА, поэтому может потребоваться более сильный усилитель, если сигнал должен управлять большим динамиком или электромагнитом.

Шаг 2: Необходимые компоненты

Для основного генератора сигналов

Arduino Uno или Nano

ЖК-дисплей 16x2 + подстроечный резистор 20 кОм и резистор 100 Ом для подсветки

5-контактный энкодер (со встроенной кнопкой)

25 резисторов 10кОм

Для буфера / усилителя

LM358 или другой сдвоенный операционный усилитель

повышающий модуль на базе MT3608

Переменный резистор 50кОм

Резистор 10кОм

Резистор 47кОм

Конденсатор 1мкФ

Шаг 3: Строительство

Строительство
Строительство
Строительство
Строительство

Я спаял все на макетной плате размером 7x9 см, как показано на картинке. Так как все провода немного запутались, я попытался покрасить провода, несущие положительное напряжение, в красный цвет, а те, которые имеют заземление, в черный.

Кодировщик, который я использовал, имеет 5 контактов, 3 с одной стороны, 2 с другой стороны. Сторона с 3 контактами - это фактический датчик, сторона с 2 контактами - это встроенная кнопка. На стороне с 3 контактами центральный контакт должен быть подключен к земле, а два других контакта - к D10 и D11. На стороне с 2 контактами один контакт должен быть подключен к земле, а другой - к D12.

Это самая уродливая вещь, которую я когда-либо делал, но она работает. Было бы неплохо поставить корпус, но на данный момент дополнительные работы и затраты не оправдывают этого. Nano и дисплей прикреплены к контактам. Я бы не стал делать это снова, если бы построил новый. Разъемы для приема сигналов на плату не ставил. Вместо этого я поднимаю их с помощью крокодиловых проводов от выступающих кусков медной проволоки, помеченных следующим образом:

R - необработанный сигнал от ЦАП R2R

B - буферизованный сигнал

А - усиленный сигнал

T - сигнал таймера с вывода 9

G - земля

+ - положительное «высокое» напряжение от повышающего модуля

Шаг 4: Код

Код, эскиз Arduino, прилагается и должен быть загружен в Arduino.

Предварительно определены 20 форм сигналов. Добавление любой другой волны должно быть несложным. Обратите внимание, что случайные волны заполняют массив из 256 значений случайными значениями, но один и тот же шаблон повторяется каждый период. Истинные случайные сигналы звучат как шум, но эта форма волны больше похожа на свист.

Код устанавливает сигнал 1 кГц на выводе D9 с помощью TIMER1. Это полезно для проверки синхронизации аналогового сигнала. Вот как я понял, что количество тактов составляет 42: если я предполагаю 41 или 43 и генерирую сигнал 1 кГц, он явно имеет частоту, отличную от сигнала на выводе D9. При значении 42 они идеально подходят.

Обычно Arduino прерывает каждую миллисекунду, чтобы отслеживать время с помощью функции millis (). Это нарушит точную генерацию сигнала, поэтому конкретное прерывание будет отключено.

Компилятор сообщает: «Sketch использует 7254 байта (23%) пространства для хранения программ. Максимум 30720 байтов. Глобальные переменные используют 483 байта (23%) динамической памяти, оставляя 1565 байтов для локальных переменных. Максимальное значение составляет 2048 байтов». Так что есть достаточно места для более сложного кода. Помните, что вам, возможно, придется выбрать «ATmega328P (старый загрузчик)» для успешной загрузки в Nano.

Шаг 5: использование

Генератор сигналов можно запитать просто через кабель mini-USB Arduino Nano. Лучше всего это делать с блоком питания, чтобы не было случайного контура заземления с устройством, к которому он может быть подключен.

При включении он будет генерировать синусоидальную волну 100 Гц. Вращая ручку, можно выбрать один из 20 других типов волн. Вращая при нажатой кнопке, курсор можно установить на любую цифру частоты, которая затем может быть изменена на желаемое значение.

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

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

Для очень низких частот выходной сигнал можно визуализировать с помощью последовательно включенного светодиода с резистором 10 кОм. Звуковые частоты можно услышать через динамик. Обязательно установите очень маленький сигнал ~ 0,5 В, иначе ток станет слишком большим, и сигнал начнет отсекаться.

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