Генератор импульсов от 0.119 Гц до 8 МГц (Arduino)

На рисунке показана схема простого генератора импульсов (меандр), генератор имеет 5 основных пределов и 4-е множителя.  Минимальный шаг регулировки периода 0,125 мкс, максимальный 128 мкс (без учета множителя).

Пределы:

  • шаг регулировки 0,125 мкс, регулировка периода импульсов от 0,125 мкс до 8.192 мс (от 8 МГц до 122.07 Гц)
  • шаг регулировки 1 мкс, регулировка периода импульсов от 1 мкс до 65.536 мс (от 1 МГц до 15.25879 Гц)
  • шаг регулировки 8 мкс, регулировка периода импульсов от 8 мкс до 524.288 мс (от 125000 Гц до 1.90735 Гц)
  • шаг регулировки 32 мкс, регулировка периода импульсов от 32 мкс до 2.097152 с (от 31250 Гц до 0.47684 Гц)
  • шаг регулировки 128 мкс, регулировка периода импульсов от 128 мкс до 8.388608 с (от 7812.5 Гц до 0.11911 Гц)

Множитель меняется при помощи кнопки энкодера в пределах (шаг регулировки х множитель): 1, 10, 100, 1000

Библиотеки:

MsTimer2.ZIP

Encoder.zip

  #include <LiquidCrystal.h>
  #include <Encoder.h>
  #include <MsTimer2.h>
   Encoder myEnc(11, 10);// CLK, DT подключение энкодера
   LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 подключение LCD
   float f,ff;
   long x;
   unsigned long newPosition,oldPosition  = -999;
   int w=1,kn,mn,pred,kn1,mn1,zap,zap1;
   String mnoj,dell;
 
void setup(){
  lcd.begin(16, 2);Serial.begin(9600);
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(12,INPUT); // КНОПКА МНОЖИТЕЛЯ ПЕРИОДА
  pinMode(13,INPUT); // КНОПКА ПРЕДЕЛА 0.125 МКС 1 МКС 8 МКС
  pinMode(9,OUTPUT); // ВЫХОД СИГНАЛА
  TCCR1A = 0x40;TCCR1B = 0x09;OCR1A = 0;
}
 
void to_Timer(){newPosition = myEnc.read()/4;}
 
void loop(){  
 
  if(digitalRead(12)==LOW){kn1++;w=1;delay(200);if(kn1>3){kn1=0;}lcd.clear();}
 
  switch(kn1){
  case 0: mn1=1;   mnoj="   x1";break;
  case 1: mn1=10;  mnoj="  x10";break;
  case 2: mn1=100; mnoj=" x100";break;
  case 3: mn1=1000;mnoj="x1000";break;
}
 
  if(digitalRead(13)==HIGH){kn++;w=1;kn1=0;x=0;delay(200);if(kn>4){kn=0;}lcd.clear();}
 
  switch(kn){
  case 0: mn=1;pred=1;break;    // 0.125 mkS 8.192 mS = 122.07 HZ ... 0.125 mkS = 80000000 HZ 
  case 1: mn=2;pred=8;break;    // 1     mkS 65.536 mS = 15.25879 HZ ... 1.000 mkS = 1000000 HZ
  case 2: mn=3;pred=64;break;   // 8     mkS 524.288 mS = 1.90735 HZ ... 8.000 mkS = 125000 HZ
  case 3: mn=4;pred=256;break;  // 32    mkS 2.097152 S = 0.47684 HZ ... 32.000 mkS = 31250 HZ
  case 4: mn=5;pred=1024;break; // 128   mkS 8.388608 S = 0.11911 HZ ... 128.000 mkS = 7812.5 HZ
}
 
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    x=x+newPosition*mn1;myEnc.write(0);newPosition=0;if(x>65535){x=65535;}if(x<0){x=0;}lcd.clear();w=1;}
 
  if(w==1){TCCR1A = 0x40;TCCR1B = 0x08 | mn;OCR1A=x;w=0;}
 
  lcd.setCursor(0,1);ff=(float)16000000/pred/(2*(1+x));
  if(ff<100){zap1=5;}else{zap1=3;}
  lcd.print(ff,zap1); lcd.print(" Hz");
  lcd.setCursor(14,1);
  lcd.setCursor(0,0);
  if(1/ff*1000000<1000){zap=3;}
  if(1/ff*1000000>1000&&1/ff*1000000<10000){zap=2;}
  if(1/ff*1000000>100000){zap=1;}
  lcd.print(1/ff*1000000,zap); lcd.print("uS");
  lcd.setCursor(11,0);lcd.print(mnoj);Serial.println(x);
}

Comments

  1. Здравствуйте,собрал ваше устройство, генератор работает, частоту выдает правильно. Но множитель не работает, подносишь руку к генератору множитель побежал сам по себе, на кнопку не реагирует. Может подскажите в чем дело. Секунды переключаются нормально. Еще поменял значение в if(digitalRead(12)==LOW) на HIGH, иначе просто не работал множитель, просто цифры бежали и все.

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

Войти с помощью: