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

ТехнарьКто

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

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

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

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

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

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

Итак схема.
1.jpg
Я же обещал очень простой генератор ;)
генератор ардуина.jpg
На выход сигнала можно смело цеплять динамик для проверки его работоспособности. Без конденсатора можно сразу подавать сигнал на микроконтроллеры и электронные схемы у которых 5V питание.

генератор:
// Терминальный генератор меандра от 1 Гц до 8 Мгц
// Автор dimax 2017 год
// Записать скетч в arduino
// Запустить терминал. Установить скорость 9600.
// Из терминала послать требуемую частоту в герцах. Только цифру.
// В ответ в терминал будет выведена частота в герцах.
// D9 и GND - выход генератора частоты.
void setup() {
Serial.begin(9600);
pinMode (9,OUTPUT); // выход генератора
TCCR1A=0;TCCR1B=0;
}
void loop() {
static uint32_t reqfreq=0; //переменная запроса частоты
uint32_t ocr=OCR1A;  uint16_t divider=1;  float freq;
if (Serial.available() > 0){ reqfreq = Serial.parseInt();
if (reqfreq==0 || reqfreq>F_CPU/2) {return;}
 ocr = (F_CPU / reqfreq /2 /divider);
  byte shifts[] = {3,3,2,2};
   for(byte i = 0; i < 4; i++){
     if (ocr > 65536) { divider <<= shifts[i];
       ocr = F_CPU / reqfreq /2 /divider; }
      else { TCCR1B = (i+1)|(1<<WGM12);  break; }  } //Mode4 (CTC)
     OCR1A=ocr-1; TCCR1A=1<<COM1A0;
    freq= (float) F_CPU/2 / (OCR1A+1) /divider;
  Serial.print(freq,3);Serial.println(" Hz ");
 }
}
Из терминала послать требуемую частоту в герцах. Только цифру. В ответ в терминал будет выведена частота в герцах, а на выходе генератора появиться сигнал с частотой как в терминале.
Пример для частоты 200 кГц. В терминале набирал 200000
02.jpg

Пример для частоты 8 мегагерц. В терминале набирал 8000000
03.jpg
Меандр кривой из за малого частотного диапазона осциллографа. Но это совершенно другой вопрос.

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

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

Вложения

Алексей58

✩✩✩✩✩✩✩
29 Апр 2021
5
0
@ТехнарьКто,
Подскажите данный генератор возможно что на выходе был прямоугольный выход
Использовать в качестве настройки спидометр , тахометр?
 

Алексей58

✩✩✩✩✩✩✩
29 Апр 2021
5
0
@bort707,
Родной
Использовал данный генератор подавал сигнал на а4988 не работает от гены
Скорее связано с формой сигнала не подходит для а 4988
 

bort707

★★★★★★✩
21 Сен 2020
3,088
916
Скорее связано с формой сигнала не подходит для а 4988
У этого генератора прямоугольный сигнал, именно такой и нужен для 4988. Ищите проблемы у себя.

И ещё - учитесь формулировать мысли, понять вас трудно.
 

Toyotabod

✩✩✩✩✩✩✩
24 Май 2024
8
1
Подскажите пожалуйста как поправить скетч чтобы работал сразу на фиксированной частоте (например 2000 герц), без запуска монитора порта и ввода в ручную частоты.
 

Toyotabod

✩✩✩✩✩✩✩
24 Май 2024
8
1
@Toyotabod, выкинуть чтение Сериала и сразу подставить

reqfreq = 2000
В том и вопрос. Какие строки закоментировать или убрать совсем? Я в Ардуино не программиую. Только в basic в детстве на спектруме работал.
 

poty

★★★★★★✩
19 Фев 2020
3,274
950
@Bula, идеального меандра не бывает.
@bort707, плюс к этому - согласованность линии передачи данных (выходной и входной импедансы, емкость в линии...). Но в целом 10нс без специальных мер - довольно неплохой результат для рассматриваемы частот.
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
540
87
Любой прямоугольный сигнал имеет время нарастания, передний фронт и время спада, задний фронт, которые можно увидеть на измерительных приборах высокой точности. Поэтому, как сказали выше идеального меандра , как и прямоугольного импульса не существует в природе.
 

bort707

★★★★★★✩
21 Сен 2020
3,088
916
целом 10нс без специальных мер - довольно неплохой результат для рассматриваемы частот.
Скорее всего эти 10 нс не имеют ничего общего с реальностью, чтобы
измерить такой спад, надо иметь осцил с полосой 500 мгц
 
  • Лойс +1
Реакции: VictorArx

VictorArx

★★✩✩✩✩✩
22 Мар 2021
540
87
Когда работал в госстандарте был специальный прибор для измерения время нарастания, выброса и спада. Очень точный мерял до 2 нс. Название не помню
 

ден79

✩✩✩✩✩✩✩
2 Июл 2024
3
0
Внесу 5 копеек. во-первых спасибо автору за код, а во-вторых - для mega 2560 10 строка поменяется на -
pinMode (11,OUTPUT); // выход генератора
 

ден79

✩✩✩✩✩✩✩
2 Июл 2024
3
0
В том и вопрос. Какие строки закоментировать или убрать совсем? Я в Ардуино не программиую. Только в basic в детстве на спектруме работал.
//if (Serial.available() > 0){ reqfreq = Serial.parseInt();
reqfreq = 1000000;
закрывающую скобочку также закомментировать
 

Toyotabod

✩✩✩✩✩✩✩
24 Май 2024
8
1
Ребята, ну напишите пожалуйста кто-нибудь скетч для генерации меандра с частотой 350 Герц без монитора COM-порта. Не получается у меня переписать исходный скетч.
 

Сузунец

✩✩✩✩✩✩✩
19 Июн 2024
18
8
42
Сузун
@Toyotabod, держи...
C++:
void setup() {
// Serial.begin(9600);
pinMode (9,OUTPUT); // выход генератора
TCCR1A=0;TCCR1B=0;
}
void loop() {
static uint32_t reqfreq = 350; // Частота 350 Гц
uint32_t ocr=OCR1A;  uint16_t divider=1;  float freq;
// А это закомментировать
// if (Serial.available() > 0){
// reqfreq = Serial.parseInt();
if (reqfreq==0 || reqfreq>F_CPU/2) {return;}
ocr = (F_CPU / reqfreq /2 /divider);
  byte shifts[] = {3,3,2,2};
   for(byte i = 0; i < 4; i++){
     if (ocr > 65536) { divider <<= shifts[i];
       ocr = F_CPU / reqfreq /2 /divider; }
      else { TCCR1B = (i+1)|(1<<WGM12);  break; }  } //Mode4 (CTC)
     OCR1A=ocr-1; TCCR1A=1<<COM1A0;
    freq= (float) F_CPU/2 / (OCR1A+1) /divider;
 // Serial.print(freq,3);Serial.println(" Hz ");
}
// }
 

Toyotabod

✩✩✩✩✩✩✩
24 Май 2024
8
1
@ден79,NANO

@Сузунец,
Блин, наконец-то. Всё получилось. Спасибо. Дальше сам разберусь..
В августе придёт энкодер. Похоже появятся снова вопросы на эту тему..

Тут опять вопрос появился. А какая амплитуда сигнала? Может кто знает.. Хотя и сам могу померить. И как уменьшить амплитуду до 5 вольт, если она больше 5 вольт.
 
  • Лойс +1
Реакции: ден79