Меню

Ардуино генератор с регулируемой частотой

Очень простой генератор из ардуины.

ТехнарьКто

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

Генератор частоты от 1 Гц до 8 000 000 Гц. Вырабатывает однополярный меандр со скважность 2. По русски это значит длительность импульса и длительность паузы между импульсами равны, а сигнал имеет прямоугольную форму.

Вопрос: Что такое генератор?
Ответ: Это устройство которое преобразует энергию источника питания в энергию выходных электрических импульсов заданной частоты и формы.

Вопрос: А мне то это зачем?
Ответ: Очень хороший вопрос, ответ на который Вы вряд ли найдете в интернете. Вы сможете проверить работоспособность усилителя. Проверить диапазон воспроизводимых усилителем частот. Проверить целостность динамика, даже без усилителя с помощью только этого генератора. Найти обрыв силового провода в проводке, обрыв телефонного провода, обрыв в электропроводке автомобиля. Правда кроме генератора нужен будет еще и детектор сигнала. Для поиска обрыва проводки генератор присоединяют к исследуемой линии, а частота генератора лежит в пределах килогерца. Поиск производится детектором. По резкому уменьшения громкости звука, определяется место разрыва. Генератор позволит проверить работу микропроцессора ардуины или PIC контроллера при использовании его как тактового. Можно сделать звуковую сирену с тональностью сигнала который Вам нравиться. Сделать передатчик с использованием генератора в качестве задающего несущую частоту. Настроить фильтр низкой частоты, настроить фильтр высокой частоты, настроить режекторный фильтр. Фильтры используют в цветомузыке, в каскадах радиоприемников, в импульсной технике для защиты от помех, для очистки информационного сигнала от сопутствующих работе помех. Подать сигнал низкой частоты на устройства работающие на шине I2C и посмотреть обмен информации хоть с помощью вольтметра. С помощью генератора можно измерять индуктивность и емкость с очень высокой точностью. Да и вообще сейчас трудно назвать современное электронное устройство в котором нет генератора и для быстрой проверки работы устройства не требовался бы внешний генератор, хотя бы такой. Кроме этого при использовании генератора показывающего все знаки неизменно возникнет вопрос, почему во всех генераторах частота немного отличается. Поэтому этот генератор позволит заинтересоваться вопросом точности и что же такое ppm, ppb зачем и когда это нужно.

Подначка: Да я программу генератора на компьютере запущу. Че мне заморачиватся.
Ответ: Программы генераторов на компьютере для звуковых карт ограничены звуковой частотой. Мне будет очень любопытно узнать, как вы с генерируете сигнал хотя бы в мегагерц 1 000 000 Гц с помощью звуковой карты. С помощью этого генератора — легко.

Теперь Вы знаете зачем нужен генератор. Практические примеры использования выходят за рамки данного сообщения. Здесь только про создание самого генератора.

Итак схема.

Я же обещал очень простой генератор

На выход сигнала можно смело цеплять динамик для проверки его работоспособности. Без конденсатора можно сразу подавать сигнал на микроконтроллеры и электронные схемы у которых 5V питание.

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

Пример для частоты 8 мегагерц. В терминале набирал 8000000

Меандр кривой из за малого частотного диапазона осциллографа. Но это совершенно другой вопрос.

Надо понимать, что выводимая в терминале частота будет отличаться от реальной. Выводимая в терминале частота была бы при идеальном кварце работающем точно на частоте 16 000 000 Гц. У ардуин такого не бывает. Если кому интересно, то могу написать о кварцевых резонаторах. Для понимания, почему в ардуино не бывает точных кварцев.

PS Поскольку в целом я далек от программирования но весьма не плохой электроник, вынужденный современностью разбираться в коде разных программ, то по большей части использую приборы которые кто то уже делал. Зачастую модифицирую, иногда и очень сильно, под свои потребности и использую. При этом считаю, что соблюдение авторства все равно должно быть. Код обычно беру из общедоступных источников, когда авторы сами выложили для использования другими. Поскольку найти конструкции бывает затруднительно, а при повторении конструкций бывают малопонятные особенности, о которых Вы можете и не найти информации, то считаю, что выложить и подробно описать для чего это надо и как заставить работать ту или иную конструкцию — это нормально.

Источник

