Süper Osiloskop V2

Merhaba arkadaşlar, internette dolaşırken arduino ile yapılmış güzel bir çalışma ile karşılaştım. Bu proje elektronikle uğraşan tüm arkadaşlar için olmazsa olmaz diyebilirim.

Proje ile elektronik projeleriniz için gerekli olan sinyali üretmede,elektronik devrenizde malzemelerin sağlıklarını kontrol etmede ve üretilen sinyallerin OSİLASKOP aracılığıyla ölçme işlemlerinde rahatlıkla kullanabilirsiniz. Bu projede daha önce sitemizde yayınladığım projeden farkı yok ama bu versiyonunda programındaki değişiklikler yeterli diyebilirim.

Bundan dolayı daha önce yayınladığım projeyi kullanılan malzemeleri değiştirmeden yeni programı türkçeleştirerek ve ekran kontrastını ayarlayacak bir menu ekledim. Projeyi daha önce kurduysanız güncellemesi 1-2 dakikanızı almayacaktır. Yeni başlayacaklar bir kaç saatinizi alacaktır.

 

 

Projede sağda ve solda gördüğünüz çıkışlar osiloskop çıkışlarıdır. Bunlarda sağdaki olanlar Osiloskop ölçme çıkışı sağdakiler ise bir PWM jeneratörü diğeri ise sinüs, testere, kalp atış şeklinde testere ve üçgen sinyal üretici çıkışıdır.

 

Projenin alttan görünüşü

Arkadaşlar alttaki resimleri çekebilmek için ikinci bir sinyal jeneratörüne ihtiyacım olduğundan başka bir arduinoya alttaki kodları yükleyerek PWM çıkışından aldığım sinyali projemizle ölçtüm.

Sinyal üretici için kullandığım Program

 

void setup() {

}

void loop() {
tone (8, 10523 , 10000);

delay(1000);
}

 

 

Projede 3 adet buton ile menüde gezebilir ve OSİLASKOP ve Sinyal Üretici ayarlarını ayarlayabilirsiniz.

Kullanılan Malzemeler

  • Arduino board (Arduino Uno, Pro Mini, Nano V3…) x 1
  • Nokia LCD 5110/3310 x 1
  • 10K Direnç x 6
  • 270 Ohm Direnç x 1
  • 0.1 µF Kondansatör x 1
  • Push Buton x 3
  • 27-30 MHz crystal (İsteğe bağlı) Projenizde arduinoya overclock yaptırmak isterseniz kullanabilirsiniz.

Bağlantı Şeması

Programımız

//Страница проэкта  http://srukami.inf.ua/pultoscop_v25110.html

//От Winstonn (mailto: winstonn2017@gmail.com):

//Переделал главное меню для уменьшения строчек кода, спасибо Electronik83 за вдохновение
//Осцилоскоп практически без изменений, за исключением пары дельных советов от ArduinoFart
//PWM остался как в Ver.V1 без изменений
//DDS переделал отдельные подменю (больше для красоты). Переделал формулу изменения частоты, показания стали точней. Подкорректировал DDS функции.
//TTL заменил на Help. Так так пишу прошивку для своего типа схемы, а в ней эту функция не поддерживается. Перепрошивка МК происходит на отдельной плате.

//  NB:
//    Выход в главное меню происходит через одновременное нажатие levo и prav
//    Вход и выдод в подменю DDS происходит через нажатие ok.
//    В подмелю Freq. устанавливается желаемая частота, затем в меню DDS выбирается функция.
//    Выходной сигнал активируется после входа в функцию (подменю DDS) с помощью ok.

//название прошивки - "PULTOSCOPE_LCD5110_final2_DDS_Z_WIN_V1.1" Ver.V1.1 , 11.март.2017

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <EEPROM.h>
int address = 0;
byte value;

#include <FreqCount.h>
#include <PWM.h>
#include <CyberLib.h>
#include <avr/io.h> // soft reset
#include <avr/wdt.h>  // soft reset
#define Reset_AVR() wdt_enable(WDTO_30MS); while(1) {}            // soft reset
#define led  9   //пин для генератора сигналов (не менять)
#define dds  10   //пин для генератора dds (не менять)
#define levo 11  //кнопка ЛЕВО(можно любой пин)
#define ok 12    //кнопка ОК(можно любой пин)
#define pravo 13 //кнопка ПРАВО(можно любой пин)
#define akb A5 //любой своюодный аналоговый пин для измерения напряжения АКБ 

