Генератор импульсов 120кГц - 1МГц Частотомер до 6,5МГц на Arduino

Генератор импульсов характеристики
  • Длительность импульсов от 1 мкс до 8.3 сек (120кГц - 1МГц)
  • Регулировка скважности от 0 до 100.0%
Изменение длительности импульсов и скважности происходит при помощи энкодера, при нажатии на кнопку энкодера начнет мигать курсор в самом младшем разряде, при помощи ручки энкодера можно установить значение от 0 до 9, при повторном нажатии кнопки энкодера курсор перемещается на следующий разряд и так далее, до регулировки скважности,
 
При повторном нажатии кнопки энкодера,  включается режим генерации и на экране LCD индикатора появится надпись «ON». Также есть кнопка «ВКЛ ГЕНЕРАЦИИ», она позволяет не перебирать все разряды, а сразу включить генератор импульсов, если Вы уже установили необходимое значение длительности импульсов. Для перехода в режим изменения длительности импульсов достаточно один раз нажать кнопку энкодера.
 
Для перехода в режим частотомера необходимо нажать на кнопку «ГЕНЕР./ЧАСТ.», максимальная частота измерения 6.5 МГц. Частотомер имеет три режима времени измерения: 1, 0.1 и 10 секунд. Для изменения времени измерения нужно нажать кнопку энкодера.
 
Для перехода в режим генератора нужно снова нажать кнопку «ГЕНЕР./ЧАСТ.».

 

Схема принципиальная генератора импульсов на Ардуино

Генератор импульсов 120кГц - 1МГц Частотомер

Скетч Генератор импульсов 120кГц - 1МГц Частотомер до 6,5МГц

**********************************************************

#include <LiquidCrystal.h>
#include <Encoder.h>
#include <TimerOne.h>
#include <FreqCount.h>
LiquidCrystal lcd(6, 7, 8, 11, 12, 13);// RS,E,D4,D5,D6,D7
Encoder myEnc(2, 3);// CLK, DT

void setup()

{
pinMode(4,INPUT); // КНОПКА ЭНКОДЕРА
pinMode(A5,INPUT); // КНОПКА ПРИНУДИТЕЛЬНОГО ВКЛЮЧЕНИЯ ГЕНЕРАЦИИ
pinMode(A4,INPUT); // ЧАСТОТОМЕР/ГЕНЕРАТОР
lcd.begin(16, 2);// LCD 16X2
}

unsigned long f_sum,time;
long f[8]{0,0,0,0,0,0,0,512};
int i,x,y,cursor,h_g;
long oldPosition = -999,newPosition;
float t;
const float popravka = 1.0004502;// поправочный коэффициент для повышения точности генератора (если нет эталона то коэффициент = 1.0000000)

unsigned long f_0;float f0;
int x1,n=3,r;

void loop()