Генерирование и чтение сигналов

Начнём с самого простого: генерация импульса заданной длины, такое часто бывает нужно. Проще всего сделать это на delay() и delayMicroseconds() :

Нужно помнить, что digitalWrite() сам по себе выполняется в районе 3.6 мкс (58 тактов процессора). Для ускорения можно использовать например библиотеку directIO или прямую работу с регистрами портов.

Генерирование квадратного сигнала

Программное

Квадратный сигнал может быть использован для тактирования и управления, а также для генерации звука через усилитель. Самый базовый пример, Blink, по сути тоже является генератором квадратного сигнала:

Читайте также:  Как снять генератор мазда фамилия

Если заменить 1000 например на 10 , то получится квадратный сигнал с частотой 50 Гц. Этот способ называется программной генерацией сигнала, то есть микроконтроллер своими силами считает время и сам вручную дёргает ногой. Это как мешает работе остального кода, так и остальной код может сбивать частоту. Такую генерацию можно сделать более мене асинхронной на миллисе:

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

Функция tone()

В ядре Arduino есть встроенная функция для полуаппаратной генерации квадратного сигнала – tone(pin, frequency, duration) :

  • pin – цифровой пин, с которого будет генерироваться сигнал.
  • frequency – частота в Герцах. Диапазон 31.. 8’000’000 Гц, целые числа. С увеличением частоты растёт шаг изменения реальной частоты.
  • duration – продолжительность сигнала в миллисекундах. Опциональный параметр, если не указывать – сигнал будет генерироваться всё время.

Для ручной остановки генерации сигнала можно вызвать noTone() . Также у генерации при помощи tone() есть особенности:

  • Генерация является полуаппаратной: пин дёргается МК “вручную” по прерыванию таймера, что на высокой частоте может чуть тормозить код.
  • Генерация использует Timer 2, перенастройка или использование его для других целей (включая ШИМ на пинах D3 и D11 у Nano) отключит активную генерацию или изменит её частоту.
    • При вызове tone() таймер перенастраивается на генерацию, то есть можно использовать таймер в своих целях между вызовами tone() .
  • Генерация работает только на одном пине в один момент времени, причём для включения генерации на другом пине нужно сначала отключить текущую генерацию, то есть вызвать noTone() .

ШИМ сигнал

Аппаратный таймер позволяет генерировать квадратный сигнал аппаратно и полностью асинхронно работе остального кода, не тратя ни такта процессорного времени: время считается самим таймером, и сам же таймер управляет состоянием ноги МК. Для генерации ШИМ сигнала в среде Arduino есть функция analogWrite(pin, duty) , подробнее мы говорили в ней в уроке про ШИМ. Чтобы сделать ШИМ квадратным, нужно запустить его с duty , равной 128 . Что касается частоты полученного сигнала, то Ардуино настраивает таймеры так, что частота в зависимости от таймера может быть 490 или 980 Гц. Частоту можно изменить с довольно большим шагом, об этом мы говорили в уроке про увеличение частоты ШИМ.

Аппаратный таймер

Можно вручную настроить аппаратный таймер на генерацию квадратного сигнала. Тонкости настройки регистров таймера мы в рамках этих уроков не разбираем, но это можно сделать и при помощи библиотеки, например GyverTimers. Работу библиотеки мы разбирали в уроке о прерываниях таймера. Данная библиотека позволяет настроить генерацию квадратного сигнала с максимально возможной точностью и частотой, а также поднять на одном таймере генерацию двух или трёх (Arduino MEGA) меандров со смещением по фазе. Пример:

ШИМ сигнал

Аппаратный

Для генерации ШИМ сигнала с заданным заполнением есть стандартная функция analogWrite(pin, duty) , подробнее обсуждали в уроке про ШИМ сигнал, а частоту можно изменить перенастройкой таймера, как в уроке об увеличении частоты ШИМ. На самом деле таймеры позволяют настроить ШИМ сигнал с более точной или более высокой частотой и другими диапазонами заполнения (до 10 бит), но в ядре Arduino это не предусмотрено. Если такое будет нужно, можно воспользоваться библиотекой GyverPWM. Пример:

Программный

Программная генерация ШИМ сигнала может пригодиться, если не хватает лишнего таймера или частота ШИМ низкая и не повлияет на остальной код, а он на неё. Шим сигнал на миллисе можно организовать вот таким образом:

Полуаппаратный ШИМ

Можно снизить нагрузку на процессор, отдав счёт времени аппаратному таймеру. Примеры на базе GyverTimers:

Если не хватает количества стандартных ШИМ-выходов, можно поднять полуаппаратный ШИМ на таймере на несколько пинов сразу:

Библиотека Servo

Как известно, RC сервоприводы управляются при помощи ШИМ сигнала с частотой

50 Гц и длительностью импульса от

2500 микросекунд. В стандартной библиотеке Servo.h реализована генерация полуаппаратного ШИМ сигнала, причём количество пинов можно менять во время работы. Библиотеку можно использовать как генерацию ШИМ, если его параметры подходят для использования.

Чтение сигналов

Чтение цифрового сигнала сводится к измерению времени между его импульсами, то есть изменениями состояния HIGH-LOW: так можно измерить период и частоту квадратного сигнала, заполнение и частоту ШИМ и вообще любой другой сигнал.

Функция pulseIn()

В ядре Ардуино есть готовые функции для измерения импульсов:

    pulseIn(pin, value, timeout) – для импульсов от 10 мкс до

3 минут, работает на счёте тактов процессора, лучше работает при отключенных прерываниях, более точно измеряет короткие импульсы.
pulseInLong(pin, value, timeout) – для импульсов от 10 мкс до

3 минут, основано на micros() (т.е. на Таймере 0), не работает при отключенных прерываниях, более точно измеряет длинные импульсы.

Обе функции возвращают длину импульса в микросекундах. Возвращают 0, если импульса не было и был достигнут тайм-аут. Обе функции блокирующие, то есть останавливают выполнение кода, пока не поймают импульс или не завершатся по тайм-ауту. Аргументы:

  • pin – цифровой пин (GPIO), на котором ожидается импульс.
  • value – направление импульса, HIGH или LOW .
  • timeout – тайм-аут ожидания импульса в микросекундах. Необязательный параметр, по умолчанию равен 1’000’000 мкс (1 секунда).
Читайте также:  Корженевского 16б ремонт генераторов

Как это работает: пусть мы настроили импульс на HIGH , функция будет ожидать изменение значения с LOW на HIGH . Если скачок с LOW на HIGH не произошёл за время, установленное тайм-аутом, функция завершит выполнение и вернёт 0.

Для превращения длины импульса (мкс) в частоту (Гц) достаточно поделить на него секунду (точнее, 1’000’000 мкс).

Измеряем сигналы вручную

Таким образом можно сделать измеритель частоты или тахометр, но лучше не выводить в сериал каждый фронт (нагружает процессор и тормозит), а считать импульсы и иногда измерять частоту (см. следующий пример).

Библиотека тахометра

Также предлагаю использовать класс тахометра, оформленный в виде библиотеки. Скачать можно с гитхаб. Также прикладываю здесь:

Источник

Генератор сигналов на Arduino

Генератор сигнала (т.н. функциональный генератор) может быть использован для тестирования и отладки схем. Я часто использую его для проверки частотных характеристик электронных компонентов, например ОУ и датчиков. Этот генератор сигналов построен на плате Arduino. Он может выдавать четыре типа сигнала: синусоидальный, треугольный, прямоугольный и пилообразный, частота каждого из которых может регулироваться от 1Гц до 50 кГц. Частота, длительность импульса и амплитуда (усиление) сигналов управляется тремя потенциометрами. Я также добавил опциональный светодиодный индикатор, который указывает какой сигнал сейчас на выходе.

Термоусадка.
Провод №22.
Припой.
Дрель со сверлами.
Термоклей.
Клей

Подготовка Arduino Proto Shield

Arduino Proto Shield — это удобный способ добавления своей схемы к Arduino, но я решил немного его урезать, чтобы он занимал меньше места в корпусе. Сначала я укоротил выводы при помощи кусачек. Потом я убрал шести контактный разъем. После этого я удалил разъемы с верхней части платы.

Корпус

Я решил использовать лазерный резак для изготовления корпуса. Я разработал корпус используя AutoCAD, Autodesk 123D Make, и Corel Draw. Все файлы проекта можно скачать внизу статьи. Если у вас нет доступа к лазерному резаку, вы можете сделать все детали корпуса вручную по двумерным чертежам.