#define overclock 16  //Частота на которой работает Ардуино 

//Adafruit_PCD8544 display = Adafruit_PCD8544(6, 7, 3, 4, 8);
Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 6, 7);

//clc 2, din 3,dc 4, ce 6, rst 7


//пины к которым у вас подключен дисплей
//byte cont = 20; //контрастность дисплея
byte cont ; //контрастность дисплея
byte SinU = 30; //уровень синхронизации 0 до 255
int PWM = 128;//стартовое значение ШИМ от 0 до 255
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC = 5.0; //напряжение питания, меряем мультиметром
float akb0;   //напряжение питания на момент включения
//###########################################################
int d = 0;
byte menuDDS = 4;
byte menu2DDS = 0;
byte sinM[32] = {1, 6, 15, 29, 48, 69, 92, 117, 143, 168, 191, 212, 229, 243, 251, 255, 254, 248, 237, 222, 203, 181, 156, 131, 106, 81, 59, 39, 22, 10, 3, 1};
byte trianglM[32] = {1, 15, 31, 50, 69, 86, 103, 120, 137, 154, 171, 188, 205, 222, 239, 255, 239, 223, 207, 191, 175, 159, 143, 127, 111, 95, 79, 63, 47, 31, 15, 1};
byte pilaM[32] = {1, 9, 17, 25, 33, 41, 49, 57, 65, 73, 81, 89, 97, 105, 113, 121, 129, 137, 145, 153, 161, 169, 177, 185, 193, 201, 209, 217, 225, 235, 245, 255};
byte RpilaM[32] = {254, 243, 234, 224, 216, 208, 200, 193, 185, 177, 169, 161, 153, 145, 137, 129, 121, 113, 105, 97, 89, 81, 73, 65, 57, 49, 41, 33, 25, 17, 9, 0};
byte DDS[32];
byte hag = 0;
int mnog = 0;
boolean flag = 0;
byte mass[701];
byte x = 0;
byte menu = 0; //переменная выбора меню
bool opornoe = 1; //флаг опорного напряжения
bool paus = 0; //флаг режима паузы
byte pultoskop = 0; //флаг выбора генератора или осциллографа
byte razv = 1;
unsigned long count = 0;
byte sinX = 30;
byte meaX = 83;
int Vmax = 0; // максимальное напряжение
byte sinhMASS = 0;
long countX = 0;
int prokr = 0;
int fr = 0;
int frmnog = 10;
int del = 300 * overclock / 16;
int y;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   Menu
void setup()
{
  cont = EEPROM.read(address);

  akb0 = analogRead(akb);
  display.begin();
  display.setContrast(cont);
  while (digitalRead(ok) == LOW)
  { display.clearDisplay();
    display.setCursor(0, 0);
    if (pultoskop == 0) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
    display.println("   OSILOSKOP  ");
    display.setCursor(0, 10);
    if (pultoskop == 1) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
    display.println("  PWM URETICI ");
    display.setCursor(0, 20);
    if (pultoskop == 2) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
    display.println("  DDS URETICI ");
    display.setCursor(0, 30);
    if (pultoskop == 3) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
    display.println("   KONTRAST   ");
    display.setCursor(0, 40);
    display.setTextColor(BLACK);
    display.print("Pil  =");
    display.print(akb0 * 2 * 5.0 / 1024);
    display.print("V");

    if (digitalRead(levo) == HIGH) {
      delay(del);                              //защита от дребезга
      pultoskop = pultoskop - 1;
    }
    if (digitalRead(pravo) == HIGH) {
      delay(del);                              //защита от дребезга
      pultoskop = pultoskop + 1;
    }
    if (pultoskop == 0xFF) pultoskop = 3;           //отдельное спасибо Electronik83
    if (pultoskop > 3) {
      pultoskop = 0;
    }
    delay(50);
    display.display();
  }
  if (pultoskop == 2) {
    InitTimersSafe();
    bool success = SetPinFrequencySafe(led, 200000);
  }
  if (pultoskop == 0) {
    FreqCount.begin(1000);
  }
  if (pultoskop == 1) {
    InitTimersSafe();
    bool success = SetPinFrequencySafe(led, frequency);
  }
  display.setTextColor(BLACK);
  delay(del);
}





