На рисунке показана схема простого генератора импульсов (меандр), генератор имеет 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
Библиотеки:
#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); }
Здравствуйте,собрал ваше устройство, генератор работает, частоту выдает правильно. Но множитель не работает, подносишь руку к генератору множитель побежал сам по себе, на кнопку не реагирует. Может подскажите в чем дело. Секунды переключаются нормально. Еще поменял значение в if(digitalRead(12)==LOW) на HIGH, иначе просто не работал множитель, просто цифры бежали и все.
Проверьте наличие подтягивающих резисторов на платке энкодера.
Спасибо большое, всё работает, резистора не было, а я не обратил внимания.