На картинке показаны отверстия на передней панели:
(3x) 7мм отверстие для потенциометров усиления, частоты и ШИМ.
(3x) 7мм отверстие для четырех кнопок — синусоидальный, треугольный, прямоугольный и пилообразный сигналы.
(1x) 10мм отверстие для аудио разъема.

Я вырезал изображения всех четырех сигналов для того чтобы их можно было подсвечивать, но вы можете просверлить простые отверстия 5мм для светодиодов под каждой кнопкой.
Также есть прямоугольное (высота11мм, ширина 12 мм) отверстие для USB-порта Arduino в задней части устройства.

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

Пайка проводов к кнопкам

Припаяйте 10 кОм резистор к одному из выводов каждой кнопки. Припаяйте зеленый провод к месту соединения кнопки и резистора и красный провод к резистору как показано на фото. Черный провод припаяйте к другому контакту кнопки. Все эти соединения надо заизолировать термоусадкой во избежание короткого замыкания.

Установка аудио разъема

Свинтите пластиковый корпус с аудио разъема. Припаяйте красный провод к двум стерео контактам и черный провод к GND как показано на фотографии. Я использовал термоклей для предотвращения короткого замыкания и дополнительной фиксации проводов и пайки. После этого, вставьте гнездо в отверстие в корпусе и закрепите его термоклеем.

Установка кнопок

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

R2R ЦАП на Arduino Shield

Припаяйте восемь резисторов 20кОм на Arduino Proto Shield. Один из выводов каждого резистора должен быть подключен к цифровым контактам Arduino 0-7.

Припаяйте семь резисторов 10кОм на Arduino Proto Shield так, чтобы они были между выводами ранее припаянных восьми резисторов 20 кОм.

Припаяйте резистор 10кОм на Arduino Proto Shield так, чтобы один вывод резистора 10кОм был присоединён к цифровому контакту 0 Arduino, а другой вывод к GND.

Панелька для микросхем

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

Фильтр нижних частот

В качестве ФНЧ (Фильтр Нижних Частот) выступают резистор и конденсатор, соединенные последовательно. ФНЧ пропускает низкие частоты и подавляет ступеньки на сигнале.

Вот как я рассчитал номиналы компонентов в своем ФНЧ:
Частота среза = 1/(2*pi*R*C)

Согласно теореме Найквиста, сигналы не может иметь частоту больше чем половина частоты дискретизации. Если бы я использовал частоту дискретизации 100 кГц, то максимальная возможная частота была бы 50 кГц.

Если я использую резистор 300 Ом, и хочу иметь частоту среза 50 кГц:
50000 = 1/(6.28*300*C)
C = 1.06*10^-8 F
Если немного округлить:
C = 0.01 мкФ

Подключите один вывод резистора 300 Ом к резистору 10 кОм, подключенному к цифровому выводу 7. Подключите конденсатор к другому выводу резистора 300 Ом. Второй вывод конденсатора подключается к GND.

Читайте также:  Генератор лада приора 140 ампер

Усилитель

Подключите положительный вывод конденсатора 220мкФ к соединению резистора и конденсатора в ФНЧ. Второй вывод конденсатора 220мкФ подключается к резистору 20 кОм, второй вывод которого подключается к 3 выводу панельки для микросхемы. Резистор 4.7 кОм подключается между 3 и 4 контактами панельки. К 4 выводу панельки подключается GND.

Подключите положительный вывод второго конденсатора 200мкФ к 5 контакту панельки. Позже, второй его вывод будет к подключен к потенциометру «Усиление». Подключите 6 контакт панельки к Vin, 2 контакт к GND и вставьте микросхему в панельку.

Подключение потенциометра «Усиление»

Громкость или усиление звукового сигнала будет управляться аудио потенциометром 10 кОм с выключателем. Подключите выход усилителя и GND к потенциометру, как показано на фото. Средний контакт это аудио выход, который будет подключен непосредственно к разъему.

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

Подключение батареи

Подключить черный провод от разъема для батареи к GND Arduino Shield. Один провод от выключателя в потенциометре подключите к красному проводу, а второй провод от выключателя потенциометра к Vin Arduino Shield. Пока не подсоединяйте батарею.

