Точный генератор 1гц — 8 МГц на Arduino с управлением от компьютера


Точный генератор 1гц - 8 МГц на Arduino с управлением от компьютера

Генератор прямоугольных импульсов на Arduino Uno с управлением от компьютера и установкой частоты с точностью 1 Гц.

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

Несколько примеров использования генератора меандра

Генератор импульсов может быть полезен для настройки различной цифровой техники, для проверки импульсных устройств. Кроме того, прямоугольный сигнал можно с успехом использовать для настройки аналоговых устройств, таких как усилители звуковой частоты. Например, используя генератор прямоугольных импульсов совместно с осциллографом можно очень легко проверить работоспособность регулятора тембра, быстро оценить частотный диапазон УНЧ без дорогостоящих специальных приборов измерения АЧХ. Можно даже проверить работоспособность радиоприемной аппаратуры.

Точный генератор 1гц - 8 МГц на Arduino с управлением от компьютера

Меандр на экране осциллографа

Это связано с тем, что в спектре прямоугольного сигнала содержится огромное число гармоник. Теоретически, идеальный симметричный прямоугольный сигнал со скважностью 2 (он называется «Меандр») можно представить как сумму бесконечного числа синусоидальных сигналов — нечетных гармоник.

Точный ГЕНЕРАТОР на ARDUINO 1Гц - 8 MHz. DIY генератор с управлением от компьютера на Arduino NANO

Посмотреть видео про этот генератор

Точный генератор 1гц - 8 МГц на Arduino с управлением от компьютера

Проверка работоспособности регулятора тембра на меандре. Подъем по высоким частотам

Точный генератор 1гц - 8 МГц на Arduino с управлением от компьютера

Проверка работоспособности регулятора тембра на меандре. Подъем по Низким частотам

Например, если частота меандра равна 50 Гц, то он представляет из себя сумму синусоид (гармоник) с частотами 50 Гц, 150 Гц, 250 Гц и т. д. до «бесконечности».

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

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

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

Схема генератора на Arduino

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

На мой взгляд, лучше всего собрать генератор прямоугольных сигналов на микроконтроллере. Еще лучше использовать для этого дешевую маленькую плату Aerduino Nano. В этом случае при подключении ардуинки к компьютеру мы сразу получаем в системе виртуальный COM порт. Через такой порт очень удобно управлять нашим генератором. При этом мы экономим на всяких кнопках, энкодерах и LCD дисплее. Для генератора нам потребуется только плата Arduino Nano и пара проводов. Нужно сказать, что генератор будет прекрасно работать и на других платах Arduino, например UNO. Я использую NANO в силу ее маленьких размеров и дешевизны.

Точный генератор 1гц - 8 МГц на Arduino с управлением от компьютера

Ссылка на плату Arduino Nano

О том, какие бывают платы Arduino можно почитать в этой статье…

Точный генератор 1гц - 8 МГц на Arduino с управлением от компьютера

Принципиальная схема генератора прямоугольных импульсов

Как видно из схемы, мы снимаем прямоугольный сигнал с ножки D9 платы Arduino. Второй провод выходного разъема подключаем к ножке GND (Земля) платы Ардуино.

Несмотря на свою крайнюю простоту генератор выдает качественный прямоугольный сигнал в довольно широком диапазоне частот: от 1 Герца до восьми Мегагерц. Шаг установки частоты — 1 Герц. Это действительно хорошие параметры для такого простого устройства. Точность задания частоты зависит только от качества кварцевого резонатора платы Ардуино.

Прошивка микроконтроллера

Ниже приведен текст программы для Arduino. Скопируйте этот скетч и вставте его в Arduino IDE.

byte Lshift[] = {3,3,2,2};

void setup() {
  Serial.begin(9600);
  pinMode (9, OUTPUT); // выход генератора

  //Регистр управления А таймера/счетчика1
  TCCR1A=0;
  //Регистр управления B таймера/счетчика1
  TCCR1B=0;
}


