| Ваш IP: 54.163.42.154 | Online(17) - гости: 7, боты: 10 | Загрузка сервера: 1.05 ::::::::::::

Импульсный генератор + частотомер (Arduino)

На рисунке показана схема простого уст-ва которое может работать в режиме генератора импульсов и в режиме частотомера.

Генератор импульсов:

  • Длительность импульсов от 1 мкс до 8.3 сек
  • Регулировка скважности от 0 до 100.0%

Изменение длительности импульсов и скважности происходит при помощи энкодера, при нажатии на кнопку энкодера начнет мигать курсор в самом младшем разряде, при помощи ручки энкодера можно установить значение от 0 до 9, при повторном нажатии кнопки энкодера курсор перемещается на следующий разряд и так далее, до регулировки скважности, если нажать кнопку энкодера еще раз, то включится режим генерации и на экране LCD индикатора появится надпись «ON». Для удобства использования генератора добавлена кнопка «включение генерации», она позволяет не перебирать все разряды, а сразу включить генерацию если Вы уже установили необходимое значение длительности импульсов. Для перехода в режим изменения длительности импульсов достаточно один раз нажать кнопку энкодера.

Для перехода в режим частотомера необходимо нажать на кнопку «генер./част.», максимальная частота измерения 6.5 МГц. Частотомер имеет три режима времени измерения: 1, 0.1 и 10 секунд. Для изменения времени измерения нужно нажат кнопку энкодера.

Для перехода в режим генератора нужно снова нажать кнопку «генер./част.».

#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(3, 4);// CLK, DT
 
void setup() {
  pinMode(2,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++;
}

Частотомер

Генератор

 

50%

20%

80%

Encoder.h

FreqCount.h

 TimerOne.h

 

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

Случайные статьи

  • Бегущие огни на 6-и светодиодах

    Бегущие огни на 6-и светодиодах

    Предложенная схема «Бегущие огни» состоит из шести светодиодов. Схема состоит из генератора на ИМС NE555 и счетчика на ИМС 4017 к выходу которого через диоды 1N4148 подключены шесть светодиодов. При помощи подстроечного резистора R2 можно регулировать частоту генератора, тем самым настраивая скорость переключения светодиодов. Схема имеет отличительную особенность, светодиоды загораются поочередно …Подробнее...
  • Автомобильный адаптер USB

    На рисунке показана схема универсального USB-адаптера, который питается от 12 вольтовой аккумуляторной батареи автомобиля. Выходное напряжение адаптера 5В. Адаптер может питать любое уст-во использующее для этого USB разъем с питающим напряжением 5В.  Напряжение питания на адаптер подается от гнезда прикуривателя автомобиля. Постоянное напряжение от аккумуляторной батареи автомобиля подается на стабилизатор …Подробнее...
  • Простой преобразователь однополярного напряжения в 2-х полярное

    В маломощных уст-вах для питания например ОУ необходимо двух полярное напряжение питания, но имеется только один источник напряжения, например батарея КРОНА, что бы решить эту проблему можно применить простой преобразователь показанный на рисунке. В схеме использован таймер NE555 который работает как генератор импульсов с частотой 100Гц, на выходе генератора стоят …Подробнее...
  • Электронный предохранитель

    Данное уст-во использую для защиты от перегрузок  по току электрических приборов работающих от сети 220В. Уст-во имеет релейное управление нагрузкой поэтому может применяться совместно с любым типом электронного оборудования. Схема состоит из датчика тока (оптрон U1) и ключа на VT1 нагрузкой которого является реле. При прохождении тока через R1 на …Подробнее...
  • Искатель скрытой проводки

    Искатель скрытой проводки предназначен для определения местоположения скрытой проводки, участков повреждения, обнаружения перегоревшей лампы в гирлянде. На DD1.1 собран усилитель на входе которого установлена антенна, на DD1.2 собран второй усилитель для сужения полосы пропускания до частоты примерно 100Гц. С1R2 служат в качестве ООС между каскадами. DD1.3 DD1.4 — компаратор напряжения, …Подробнее...