Подключение аудио разъема

Соедините выход усилителя (отрицательный вывод конденсатора подключенного к 5 пятому выводу панельки) с красным проводом присоединенным к аудио разъему раньше. Черный провод подключите к GND Arduino Shield.

Подключение кнопок

Подключите все красные провода от кнопок к 5В и все черные провода к GND Arduino shield. Подключите зеленые провода к аналоговым контактам 0-3 в следующем порядке:
Аналоговый контакт 0 = Прямоугольный
Аналоговый контакт 1 = Треугольный
Аналоговый контакт 2 = Пилообразный
Аналоговый контакт 3 = Синусоидальный

Подключение потенциометров «Частота» и ШИМ

Подключите красный, черный, и зеленый провода к потенциометрам 10кОм и 50кОм, как показано на фотографии. Подключите красный провод к 5В и черный провод к GND Arduino shield. Подключите зеленые провода к аналоговым контактам 4 (ШИМ) и 5 (Частота).

Установка потенциометров

Снимите шайбы и гайки с потенциометров перед установкой в корпус, чтобы позволить им стать вплотную с деревом. После установки потенциометров закрепите их гайками.

Подключение светодиодов

Подсоедините резистор 470 Ом к катоду каждого из четырех светодиодов. Припаяйте черный провод ко второму выводу резистора и красный провод к аноду светодиода. Заизолируйте всё термоусадкой во избежание короткого замыкания. Припаяйте черные провода от всех четырех светодиодов на GND Arduino shield. Припаяйте красные провода к цифровым контактам 8-11.

Установка светодиодов

Приклейте светодиоды в корпусе так, что каждый из них подсвечивал один символ на передней панели :
Цифровой контакт 8 = Прямоугольный
Цифровой контакт 9 = Треугольный
Цифровой контакт 10 = Пилообразный
Цифровой контакт 11 = Синусоидальный

Черный свето рассеиватель

Приклейте свето рассеиватель на вырезы в передней панели с внутренней стороны. Я использовал кусок черного пластикового мешка для мусора.

Программа

Прошейте Arduino кодом в файле function_generator.ino. В коде используются прерывания по таймеру на частоте 100 кГц для отправки новых данных в ЦАП. Остальная часть кода следит за состоянием кнопок и потенциометров. Так как прерывания происходят на высокой частоте, я должен сделать программу обработки прерываний в ISR(TIMER1_COMPA_vect)<> как можно короче. Математические операции с плавающей точкой и с помощью функции sin() занимают слишком много времени. Я рассмотрел с нескольких проектов, и получил это: Для треугольного и пилообразного сигнала я создал переменные sawByte, triByte, sawInc, и triInc. Каждый раз, когда частота меняется, я подсчитываю сумму на которую частота треугольного и пилообразного сигналов должна измениться с частотой 100 кГц:

То есть все, что должно быть сделано в прерывании, является простой математикой:

Для синусоидально сигнала, я написал простой скрипт на Python, который выводит 20000 значений 127+127 sin(х) за один полный цикл:

Я сохранил этот массив в памяти Arduino под названием sine20000[] и беру из него значения которые необходимо отправить в ЦАП. Это намного быстрее, чем вычислять значения каждый раз.

Последние штрихи

Подключите shield к Arduino. Подключите 9В батарею к разъему. Закрепите эти элементы внутри корпуса. Убедитесь, что USB-порт Arduino доступен снаружи. После запуска вы должны увидеть светящийся индикатор синусоиды.

Установка задней панели и ручек

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

Тестирование

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

Вы заметите, что прямоугольный сигнал является единственным, который по настоящему регулируется от 1 Гц до 50 кГц. Поскольку частота дискретизации 100 кГц, синусоидальный, треугольный, и пилообразный сигналы становятся немного неузнаваемыми примерно после 25 кГц (4 отсчета за такт-100kHz/25kHz). Пилообразный и треугольный сигналы понижаются примерно 100 Гц, иначе значения triInc и sawInc станут настолько низким, что они округляются до нуля. Синусоидальный сигнал понижается до 1 Гц, но на самом деле до 5Гц, так как Arduino имеет достаточно памяти только для хранения около 20 тыс. значений.

Источник

Adblock
detector