/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   Pultoskop
void Zamer() {
  if (razv >= 6) ADCSRA = 0b11100010; //delitel 4
  if (razv == 5) ADCSRA = 0b11100011; //delitel 8
  if (razv == 4) ADCSRA = 0b11100100; //delitel 16
  if (razv == 3) ADCSRA = 0b11100101; //delitel 32
  if (razv == 2) ADCSRA = 0b11100110; //delitel 64
  if (razv < 2) ADCSRA = 0b11100111; //delitel 128
  if (razv == 0) {
    for (int i = 0; i < 700; i++) {
      while ((ADCSRA & 0x10) == 0);
      ADCSRA |= 0x10;
      //      delayMicroseconds(500);                 //спасибо, ArduinoFart
      for (int q = 1; q < 4; q++) { while ((ADCSRA & 0x10) == 0); ADCSRA |= 0x10; } mass[i] = ADCH; } } if (razv > 0) {
    for (int i = 0; i < 700; i++) {
      while ((ADCSRA & 0x10) == 0);
      ADCSRA |= 0x10;
      mass[i] = ADCH;
    }
  }

}
void setContrast()
{
  display.setContrast(cont);
  display.display();
}
void loop() {

  if (pultoskop == 0) {
    if (opornoe == 0) {
      ADMUX = 0b11100011; //выбор внутреннего опорного 1,1В
    }
    if (opornoe == 1) {
      ADMUX = 0b01100011; //Выбор внешнего опорного
    }
    delay(100);                              //защита от дребезга
    if (paus == 0) {
      Zamer();
    }
    //#######################################определение точки синхронизации
    bool flagSINHRO = 0;
    bool flagSINHRnull = 0;
    for (int y = 1; y < 255; y++) {
      if (flagSINHRO == 0) {
        if (mass[y] < SinU) { flagSINHRnull = 1; } } if (flagSINHRO == 0) { if (flagSINHRnull == 1) { if (mass[y] > SinU) {
            flagSINHRO = 1;
            sinhMASS = y;
          }
        }
      }
    }
    //#######################################определение точки синхронизации
    //максимальное значение сигнала##########################
    Vmax = 0;
    for (int y = 1; y < 255; y++) {
      if (Vmax < mass[y]) {
        Vmax = mass[y];
      }
    }
    //максимальное значение сигнала##########################
    //#######################################определение точки синхронизации
    //#######################################отрисовка графика
    if (paus == 0) {
      display.clearDisplay();
      display.fillCircle(80, 47 - SinU / 7, 2, BLACK); //рисуем уровень синхронизации
      x = 3;
      for (int y = sinhMASS; y < sinhMASS + 80; y++) {
        if (razv < 7) {
          x++;
        }
        if (razv == 7) {
          x = x + 2;
        }
        if (razv == 8) {
          x = x + 3;
        }
        display.drawLine(x, 47 - mass[y] / 7, x + 1, 47 - mass[y + 1] / 7, BLACK);
        //    display.drawLine(x + 1, 47 - mass[y] / 7 + 1, x + 2, 47 - mass[y + 1] / 7 + 1, BLACK);      //спасибо, ArduinoFart
      }
      sinhMASS = 0;
    }
    if (paus == 1) {
      display.clearDisplay();
      display.drawLine(prokr / 8, 8, prokr / 8 + 6, 8, BLACK); //шкала прокрутки
      display.drawLine(prokr / 8, 9, prokr / 8 + 6, 9, BLACK); //шкала прокрутки
      x = 3;
      for (int y = prokr; y < prokr + 80; y++) {
        if (razv < 7) { x++; } if (razv == 7) { x = x + 2; } if (razv == 8) { x = x + 3; } display.drawLine(x, 47 - mass[y] / 7, x + 1, 47 - mass[y + 1] / 7, BLACK); display.drawLine(x + 1, 47 - mass[y] / 7 + 1, x + 2, 47 - mass[y + 1] / 7 + 1, BLACK); } } //#######################################отрисовка графика for (byte i = 47; i > 5; i = i - 7) {
      display.drawPixel(0, i, BLACK);
      display.drawPixel(1, i, BLACK);
      display.drawPixel(2, i, BLACK);
    }//разметка экрана  вертикальная
    //////////////////////////////////////////////////сетка
    for (byte i = 47; i > 5; i = i - 3) {
      display.drawPixel(21, i, BLACK);
      display.drawPixel(42, i, BLACK);
      display.drawPixel(63, i, BLACK);
    }
    for (byte i = 3; i < 84; i = i + 3) {
      display.drawPixel(i, 33, BLACK);
      display.drawPixel(i, 19, BLACK);
    }
    //////////////////////////////////////////////////сетка
    //#######################################отрисовка menu
    if (menu == 0) {
      display.setCursor(0, 0);
      display.setTextColor(WHITE, BLACK);
      if (opornoe == 0) {
        display.print("1.1");
      }
      if (opornoe == 1) {
        display.print(VCC, 1);
      }
      display.setTextColor(BLACK);
      display.print(" ");
      display.print(razv);
      display.print(" P");
      if (digitalRead(levo) == HIGH) {
        delay(del);                              //защита от дребезга
        opornoe = !opornoe;
      }
      if (digitalRead(pravo) == HIGH) {
        delay(del);                              //защита от дребезга
        opornoe = !opornoe;
      }
    }
    if (menu == 1) {
      display.setCursor(0, 0);
      display.setTextColor( BLACK);
      if (opornoe == 0) {
        display.print("1.1");
      }
      if (opornoe == 1) {
        display.print(VCC, 1);
      }
      display.setTextColor(WHITE, BLACK); // 'inverted' text
      display.print(" ");
      display.print(razv);
      display.setTextColor( BLACK); // 'inverted' text
      display.print(" P");
      if (digitalRead(levo) == HIGH) {
        delay(del);                              //защита от дребезга
        razv = razv - 1;
        if (razv == 255) {
          razv = 0;
        }
      }
      if (digitalRead(pravo) == HIGH) {
        delay(del);                              //защита от дребезга
        razv = razv + 1;
        if (razv == 9) {
          razv = 8;
        }
      }
    }
    if (menu == 2) {
      display.setCursor(0, 0);
      display.setTextColor( BLACK);
      if (opornoe == 0) {
        display.print("1.1");
      }
      if (opornoe == 1) {
        display.print(VCC, 1);
      }
      display.print(" ");
      display.print(razv);
      display.setTextColor(WHITE, BLACK); // 'inverted' text
      display.print(" P");
      paus = 1;
      if (digitalRead(levo) == HIGH) {
        delay(del);                              //защита от дребезга
        prokr = prokr - 10;
        if (prokr < 0) { prokr = 0; } } if (digitalRead(pravo) == HIGH) { delay(del); //защита от дребезга prokr = prokr + 10; if (prokr > 620) {
          prokr = 620;
        }
      }
    }
    if (menu == 3) {
      prokr = 0;
      paus = 0;
      display.setCursor(0, 0);
      display.setTextColor( BLACK);
      if (opornoe == 0) {
        display.print("1.1");
      }
      if (opornoe == 1) {
        display.print(VCC, 1);
      }
      display.print(" ");
      display.print(razv);
      display.setTextColor(BLACK);
      display.print(" P");
      if (digitalRead(levo) == HIGH) {
        delay(del);                              //защита от дребезга
        SinU = SinU - 20;
        if (SinU < 20) { SinU = 20; } } if (digitalRead(pravo) == HIGH) { delay(del); //защита от дребезга SinU = SinU + 20; if (SinU > 230) {
          SinU = 230;
        }
      }
      display.fillCircle(80, 47 - SinU / 7, 5, BLACK);
      display.fillCircle(80, 47 - SinU / 7, 2, WHITE);
    }
    if (digitalRead(ok) == HIGH) {
      delay(del);                              //защита от дребезга
      menu++;  //перебор меню
      if (menu == 4) {
        menu = 0;
        paus = 0;
      }
    }
    if (FreqCount.available()) {
      count = FreqCount.read(); //вывод частоты по готовности счетчика
    }
    //#######################################частоты сигнала
    byte Frec1 = 0;
    long Frec = 0;
    bool flagFrec1 = 0;
    bool flagFrec2 = 0;
    bool flagFrec3 = 0;
    for (int y = 1; y < 255; y++) {
      if (flagFrec1 == 0) {
        if (mass[y] < SinU) { flagFrec2 = 1; } } if (flagFrec1 == 0) { if (flagFrec2 == 1) { if (mass[y] > SinU) {
            flagFrec1 = 1;
            Frec1 = y;
          }
        }
      }
      if (flagFrec1 == 1) {
        if (mass[y] < SinU) { flagFrec3 = 1; } } if (flagFrec3 == 1) { if (mass[y] > SinU) {
          if (razv >= 6) Frec = 1000000 / ((y - Frec1 - 1) * 3.27); //delitel 4
          if (razv == 5) Frec = 1000000 / ((y - Frec1) * 3.27) / 2; //delitel 8
          if (razv == 4) Frec = 1000000 / ((y - Frec1) * 3.27) / 4; //delitel 16
          if (razv == 3) Frec = 1000000 / ((y - Frec1) * 3.27) / 8; //delitel 32
          if (razv == 2) Frec = 1000000 / ((y - Frec1) * 3.27) / 16; //delitel 64
          if (razv == 1) Frec = 1000000 / ((y - Frec1) * 3.27) / 32; //delitel 128
          if (razv == 0) Frec = 1000000 / ((y - Frec1) * 3.27) / 128; //спасибо, ArduinoFart
          flagFrec1 = 0; flagFrec3 = 0;
        }
      }
    }
    //#######################################частоты сигнала
    display.setTextColor( BLACK);
    if (opornoe == 1) {
      if ((Vmax * VCC / 255) > 2.5) {
        countX = count * (overclock / 16.0);
      }
      if ((Vmax * VCC / 255) < 2.5) {
        countX = Frec * (overclock / 16.0);
      }
    }
    if (opornoe == 0) {
      countX = Frec * (overclock / 16.0);
    }
    if (countX < 1000) { display.print(" "); display.print(countX); display.print("Hz"); } if (countX >= 1000) {
      float countXK = countX / 1000.0;
      display.print(countXK, 1);
      display.print("KHz");
    }
    if (opornoe == 1) {
      display.setCursor(0, 40); display.setTextColor(BLACK);
      display.print(Vmax * VCC / 255, 1);
    }
    if (opornoe == 0) {
      display.setCursor(0, 40); display.setTextColor(BLACK);
      display.print(Vmax * 1.1 / 255, 1);
    }
    display.print("V");
    //#######################################отрисовка menu
    display.display();
  }
  if (pultoskop == 1) Generator();
  if (pultoskop == 2) DDSGenerator();
  if (pultoskop == 3) TTL();
  if (digitalRead(pravo) == HIGH && digitalRead(levo) == HIGH) {
    Reset_AVR();                                                                    // soft reset выход в глакное меню
  }
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   PWM
//#######################################режим ренератора
void Generator() {
  display.clearDisplay();
  if (flag == 0) {                             //флаг выборов режима настройки ШИМ или Частоты
    if (digitalRead(levo) == HIGH) {
      delay(del);                              //защита от дребезга
      frequency = frequency - mnog;
      if (frequency < 0) frequency = 0;
      bool success = SetPinFrequencySafe(led, frequency);
    }
    if (digitalRead(pravo) == HIGH) {
      delay(del);                              //защита от дребезга
      frequency = frequency + mnog;
      bool success = SetPinFrequencySafe(led, frequency);
    }
  }
  if (flag == 1) {                            //флаг выборов режима настройки ШИМ или Частоты
    if (digitalRead(levo) == HIGH) {
      delay(del);                             //защита от дребезга
      PWM = PWM - 2, 56;
      if (PWM < 0) PWM = 255; } if (digitalRead(pravo) == HIGH) { delay(del); //защита от дребезга PWM = PWM + 2, 56; if (PWM > 255) PWM = 0;
    }
  }
  if (digitalRead(ok) == HIGH) {               //переключение разряда выбора частоты
    delay(del);                              //защита от дребезга
    hag++;
    if (hag >= 5) hag = 0;
  }
  ////////////
  display.setTextSize(1);                      // вывод знвчения PWM
  display.setCursor(0, 20);
  display.print("PWM ");
  display.print(PWM * 100.0 / 256);
  display.print(" %");

  frmnog = 0;
  display.drawLine(frmnog + 0, 0, frmnog + 13 * PWM / 256.0, 0, BLACK);                               // PWM анимация 1 пульс
  display.drawLine(frmnog + 0, 14, frmnog + 13, 14, BLACK);
  display.drawLine(frmnog + 0, 14, frmnog + 13 * PWM / 256.0, 14, WHITE);
  display.drawLine(frmnog + 13 * PWM / 256.0, 0, frmnog + 13 * PWM / 256.0, 14, BLACK);

  frmnog = 14;
  if (PWM > 0) display.drawLine(frmnog - 1 , 0, frmnog - 1, 14, BLACK);                                            // PWM анимация 1 подъём
  display.drawLine(frmnog + 0, 0, frmnog + 13 * PWM / 256.0, 0, BLACK);                               // PWM анимация 2 пульс
  display.drawLine(frmnog + 0, 14, frmnog + 13, 14, BLACK);
  display.drawLine(frmnog + 0, 14, frmnog + 13 * PWM / 256.0, 14, WHITE);
  display.drawLine(frmnog + 13 * PWM / 256.0, 0, frmnog + 13 * PWM / 256.0, 14, BLACK);

  frmnog = 28;
  if (PWM > 0) display.drawLine(frmnog - 1 , 0, frmnog - 1, 14, BLACK);                                            // PWM анимация 2 подъём
  display.drawLine(frmnog + 0, 0, frmnog + 13 * PWM / 256.0, 0, BLACK);                               // PWM анимация 3 пульс
  display.drawLine(frmnog + 0, 14, frmnog + 13, 14, BLACK);
  display.drawLine(frmnog + 0, 14, frmnog + 13 * PWM / 256.0, 14, WHITE);
  display.drawLine(frmnog + 13 * PWM / 256.0, 0, frmnog + 13 * PWM / 256.0, 14, BLACK);

  if (PWM == 0) {
    display.drawLine(1, 0, 28, 0, WHITE);                                                               // PWM анимация 0%
    frmnog = 14;
    display.drawLine(frmnog + 13 * PWM / 256.0, 0, frmnog + 13 * PWM / 256.0, 14, WHITE);
    frmnog = 28;
    display.drawLine(frmnog + 13 * PWM / 256.0, 0, frmnog + 13 * PWM / 256.0, 14, WHITE);
    display.drawLine(1, 14, 28, 14, BLACK);
  }

  display.setCursor(50, 0);                    // вывод знвчения частоты Hz
  display.setTextSize(1);
  long frequencyX = frequency * (overclock / 16.0);
  if (frequencyX < 1000) { display.print(frequencyX); display.setCursor(50, 10); display.println("Hz"); } if (frequencyX > 1000) {
    if (frequencyX < 10000) { display.setCursor(50, 0); // вывод знвчения частоты kHz display.print((frequencyX / 1000.0), 3); display.setCursor(50, 10); display.println("KHz"); } } if (frequencyX >= 10000) {
    if (frequencyX < 100000) { display.setCursor(50, 0); display.print((frequencyX / 1000.0), 2); display.setCursor(50, 10); display.println("KHz"); } } if (frequencyX >= 100000) {
    display.setCursor(50, 0);
    display.print((frequencyX / 1000.0), 1);
    display.setCursor(50, 10);
    display.println("KHz");
  }
  display.setCursor(70, 40);
  display.print("+>");
  display.setCursor(0, 40);
  display.print("<- "); if (hag == 0) { //выбор множителя частоты display.print(" "); display.print(1 * (overclock / 16.0), 1); display.print("Hz"); mnog = 1; flag = 0; } if (hag == 1) { //выбор множителя частоты display.print(" "); display.print(10 * (overclock / 16.0), 0); display.print("Hz"); mnog = 10; } if (hag == 2) { //выбор множителя частоты display.print(" "); display.print(100 * (overclock / 16.0), 0); display.print("Hz"); mnog = 100; } if (hag == 3) { //выбор множителя частоты display.print(" "); display.print(1000 * (overclock / 16.0), 0); display.print("Hz"); mnog = 1000; } if (hag == 4) { //выбор PWM display.print(" "); display.print(PWM * 100.0 / 256); display.print("%"); flag = 1; } pwmWrite(led, PWM); display.display(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// DDS void DDSGenerator() { if (digitalRead(pravo) == HIGH) { //переход по меню вверх delay(del); menuDDS = menuDDS + 1; } if (digitalRead(levo) == HIGH) { //переход по меню вниз delay(del); menuDDS = menuDDS - 1; } if (menuDDS == 0xFF) menuDDS = 4; //отдельное спасибо Electronik83 if (menuDDS == 5) { menuDDS = 0; } if (digitalRead(ok) == HIGH) { //определение флага входа в подменю общий delay(del); menuDDS = menuDDS + 10; } if (menuDDS == 14) { //вход в подменю Frequency Frequency(); } if (menuDDS > 9) {                    //вход в подменю функций
    DDSmenu();
  }
  double t;                                                                 //определение переменной периода DDS
  t = 32 * (fr * pow(10, -6) + (1.0 / 19424)) / (overclock / 16.0);         // расчёт периода DDS через delayMicroseconds(fr)
  display.clearDisplay();
  display.setCursor(0, 0);
  if (menuDDS == 0) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);     // переход по главному меню DDS
  display.println("    SINUS     ");
  display.setCursor(0, 10);
  if (menuDDS == 1) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
  display.println("    UCGEN     ");
  display.setCursor(0, 20);
  if (menuDDS == 2) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
  display.println("   TESTERE    ");
  display.setCursor(0, 30);
  if (menuDDS == 3) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
  display.println("  TESTERE V2");
  display.setCursor(0, 40);
  if (menuDDS == 4) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
  display.println(" Freq ");
  display.print(1 / t, 1);
  display.print(" Hz");
  display.display();
}
void DDSmenu()                               // подменю отдельные функции (кроме Frequency), которые выбраны в главном меню DDS
{ if (menuDDS == 10) DDS[x] = sinM[x];
  if (menuDDS == 11) DDS[x] = trianglM[x];
  if (menuDDS == 12) DDS[x] = pilaM[x];
  if (menuDDS == 13) DDS[x] = RpilaM[x];
  while (digitalRead(ok) == LOW)
  { double t;                                                                 //определение переменной периода DDS
    t = 32 * (fr * pow(10, -6) + (1.0 / 19424)) / (overclock / 16.0);         // расчёт периода DDS через delayMicroseconds(fr)                                                     // расчёт частоты DDS
    display.clearDisplay();
    for (int x = 0; x < 32; x ++) { if (menuDDS == 10) DDS[x] = sinM[x]; if (menuDDS == 11) DDS[x] = trianglM[x]; if (menuDDS == 12) DDS[x] = pilaM[x]; if (menuDDS == 13) DDS[x] = RpilaM[x]; y = DDS[x]; display.drawPixel(x * 19 / 32 + 20, 15 - y * 14 / 255, BLACK); //прорисовка графика функции 1-й период display.drawPixel(x * 19 / 32 + 39, 15 - y * 14 / 255, BLACK); //прорисовка графика функции 2-й период if (menuDDS > 11) display.drawLine(39, 16, 39, 2, BLACK);             //прорисовка вертикальной линии для пилы
    }

    display.drawLine(20, 17, 20, 1, BLACK);  // координатная сетка, ось Y
    display.drawLine(20, 0, 18, 2, BLACK);   // координатная сетка, ось Y стрелка
    display.drawLine(20, 0, 22, 2, BLACK);   // координатная сетка, ось Y стрелка
    display.drawLine(18, 16, 61, 16, BLACK); // координатная сетка, ось X
    display.drawLine(61, 16, 59, 14, BLACK); // координатная сетка, ось X стрелка
    display.drawLine(61, 16, 59, 18, BLACK); // координатная сетка, ось X стрелка

    display.setTextColor(BLACK);             //вывод информации на экран подменю функций
    display.setCursor(0, 0);
    display.print("Vpp");
    display.setCursor(0, 10);
    display.print("5V");
    display.setCursor(60, 10);
    display.print(" t");
    display.setCursor(20, 20);
    if (menuDDS == 10) display.println(" SINUS ");      //вывод названия функции на экран подменю
    if (menuDDS == 11) display.println("UCGEN ");
    if (menuDDS == 12) display.println(" TESTERE ");
    if (menuDDS == 13) display.println("TESTERE V2");
    display.setCursor(0, 30);
    display.print("F= ");
    display.print(1 / t, 1);                 //вывод частоты функции на экран подменю
    display.print(" Hz");
    display.setCursor(0, 40);
    display.print("t= ");
    display.print(t * 1000, 2);              //вывод периода функции на экран подменю
    display.print(" ms");
    display.display();

    while (digitalRead(ok) == LOW) {
      pwmWrite(dds, DDS[d]);                 // активация выхода DDS
      delayMicroseconds(fr + 1);
      d++;
      if (d == 32) {
        d = 0;
      }
    }
  }
  delay(del);
  menuDDS = menuDDS - 10;                    // возвращение в DDS меню из подменю
}

void Frequency()                             // DDS подменю Frequency - настройка частоты сигнала
{ while (digitalRead(ok) == LOW)
  { double t;                                                                 //определение переменной периода DDS
    t = 32 * (fr * pow(10, -6) + (1.0 / 19424)) / (overclock / 16.0);         // расчёт периода DDS через delayMicroseconds(fr)
    display.clearDisplay();
    display.setTextColor(BLACK);
    display.setCursor(0, 0);
    display.println("DDS 1..");
    display.print((overclock / 16.0) * 607, 0);   // 605 Hz знвчение максимальной частоты на кварце 16МГц
    display.println("Hz");
    display.setCursor(20, 10);                    // вывод знвчения частоты Hz
    display.println("Aktuell:");
    display.setCursor(0, 20);
    display.println("F=");
    display.print(1 / t, 1);                      //вывод частоты функции на экран подменю
    display.println(" Hz");
    display.setCursor(0, 30);
    display.println("t=");
    display.print(1000 * t, 2);                   //вывод периода функции на экран подменю
    display.println(" ms");
    display.setCursor(70, 40);
    display.print("+>");
    display.setCursor(0, 40);
    display.print("<- Frequenz");

    if (digitalRead(pravo) == HIGH) {          // изменение частоты сигнала +/- frmnog
      delay(del);                              //защита от дребезга
      fr = fr - frmnog;
    }
    if (digitalRead(levo) == HIGH) {
      delay(del);                              //защита от дребезга
      fr = fr + frmnog;
    }
    if (fr < 0) fr = 1000; if (fr > 21000) frmnog = 10000;            //разные множители для изменения частоты сигнала, подобранные из личного опыта
    if (fr < 16000) frmnog = 1000;
    if (fr < 11000) frmnog = 500;
    if (fr < 8100)  frmnog = 400;
    if (fr < 5100)  frmnog = 170;
    if (fr < 2100)  frmnog = 100;
    if (fr < 1100)  frmnog = 64;
    if (fr < 1100)  frmnog = 32;
    if (fr < 810)   frmnog = 16;
    if (fr < 510)   frmnog = 8;
    if (fr < 410)   frmnog = 4;
    if (fr < 310)   frmnog = 2;
    if (fr < 160) frmnog = 1; display.display(); } menuDDS = menuDDS - 10; // возвращение в DDS меню delay(del); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TTL void TTL() { // cont= map(value,0,255,10,80); setContrast(); display.setTextSize(1); display.clearDisplay(); display.setTextColor(WHITE, BLACK); display.setCursor(0, 0); display.print(" KONTRAST "); display.drawFastHLine(0, 10, 83, BLACK); display.setTextColor(BLACK, WHITE); display.setCursor(25, 15); display.print("DEGERI"); display.setTextSize(2); display.setCursor(5, 25); display.print("-"); display.setCursor(30, 25); display.print(cont); display.setCursor(70, 25); display.print("+"); display.display(); if (digitalRead(pravo) == HIGH) { delay(del); //защита от дребезга cont = cont + 1; if (cont > 80) {
      cont = 10;
    }
    setContrast();
  }
  if (digitalRead(levo) == HIGH) {
    delay(del);                              //защита от дребезга
    cont = cont - 1;
    if (cont < 10) {
      cont = 80;
    }
    setContrast();
  }

  EEPROM.write(address, cont);
  delay(del);                              //защита от дребезга
  display.display();
}
/////////////////////TTL

Gerekli Kütüphaneler

 

link

 

Boş zamanlarda arduino ile uğraşan kendi halinde bir Öğretmen.

Bir Cevap Yazın

Time limit is exhausted. Please reload CAPTCHA.