| Ваш IP: 18.206.175.155 | Online(25) - гости: 15, боты: 9 | Загрузка сервера: 1.38 ::::::::::::

Импульсный генератор + частотомер (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

 

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

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

  • Преобразователь температуры

    На рисунке показана схема простого преобразователя температуры окружающей среды в напряжение. Резистор NTC (ТКС) или терморезистор используется в качестве датчика. Если температура возрастет, одновременно изменяется сопротивление терморезистора, при этом происходит изменение выходного напряжения преобразователя на 0,5 в на 1ºC. Коэффициент преобразования зависит от типа сопротивление терморезистора. Если вы хотите выходное …Подробнее...
  • Кодововая и цветовая маркировка отечественных транзисторов

    Кодововая и цветовая маркировка отечественных транзисторов

    Отечественные транзисторы с корпусами малых размеров маркируются цветовой или кодовой маркировкой и лишь в редких случаях марка транзистора наносится полностью, как есть. При ремонте бытовой аппаратуры можно столкнуться с цветовой или кодовой маркировкой и для замены транзистора необходимо определить марку транзистора, сделать это можно указав в предложенной форме тип транзистора. …Подробнее...
  • Регулятор скорости вращения двигателя 12В 150Вт

    Регулятор скорости вращения двигателя 12В 150Вт

    На рисунке показана схема простого регулятора скорости вращения двигателя 12В  мощностью до 150 Вт. Устройство имеет токовый ограничитель на 15А. Основа уст-ва, это система широтно-импульсной модуляции выполненная на ИМС TL494, благодаря чему скорость вращения двигателя может быть в диапазоне от 0 до 100%. При помощи R6 можно регулировать скорость вращения …Подробнее...
  • Высококачественный усилитель мощности на LM1876

    Высококачественный усилитель мощности на LM1876

    Усилитель выполнен на микросхеме LM1876, имеет выходную мощность до 22 Вт при напряжении питания от ±10 до ±32 В. ИМС LM1876 имеет защиту от перегрева, перегрузки, и систему мягкого включения для избавления от щелчков при подаче питания. Технические характеристики: Выходная мощность при Rн = 8 Ом и Uпит ±22 В … 2х20 …Подробнее...
  • Секундомер на PIC16F877A

    Секундомер на PIC16F877A

    В схеме секундомера используется микроконтроллер PIC16F877А и индикатор LCD WH1602D. Временной диапазон от 0,1 секунд до 24 часов. Управление секундомера состоит из двух кнопок «Старт\стоп» и «Сброс». При подачи питания индикатор показывает нулевые значения, при нажатии на кнопку «Старт\стоп» начинается отсчет, при повторном нажатии кнопки во второй строке индикатора появляется промежуточное …Подробнее...