Генератор прямоугольных импульсов в своей основе использует библиотеку TimerOne, возможности библиотеки позволяют генерировать сигнал ШИМ на выводе 9 в диапазоне от 1 мкс до 8,3 сек, в частности в генераторе диапазон ограничен до 200 мс (5 Гц), при желании диапазон можно увеличить до 8,3 сек. Так можно регулировать скважность от 0 до 1023 единиц (10-бит), что соответствует 0 и 100%.
В генераторе импульсов имеется возможность регулировки периода следования импульсов при помощи кнопок подключенных к цифровым входам 6 и 7 Arduino. 13 вход позволяет регулировать скважность (коэффициент заполнения). Возможно кнопочное управление не самое разумное решение, но на данный момент реализована только такая функция.
Для удобства показания длительности и скважности выведены на первый ряд индикатора LCD 16×2, во втором ряду выведены показания частоты. Важно помнить что минимальный шаг регулировки периода следования импульсов 1 мкс, поэтому частота будет меняться дискретно, например 1 мкс это 1 МГц, 2 мкс — 500 кГц, 3 мкс это 333,333 Гц и так далее, по мере уменьшения частоты увеличивается плавность ее регулировки.
// rcl-radio.ru // Генератор прямоугольных имульсов, период следования импульсов от 1 мкс до 200 мс (1 МГц...5 Гц) #include <TimerOne.h> #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7 unsigned long t=1000,f,k=512;// по умолчанию 1000 мкс (1000 Гц), меандр, длительность имульса равна скважности k=512 (50%) byte k1,kn,kn1,kn2; int drive,drive0; void setup() { lcd.begin(16, 2);// LCD 16X2 pinMode(10, OUTPUT); pinMode(6,INPUT);// кнопка на входе 6 pinMode(7,INPUT);// кнопка на входе 7 pinMode(13,INPUT);// кнопка на входе 13 } void loop() { Timer1.initialize(t); // период Timer1.pwm(9, k); // k - коэффициент заполнения 0-1023. Сигнал снимаем с выхода 9 kn=digitalRead(6); // кнопка вход 6 (- период импульса) kn1=digitalRead(7);// кнопка вход 7 (+ период импульса) kn2=digitalRead(13);// кнопка вход 13 (+ по кругу коэффициент заполнения) if(kn==HIGH){ // убавление периода drive++; if(drive<30){ t=t-1; } // если долго держат кнопку происходит ускорение коррекции периода импульса х10 х100 х1000 else if(drive>30 && drive<60 ){ t=t-10; } else if(drive>=60 && drive<100){ t=t-100; } else if(drive>=100){ t=t-1000; } } else{ drive=0; } if(kn1==HIGH){// добавление периода drive0++; if(drive0<30){ t=t+1; // если долго держат кнопку происходит ускорение коррекции периода х10 х100 х1000 } else if(drive0>30 && drive0<60 ){ t=t+10; } else if(drive0>=60 && drive0<100){ t=t+100; } else if(drive0>=100){ t=t+1000; } } else{ drive0=0; } if(t==0 || t>300000){ // ограничение длительности импульса по минимому, если 0 мкс или больше 300 мс (3,33 Гц), то период равен 1 мкс t=1; } if(t>200000 && t<300000){ // ограничение длительности импульса по максимому, если больше 200 мс, но меньше 300 мс (3,33 Гц), то период равен 200 мс (5 Гц) t=200000; } f=1000000/t; // расчет частоты k1=k*100/1024; // расчет % коэффициента заполнения if(kn2==HIGH){// кнопка регулировки коэффициента заполнения (по кругу от 50 до 100%, далее от 0 до 100%) k=k+16;// шаг 16 из 1024 (можно сделать 8 для более плавной регулировки) } if(k==1024){ k=0; } // вывод информации на индикатор lcd.setCursor(0,0); lcd.print("T="); lcd.print(t); lcd.print(" us"); lcd.setCursor(12,0); lcd.print(k1); lcd.print(" %"); lcd.setCursor(0,1); lcd.print("F="); lcd.print(f); lcd.print(" Hz"); delay(300); lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print(" "); }
Генератор нуждается в доработке, поэтому со временем поменяются органы регулировки, добавятся новые функции.