Arduino-metr. Часть 3. Генератор.

Продолжаем разбираться со «встроенными» возможностями Arduino, как части измерительной лаборатории радиолюбителя.

Сегодня займемся превращением нашего микроконтроллера в генератор сигналов.

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

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

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

Вы можете воспользоваться любым другим вариантом интерфейса, реализованного на других модулях. Для выбора нужной частоты нам будет предоставлено семь цифр, между которыми мы будем перемещаться наклонами джойстика влево-вправо, а изменять значения текущей цифры будет движениями вверх-вниз. Может это и не самый быстрый способ ввода нужной частоты, но он позволяет отказаться от цифровой клавиатуры, как дополнительного модуля. Хотя вы можете доработать скетч для работы с любыми средствами ввода частоты.

Теперь попробуем разобраться с программной реализацией работы нашего генератора.

Если воспользоваться штатной функцией среды разработки для Arduino, digitalWrite(), то вы сможете получить на выходе генератор сигналов прямоугольной формы, с диапазоном частот до 120 кГц, что может оказаться недостаточным. Да и точность установки частоты необходимо будет подбирать экспериментально, поскольку мы точно не знаем, сколько микросекунд выполняется каждая из операций в программе.

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

Работать мы будем с аппаратным таймером микропроцессора. Таймер можно «дергать» так часто, как работает тактовый генератор микропроцессора. Счетчик обращений к этому таймеру так же реализован аппаратно и не требует от микроконтроллера вычислительных ресурсов.  Осталось только правильно настроить этот таймер, что не так уж и сложно. В секции Setup() нашего скетча прописываем нужные значения в регистры микроконтроллера.

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

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

И так как же это у нас работает?  В общем, после запуска таймера, нам достаточно поместить в регистр OCR1A число, которое будет описывать, через сколько тактов процессора необходимо переключать выбранный нами цифровой вход. Проще говоря, мы задаем делитель для частоты микроконтроллера. Причем этот делитель целый и лежит в пределах от 1 до 65535 (2 байта).

Исходя из этого у нашего генератора появляются и свои особенности.  К сожалению мы можем устанавливать только частоты из сетки в 65 535 значений и далеко не все они могут нас устроить.

Так  при частоте микропроцессора в 16 МГц, мы можем получить максимальную частоту генератора 8 МГц, поскольку нам необходимо как минимум 2 такта на «вкл» и «выкл» цифрового выхода. Следующий делитель который мы можем установить, это 2, а значит следующий шаг частоты нашего генератора, это 4 МГц  и т.д., делители то у нас только целые. Поэтому получить какую-либо частоту между 8 и 4 МГц или между 4 и 2.66 МГц данным способом мы не можем. Таким образом регулировка частоты получается не очень плавной. Но те частоты, которые можно получить делением частоты микропроцессора на целое число, получаются стабильными и точными.

На изображении видно, что реальная частота, выдаваемая нашим микроконтроллером, может отличаться от желаемой. Для контроля этого параметра я добавил в скетче вывод информации о реальной частоте, которая получилась при рассчитанных целочисленных коэффициентах.  Но не все так страшно, для частот до 100 кГц шаг нашей сетки получается довольно таки «плотным» и отличия от желаемой частоты составляют порой единицы герц.

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

P.S.: Ну и исходя из максимального коэффициента деления 65535, минимальная частота, которую можно генерировать таким образом, составляет 122 Гц.

P.P.S.: Скетч для варианта генератора с LCD4884 Joystick Shield можно взять ЗДЕСЬ.