{

if(analogRead(4)>600)

{

h_g++;y=0;delay(300);

if(h_g>1)

{h_g=0;

}

}// ГЕНЕРАТОР/ЧАСТОТОМЕР (ПО УМОЛЧАНИЮ ПЕРВЫЙ ГЕНЕРАТОР)

if(h_g==1)

{

i=0; // ЧАСТОТОМЕР ////////////////////////////////////////////////////////////////////
if(y==1)

{FreqCount.begin(1000);}

if(digitalRead(2)==LOW)

{n++;x1=0;delay(100);}  // ВЫБОР ВРЕМЕНИ ИЗМЕРЕНИЯ ПРИ ПОМОЩИ КНОПКИ ЭНКОДЕРА

lcd.setCursor(0,1);

if(n==1){x1++;if(x1==1) {FreqCount.begin(100);}r=-1;lcd.print("T = 0.1 s ");}
if(n==2){x1++;if(x1==1) {FreqCount.begin(10000);}r=1;lcd.print("T = 10 s ");}
if(n==3){x1++;if(x1==1) {FreqCount.begin(1000);}r=0;lcd.print("T = 1 s ");}
if(n>3){n=1;}

lcd.setCursor(0,0);

lcd.print("F = "); // ВЫВОД ЧАСТОТЫ
if(f_0>=1000000 && n==3) {f0=f_0/1000000.0;lcd.print(f0,6+r);lcd.print(" MHz");}
if(f_0<1000000 && n==3) {f0=f_0/1000.0;lcd.print(f0,3+r);lcd.print(" kHz");}
if(f_0>=100000 && n==1) {f0=f_0/100000.0;lcd.print(f0,6+r);lcd.print(" MHz");}
if(f_0<100000 && n==1) {f0=f_0/100.0;lcd.print(f0,3+r);lcd.print(" kHz");}
if(f_0>=10000000 && n==2) {f0=f_0/10000000.0;lcd.print(f0,6+r);lcd.print("MHz");}
if(f_0<10000000 && n==2) {f0=f_0/10000.0;lcd.print(f0,3+r);lcd.print(" kHz");}

if (FreqCount.available())

{

f_0 = FreqCount.read(); // ИЗМЕРЕНИЕ ЧАСТОТЫ

lcd.setCursor(10,1);lcd.print("***");// ИНДИКАЦИЯ ИЗМЕРЕНИЯ
}

delay(200);
lcd.clear();
}

if(h_g==0)

{// ГЕНЕРАТОР //////////////////////////////////////////////////////////////////

if(i==8)

{

lcd.setCursor(10,1); lcd.print("ON ");// ГЕНЕРАЦИЯ ВКЛЮЧЕНА

if(y==1)

{

Timer1.initialize(f_sum * popravka); // период - запускаем только один раз после выхода из режима изминения параметров
Timer1.pwm(9, f[7]);

} // k - коэффициет заполнения 0-1023. Сигнал снимаем с выхода 9

delay(100);

}

if(digitalRead(2)==LOW)

{delay(300);i++;if(i>8){i=0;}

myEnc.write(f[i]*4);// ОПРОС КНОПКИ ЭНКОДЕРА

if(i==8)

{y=0;cursor=0;}

}

if(analogRead(5)>600) {delay(300);i=8;y=0;}// КНОПКА ПРИНУДИТЕЛЬНОГО ВКЛЮЧЕНИЯ ГЕНЕРАЦИИ

if(i<8||cursor==1) { // В РЕЖИМЕ ИЗМИНЕНИЯ ПЕРИОДА И ЗАОЛНЕНИЯ ШИМ ГЕНЕРАЦИЯ ОТКЛЮЧЕНА
lcd.setCursor(10,1);
lcd.print("OFF");// ГЕНЕРАЦИЯ ВЫКЛЮЧЕНА

long newPosition = myEnc.read()/4; // ОПРОС ЭНКОДЕРА

if (newPosition != oldPosition)

{

oldPosition = newPosition;
f[i]=newPosition;

if(i<7)

{ // ОГРАНИЧЕНИЕ ПРИ ИЗМИНЕНИИ ПЕРИОДА ОТ 0 ДО 9

if(f[i]>9){myEnc.write(0);}
if(f[i]<0){myEnc.write(9*4);}

}

else

{// ОГРАНИЧЕНИЕ ПРИ ИЗМИНЕНИИ ЗАПОЛНЕНИЯ ШИМ ОТ 0 ДО 1023

if(f[7]>1023) {f[7]=1023;}
if(f[7]<0) {f[7]=0;}

}

}

f_sum=f[6]*1000000+f[5]*100000+f[4]*10000+f[3]*1000+f[2]*100+f[1]*10+f[0];// ПЕРИОД

lcd.setCursor(0,0);// ВЫВОД ИНФОРМАЦИИ НА LCD
lcd.print("T = ");


for(x=6;x>=0;x--)

{

if(x==5||x==2) {lcd.print(".");}// ВСАВЛЯЕМ РАЗДЕЛИТЬ РАЗРЯДА
if(cursor==1&&i==x) {lcd.print(" ");

}

else {lcd.print(f[x]);}

}

lcd.print(" uS");

// МИГАНИЕ КУРСОРА ПРИ ИЗМИНЕНИИ ПАРАМЕТРОВ

if(millis()-time<200){cursor=1;}// 200 МС ПРОБЕЗ ВМЕСТО ЦИФРЫ
if(millis()-time>200){cursor=0;}// 800 МС ПОКАЗЫВАЕМ ЦИФРУ
if(millis()-time>1000){time=millis();}// ОТСЧЕТ 1 СЕКУНДЫ

}

// ВЫВОД НА LCD % ЗАПОНЕНИЯ ШИМ
t=f[7]*100.0/1023;
lcd.setCursor(0,1);lcd.print(t,1);if(cursor==1&&i==7){lcd.print(" ");}else{ lcd.print(" % ");}
}

y++;

}

**********************************************************

You have no rights to post comments