На рисунке показана схема простого уст-ва которое может работать в режиме генератора импульсов и в режиме частотомера.
Генератор импульсов:
- Длительность импульсов от 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(4, 3);// 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(digitalRead(A4)==HIGH){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(digitalRead(A5)==HIGH){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% |
библиотеки не вставляются нужно вручную вставить
скетч выложенный почему-то отличается от оригинала и не компилируется нужно как-то по другому выкладывать
Опубликуйте на форуме — http://forum.rcl-radio.ru/viewtopic.php?id=579
Для форума нужна новая регистрация пользователя.
не могу войти на форум при регистрации пишет что я бот
при регистрации выдает сообщение Извините, мы думаем что вы бот. Ваш адрес электронной почты найден в базе спамеров StopForumSpam. Вы не можете сейчас зарегистрироваться.
Под каким Ником регистрировались?
Anatoluy
К сожалению такой пользователь не найден, Вам придется воспользоваться другим адресом для регистрации.
создал другой адрес тоже самое Ваш адрес электронной почты найден в базе спамеров StopForumSpam. Вы не можете сейчас зарегистрироваться.
других вариантов передать скетч нет
Отправлено письмо подтверждения регистрации
спасибо регистрация прошла вставляю скетч в сообщения пишет что с ошибками и не отправляет
Вставка кода
спасибо за терпение скетч отправил скачал попробовал работает энкодер
да если можно посмотрите кнопка эндокера должна выключать генерацию не только на экране а и в схеме ?