void loop() {

  static uint32_t UartFreq = 0; //Переменная для задания нужной частоты
  uint32_t compare = OCR1A;  //OCR1A - Регистры сравнения A выхода таймера/счетчика1
  uint16_t divider = 1;  //переменная коэфф. деления прескалера

  float freqency;

  if (Serial.available() > 0) { 
    UartFreq = Serial.parseInt(); //получаем значение частоты из сообщения UART

    if (UartFreq <= 0 || UartFreq > F_CPU/2) { //Проверяем допустимый диапазон значений частоты
      return; }

    compare = (F_CPU / UartFreq /2 /divider); //вычисляем нужное значение OCR


    for (byte i = 0; i < 4; i++) {

      if (compare > 65536) { 
        divider <<= Lshift[i];
        compare = F_CPU / UartFreq /2 /divider; }
        
      else {
        TCCR1B = (i + 1) | ( 1 << WGM12 ); 
        break; }  // CTC режим работы таймера
    } 

    OCR1A = compare-1; 
    TCCR1A = 1 << COM1A0;

// Вывод значения частоты обратно в UART в подтверждение 
//Следующие три строки можно закомментировать, эта информация
//не используется в программе управления на Delphi
    freqency = F_CPU / 2 / (OCR1A + 1) / divider;
    if (freqency <10000) { Serial.print(freqency, 0); Serial.println(" Hz "); }
    if (freqency >= 10000) { Serial.print(freqency / 1000, 3); Serial.println(" kHz"); }
 }
}

Выходной прямоугольный сигнал формируется на выводе D9 платы Arduino. Генерация осуществляется аппаратным способом с использованием модуля ШИМ микроконтроллера и, соответственно, 16-разрядного таймера Timer1.

В следующем отрывке текста программы контроллер постоянно «слушает» UART порт микроконтроллера в рабочем цикле.

....
float freqency;

  if (Serial.available() > 0) { 
    UartFreq = Serial.parseInt(); //получаем значение частоты из сообщения UART

    if (UartFreq <= 0 || UartFreq > F_CPU/2) { //Проверяем допустимый диапазон значений частоты
      return; }
.....

При поступлении какой либо информации она преобразуется в число в строке:
UartFreq = Serial.parseInt();

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

Далее программа вычисляет необходимые значения для настройки таймера Timer1 чтобы получить на выходе требуемую частоту.

В последних трех строках программы

    freqency = F_CPU / 2 / (OCR1A + 1) / divider;
    if (freqency <10000) { Serial.print(freqency, 0); Serial.println(" Hz "); }
    if (freqency >= 10000) { Serial.print(freqency / 1000, 3); Serial.println(" kHz"); }

производится вычисление реальной частоты установленной в генераторе и отправка ее значения обратно в COM порт. Это можно применить для отладки программы через встроенный терминал оболочки Arduino, чтобы убедиться в том, что все работает как надо. Потом эти три строки можно закомментировать и пере-залить программу в плату, ибо моя программа управления генератором не использует эти данные. Поэтому нет никакой надобности в том, чтобы заставлять контроллер выполнять ненужные действия и посылать в порт информацию, которая не используется на практике.

Проверка работы программы

Подсоединяем к компьютеру плату Arduino, потом запускаем оболочку Arduino.

Создаем пустой скетч, сохраняем его в пустой папке на диске компьютера.

Копируем текст программы из этой статьи в оболочку Ардуино.

Точный генератор 1гц - 8 МГц на Arduino с управлением от компьютера

Выбираем нашу плату и нужный последовательный порт (на скриншоте у меня плата встала на портCOM9. У вас это может быть другой порт). После этого компилируем и заливаем скетч в плату нажав в левом верхнем углу синюю кнопку со стрелкой.

Для начала проверяем работу генератора управляя им через встроенный терминал оболочки Arduino.

Подключаем осциллограф к выводу D9 платы Arduino и к ее «земле» — GND

Идем в меню Tools и выбираем Serial Monitor:

Точный генератор 1гц - 8 МГц на Arduino с управлением от компьютера

Внизу экрана открывается панель Serial Monitor.

В окне Serial Monitor необходимо выбрать скорость соединения 9600 baud:

Точный генератор 1гц - 8 МГц на Arduino с управлением от компьютера

Управлять генератором можно вводя в мониторе числа от 1 до 8000000 и отправляя их в плату нажатием Enter. Набирать нужно только числа. В ответ плата должна выслать нам в монитор значение реальной частоты, которая будет выведена на экране , как показано ниже.

Точный генератор 1гц - 8 МГц на Arduino с управлением от компьютера

При этом на выводе D9 платы Arduino должны появиться импульсы с той частотой, которую вы задали в терминале. Вы сможете наблюдать эти импульсы на вашем осциллографе:

Точный генератор 1гц - 8 МГц на Arduino с управлением от компьютера

Убедившись что все работает нормально при управлении через терминал Arduino можно закомментировать три последних строчки кода, которые отправляют значение частоты обратно в COM PORT и перезалить скетч в плату Arduino.

    //freqency = F_CPU / 2 / (OCR1A + 1) / divider;
    //if (freqency <10000) { Serial.print(freqency, 0); Serial.println(" Hz "); }
    //if (freqency >= 10000) { Serial.print(freqency / 1000, 3); Serial.println(" kHz"); }

Но если вам лень это делать, то можно оставить все как есть. будет работать и так

Управление генератором из специальной программы

Для того, чтобы пользоваться генератором было приятно и удобно, я написал специальную программу для Windows. Программа написана на бесплатной версии Embarcadero Delphi 10.4 Community Edition.

Скриншот окна программ ы вы видите ниже:

Точный генератор 1гц - 8 МГц на Arduino с управлением от компьютера


После публикации первого видеоролика про генератор, по просьбе подписчиков, я переписал приложение на языке C# под .NET. В последующих трех роликах я подробно описал процесс переноса кода из Delphi в C# с симпользованием удобной и компактной IDE, которая называется SharpDevelop.

Точный генератор 1гц - 8 МГц на Arduino с управлением от компьютера

Управляющая программа, написанная на C#

Arduino SQR Generator Delphi - C# Sharp Develop 5

В этом плэйлисте из 4 роликов вы можете посмотреть все ролики по данной теме, в том числе и о создании управляющей программы на C# плод .NET

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


первое что вам нужно сделать — это выбрать в выпадающем списке тот COM PORT, к которому подключена ваша плата Arduino и нажать кнопку Connect.

Внимание! Не забудете закрыть оболочку Arduino (или просто закрыть в оболочке панель Serial Monitor), иначе вы не сможете соединиться с платой из моей программы. Serial Monitor будет блокировать подключение, так как он постоянно занимает COM PORT.

Радиокнопками в программе вы можете переключать диапазоны перестройки частоты. При выборе диапазона включается его максимальная частота. То есть если вы например кликните на радиокнопке 10 Hz — 10000 Hz, то установится частота 10 кГц. Кроме последнего диапазона. При выборе последнего диапазона по умолчанию установится частота 4 МГц.

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

В числовом редакторе под «крутилкой» можно задавать частоту генератора с точностью до 1 Гц стрелками вверх/вниз или просто напечатав нужную частоту как в терминале Arduino. Частота фактически изменится после нажатия на кнопку OK. Частоту вы вводите всегда в ГЕРЦАХ, то есть чтобы получить 1 МГц нужно ввести 1000000.

Плату Arduino Nano можно заказать по этой ссылке…

Все файлы проекта вы можете скачать по этой ссылке...

Программу Sharp Develop можно скачать здесь

Программа terminal 1.9b и и драйвер com0com для создания виртуальных пар соединенных между собой com портов лежат здесь…

Читать по теме:
Платы Arduino, какие они бывают?
DDS генератор на Arduino
Arduino Учебный курс
FNIRSI DSO-TC3 Осциллограф, Генератор и Тестер Компонентов 3 в 1

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *