Пультоскоп на Arduino 27МГц!!!

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Sasha80 пишет:

bodriy2014 фото обещаю!

Планирую делитель на постоянной основе. Есть резистор на 100К и в пару к нему 10К (9,85). Подскажи пожалуйста как изменить формулы (сам боюсь ошибиться). Это те же строки я полагаю? display.print((analogRead(akb)*VCC/1024)*3.11);

множитель только 3,11 нужно будет подобрать, правильно я понимаю? Если так, то это не сложно, Там и другие строчки я видел с Vcc, там не знаю как менять.

----Строку display.print((analogRead(akb)*VCC/1024)*3.11); не трогайте она к щупу не имеет ни какого отношения, она измеряет АКБ!

---Коэффициент делителя: 11.15

   менять строки display.print(Vmax*VCC/255,1); на display.print(Vmax*VCC/255*11.15,1);

   менять строки display.print(Vmax*1.1/255,1); на display.print(Vmax*1.1/255*11.15,1);

Эти строки выводят на дисплей максимальное напряжение при измерении.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Подскажи, а где поменять отображение графига. Мерел батарейку, вольты точно показывает. Линия графика как в анекдоте - низенько, низенько! И вот еще, через УСБ когда подключаю, напряжение в меню 4,5В, мультиметр говорит 5.02В. Тоже может где строчки подправить. 11.15 Подставил в двух местах.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Sasha80 пишет:

Подскажи, а где поменять отображение графига. Мерел батарейку, вольты точно показывает. Линия графика как в анекдоте - низенько, низенько! И вот еще, через УСБ когда подключаю, напряжение в меню 4,5В, мультиметр говорит 5.02В. Тоже может где строчки подправить. 11.15 Подставил в двух местах.

---График расчитан так что показывает весь диапазон замера АЦП, вам или дисплей нужен крупнее или делителей несколько делать, чтоб под разные напряжения можно было все рассмотреть.

---когда питаете от ЮСБ опорное напряжение уже другое вот и показывает не правду, вы определитесь от чего питать будете, это напряжение и пропишите в VCC/

Sasha80
Offline
Зарегистрирован: 18.01.2016

Выполнил все рекомендации! Значит делитель на щуп примерно 1:3 (100К и 47К), как то так. Кварц перепаял на 27МГц большой такой корпус,  заземлил на GND. Все собрано на макетки, поэтому внутри фото не делал, ничего особенного. После обкатки печатку разведу под корпус.  Вот собственно и фото! Тумлер включения сбоку, диод для подсветки снизу, наверху с торца джек для генераторов, красная кнопка - ресет. Значения состояния фонарика и подсветка сохраняются в ЕПРОМ после перезагрузки.

СКЕТЧ.

//Страница проэкта  http://srukami.inf.ua/pultoscop_v25110.html
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <FreqCount.h> 
#include <EEPROM.h>
#include <PWM.h>
#include <CyberLib.h>
#define led  9   //пин для генератора сигналов (не менять)
#define dds  10   //пин для генератора dds (не менять)

//--------------пользовательские настройки-----------------//
//###########################################################
// #define power 8 //пин который опрашивает кнопку включения
// #define OFF 14  //пин который управляет ключем питания
// #define  timepowerON 50 //время удержания кнопки выключения

Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 6, 7);//пины к которым у вас подключен дисплей 
#define overclock 27     //Частота на которой работает Ардуино  
#define levo   11        //кнопка ЛЕВО(можно любой пин)
#define ok     12        //кнопка ОК(можно любой пин)
#define pravo  13        //кнопка ПРАВО(можно любой пин)
#define ledPin 8         //выход на контакт фонарика
#define LCDPin A2        //выход на контакт подсветки LCD
#define akb A3           //любой свободный аналоговый пин для измерения напряжения АКБ через резистор 10К      
byte cont=55;            //контрастность дисплея
byte SinU=30;            //уровень синхронизации 0 до 255 
int PWM = 128;           //стартовое значение ШИМ от 0 до 255        
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=5.05;          //напряжение питания, меряем мультиметром
//###########################################################

int d=0;
byte menuDDS=0; 
byte menuLight=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 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]={250,246,238,230,222,214,206,198,190,182,174,166,158,150,142,134,126,118,110,102,94,86,78,70,62,54,41,33,25,17,9,1};
byte trianglM[32]={1,18,35,52,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};
//int powerON=0;//состояние кнопки питания
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=6;  
unsigned long count =0;
byte sinX=30; 
byte meaX=83;
int Vmax=0;// максимальное напряжение 
byte sinhMASS=0;
long countX=0;
int prokr=0;

int LCDOnOff;
int LEDOnOff;


void setup(){
display.begin();
display.setContrast(cont);  

pinMode(LCDPin, OUTPUT);  // подсветка дисплея
pinMode(ledPin, OUTPUT);  // фонарик
     
//digitalWrite(OFF,HIGH);//включем питание 
//Serial.begin(9600);

while(digitalRead(ok)==LOW){  

LCDOnOff = EEPROM.read(0);
LEDOnOff = EEPROM.read(1);

if(LCDOnOff == 1){analogWrite(A2, 0);}
if(LCDOnOff == 0){analogWrite(A2, 255);}

if(LEDOnOff == 1){digitalWrite(8, HIGH);}
if(LEDOnOff == 0){digitalWrite(8, LOW);}

/////////////////////////////////////////удержание кнопки отключения
//if(digitalRead(power)==HIGH){powerON++;delay(10);}  
//if(powerON>=timepowerON){digitalWrite(OFF,LOW);}///отключаем питание
/////////////////////////////////////////удержание кнопки отключения 
  if(pultoskop==0){
    display.clearDisplay();
    display.setCursor(10,0);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println("Осцилограф");
    display.setCursor(10,10);
    display.setTextColor(BLACK); 
    display.println("Генератор");
    display.setCursor(10,20);
    display.println("DDSгенератор");
    display.setCursor(10,30);
    display.println("Подсветка");
    display.setCursor(0,40);
    display.print("Батарея  ");
    display.print((analogRead(akb)*VCC/1024)*3.13);
    display.print("v");    
  }
    if(pultoskop==1){
    display.clearDisplay();
    display.setCursor(10,0);
    display.setTextColor(BLACK); // 'inverted' text
    display.println("Осцилограф");
    display.setCursor(10,10);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println("Генератор");
    display.setTextColor(BLACK); // 'inverted' text;
    display.setCursor(10,20);
    display.println("DDSгенератор");
    display.setCursor(10,30);
    display.println("Подсветка");
    display.setCursor(0,40);
    display.setTextColor(BLACK); 
    display.print("Батарея  ");
    display.print((analogRead(akb)*VCC/1024)*3.13);
    display.print("v");   
  } 
    if(pultoskop==2){
    display.clearDisplay();
    display.setCursor(10,00);
    display.setTextColor(BLACK); // 'inverted' text
    display.println("Осцилограф");
    display.setCursor(10,10);
    display.println("Генератор");
    display.setTextColor(WHITE, BLACK); // 'inverted' text;
    display.setCursor(10,20);
    display.println("DDSгенератор");
    display.setTextColor(BLACK);
    display.setCursor(10,30);
    display.println("Подсветка");
    display.setCursor(0,40);
    display.setTextColor(BLACK); 
    display.print("Батарея  ");
    display.print((analogRead(akb)*VCC/1024)*3.13);
    display.print("v");   
    }
        if(pultoskop==3){
    display.clearDisplay();
    display.setCursor(10,00);
    display.setTextColor(BLACK); // 'inverted' text
    display.println("Осцилограф");
    display.setCursor(10,10);
    display.println("Генератор");
    display.setTextColor(BLACK);
    display.setCursor(10,20);
    display.println("DDSгенератор");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,30);
    display.println("Подсветка");
    display.setCursor(0,40);
    display.setTextColor(BLACK); 
    display.print("Батарея  ");
    display.print((analogRead(akb)*VCC/1024)*3.13);
    display.print("v"); 
    }
if(digitalRead(pravo)==HIGH){delay(300);pultoskop=pultoskop-1;}
 //if(pultoskop<0){pultoskop=3;}
if(digitalRead(levo)==HIGH){delay(300);pultoskop=pultoskop+1;}
 //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(500); } 


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);
          mass[i]=ADCH;
      }
  }
  if (razv>0){
      for(int i=0;i<700;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          mass[i]=ADCH;
      }
  }  
}



void loop() {
LCDOnOff = EEPROM.read(0);
LEDOnOff = EEPROM.read(1);

if(LCDOnOff == 1){analogWrite(A2, 0);}
if(LCDOnOff == 0){analogWrite(A2, 255);}

if(LEDOnOff == 1){digitalWrite(8, HIGH);}
if(LEDOnOff == 0){digitalWrite(8, LOW);}
      
/////////////////////////////////////////удержание кнопки отключения
//if(digitalRead(power)==HIGH){powerON++;delay(10);}  
//if(powerON>=timepowerON){digitalWrite(OFF,LOW);}   //отключаем питание
/////////////////////////////////////////удержание кнопки отключения  
  
if(pultoskop==0){  
if(opornoe==0){ADMUX = 0b11100001;}//выбор внутреннего опорного 1,1В и номер аналогового входа (0b11100011, А3)(0b11100100, A4) (0b11100001, A1)
if(opornoe==1){ADMUX = 0b01100001;}//Выбор внешнего опорного (0b01100011, А3)(0b01100100, A4) (0b01100001, A1)
delay(5);
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);        
}
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) {opornoe=!opornoe;}
    if(digitalRead(pravo)==HIGH){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){razv=razv-1;if(razv==255){razv=0;}}
    if(digitalRead(pravo)==HIGH){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){prokr=prokr-10;if(prokr<0){prokr=0;}}
    if(digitalRead(pravo)==HIGH){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){SinU=SinU-20;if(SinU<20){SinU=20;}}
    if(digitalRead(pravo)==HIGH){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){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==2){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
  if (razv==1){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
  if (razv==0){Frec=1000000/((y-Frec1)*500);}//delitel 128
  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*3.25, 1);}                                    //!!!!!!!!!!!! коэффициент делителя щупа осцилографа
if(opornoe==0){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*1.1/255*3.25, 1);}                                   //!!!!!!!!!!!!  коэффициент делителя щупа осцилографа
display.print("V");
//#######################################отрисовка menu
delay(200);  
display.display();
}
if(pultoskop==1){Generator();}
if(pultoskop==2){DDSGenerator();}
if(pultoskop==3){Light();}
}



//#######################################режим ренератора
void Generator(){
display.clearDisplay();  
if (flag==0){//флаг выборов режима настройки ШИМ или Частоты
            if(digitalRead(levo)==HIGH){
              frequency=frequency-mnog;
              if(frequency<0){frequency=0;}
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }
            if(digitalRead(pravo)==HIGH){
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }  
}
if (flag==1){//флаг выборов режима настройки ШИМ или Частоты
            if(digitalRead(levo)==HIGH){
              PWM=PWM-1;
              if(PWM<0){PWM=255;} 
              delay(3);//защита от дребезга
            
            }
            if(digitalRead(pravo)==HIGH){
              PWM=PWM+1;
              if(PWM>255){PWM=0;} 
              delay(3);//защита от дребезга 
            }  
}      
if(digitalRead(ok)==HIGH){//переключение разряда выбора частоты 
  delay(3);//защита от дребезга
  hag++;
  if(hag>=5){hag=0;}
} 
////////////
display.setTextSize(1);
display.setCursor(0,5);
display.print("PWM=");
display.print(PWM*100.0/255);
display.print(" %");
display.drawLine(0,0,83*PWM/255.0,0, BLACK);
display.drawLine(0,1,83*PWM/255.0,1, BLACK);
display.drawLine(0,2,83*PWM/255.0,2, BLACK);
display.drawLine(0,15,83*PWM/255.0,15, BLACK);
display.drawLine(0,16,83*PWM/255.0,16, BLACK);
display.drawLine(0,17,83*PWM/255.0,17, BLACK);
///////////    
 display.setCursor(5,20);
 display.setTextSize(2);
long frequencyX=frequency*(overclock/16.0);
if(frequencyX<1000){display.print(frequencyX);display.setTextSize(1);display.println("Hz");}
if(frequencyX>1000){if(frequencyX<10000){display.print((frequencyX/1000.0),2);display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=10000){if(frequencyX<100000){display.print((frequencyX/1000.0),1);display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=100000){display.print((frequencyX/1000.0),0);display.setTextSize(1);display.println("KHz");}
display.setCursor(0,40);
display.setTextSize(1);
display.print(">>X ");    
      if(hag==0){//выбор множителя частоты
        
          display.print(1*(overclock/16.0),1); 
          mnog=1;
          flag=0;
      }
      if(hag==1){//выбор множителя частоты
          display.print(10*(overclock/16.0),0); 
          mnog=10;
      }
      if(hag==2){//выбор множителя частоты
          display.print(100*(overclock/16.0),0); 
          mnog=100;
      }
      if(hag==3){//выбор множителя частоты
          display.print(1000*(overclock/16.0),0); 
          mnog=1000;
      } 
      if(hag==4){//выбор  PWM
          display.print("PWM ");
          display.print(PWM*100.0/255);
          display.print("%"); 
          flag=1;
      } 
display.print("<<");        
pwmWrite(led, PWM);
delay(300);  
display.display();
}

/////////////////////Генератор DDS
void DDSGenerator(){
int fr=10;
if(menuDDS==0){
    display.clearDisplay(); 
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setCursor(10,20);
    display.println("Пила");
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    display.setCursor(0,40);
    //display.print("Частота=");
    //display.print(57);
    //display.print("Гц"); 
    delay(100);  
    display.display();
    while(D11_Read==LOW){
      PWM=sinM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
    delay(200);}
if(menuDDS==1){
    display.clearDisplay(); 
    display.setTextColor(BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setTextColor(BLACK);
    display.setCursor(10,20);
    display.println("Пила");
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    //display.setCursor(0,40);
    //display.print("Частота=");
   // display.print(57);
    //display.print("Гц");
    delay(100);  
    display.display();
    while(D11_Read==LOW){
      PWM=trianglM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
    delay(200);}
if(menuDDS==2){
    display.clearDisplay(); 
    display.setTextColor(BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,20);
    display.println("Пила");
    display.setTextColor(BLACK);
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    //display.setCursor(0,40);
    //display.print("Частота=");
   // display.print(57);
    //display.print("Гц");
    delay(100);  
    display.display();
    while(D11_Read==LOW){
      PWM=pilaM[d];
      pwmWrite(dds,PWM);
     // delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
    delay(200);}
if(menuDDS==3){
    display.clearDisplay(); 
    display.setTextColor(BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setTextColor(BLACK);
    display.setCursor(10,20);
    display.println("Пила");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    //display.setCursor(0,40);
    //display.print("Частота=");
   // display.print(57);
   // display.print("Гц");
    delay(100);  
    display.display();
    while(D11_Read==LOW){
      PWM=RpilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
    delay(200);}
if(menuDDS==4){menuDDS=0;}
}
/////////////////////Генератор DDS

/////////////////////Меню Light
void Light(){
int fr=10;
  if(menuLight==0){
    display.clearDisplay();
    display.setCursor(3,5);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println("Подсветка LCD");
    display.setCursor(22,16);
    display.setTextColor(BLACK); 
    display.println("Фонарик");
    
    display.setCursor(0,40);
    display.print("Батарея  ");
    display.print((analogRead(akb)*VCC/1024)*3.13);
    display.print("v");    
  }
    if(menuLight==1){
    display.clearDisplay();
    display.setCursor(3,5);
    display.setTextColor(BLACK); // 'inverted' text
    display.println("Подсветка LCD");
    display.setCursor(22,16);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println("Фонарик");
    display.setTextColor(BLACK); // 'inverted' text;
    
    display.setCursor(0,40);
    display.setTextColor(BLACK); 
    display.print("Батарея  ");
    display.print((analogRead(akb)*VCC/1024)*3.13);
    display.print("v");   
  } 
    
if(digitalRead(ok)==HIGH){delay(150);menuLight=menuLight+1;}
if(menuLight>1){menuLight=0;}

if((menuLight==0)&&(digitalRead(pravo)==HIGH))    LCDOnOff=1;
else if((menuLight==0)&&(digitalRead(levo)==HIGH))LCDOnOff=0;
EEPROM.write(0, LCDOnOff); 

if((menuLight==1)&&(digitalRead(pravo)==HIGH))    LEDOnOff=1;
else if((menuLight==1)&&(digitalRead(levo)==HIGH))LEDOnOff=0;
EEPROM.write(1, LEDOnOff); 

delay(100);   
display.display(); }
/////////////////////Меню Light


 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Sasha80 отлично получилось, настоящий пультоскоп в пульте!

Вы часом  фотографией профессионально не занимаетесь?

Уж очень постановка кадра и качество фото не похоже на любительское.

Sasha80
Offline
Зарегистрирован: 18.01.2016

:)   Прямо в точку! Фотограф! Радиоэлектроникой занимаюсь исключительно из интереса. Спасибо есть отзывчивые люди, помогают! 

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

Sasha80, ну супер получилось всё! И, кстати, хотя это было не мне, но скажу Спасибо тем, кто помогал - это ожень важно и приятно. Возможно, как базу себе возьму именно Ваш скетч, поскольку там и генераторы, и фонарик, всё есть. DDS работает, всё хорошо? И, вопрос - LCD подсветка и фонарик, это sub-menu?

lexdi
lexdi аватар
Offline
Зарегистрирован: 20.12.2016

Sasha80 пишет:

Значит делитель на щуп примерно 1:3 (100к и 47к)

Это вроде как 1:2 делитель! или что то поменялось?

Sasha80
Offline
Зарегистрирован: 18.01.2016

Идея влепить фонарик принадлежит lexdi я немного подравнял скетч, чтоб при выходе из субменю освещения (в скетче это перезагрузка), настройки сохранялись. В этом меню центральная кнопка перемещает выбор, а крайние это ВКЛ И ВЫКЛ. DDS не проверял. 

 

 

Sasha80
Offline
Зарегистрирован: 18.01.2016

Значит делитель на щуп примерно 1:3 (100к и 47к)

Это вроде как 1:2 делитель! или что то поменялось?

 

Я не так выразился может. На выходе третья часть от входного напряжения, разве не так?

lexdi
lexdi аватар
Offline
Зарегистрирован: 20.12.2016

Sasha80 пишет:

Значит делитель на щуп примерно 1:3 (100к и 47к)

Это вроде как 1:2 делитель! или что то поменялось?

 

Я не так выразился может. На выходе третья часть от входного напряжения, разве не так?

да одна треть.

 

Sasha80
Offline
Зарегистрирован: 18.01.2016

Вот обнаружил проблемку, чет наверно недоделал! На развертках от 0 до 5 все Ок. Начиная от 6 и выше какой то шум, и 16,5 вольт показывает, хотя ничего не подключено. При подключении щупа ничего не меняется, все таже картина. Что не так?

lexdi
lexdi аватар
Offline
Зарегистрирован: 20.12.2016

похоже что то в скетче или в библеотеке.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Кварц не может быть причиной, или то что все на макетке? (Макетку купал)

lexdi
lexdi аватар
Offline
Зарегистрирован: 20.12.2016

залейте оригинальный скейтч для сравнения, если останется также то будем искать. Кварц или работает или не работает.

lexdi
lexdi аватар
Offline
Зарегистрирован: 20.12.2016

Sasha80 пишет:

Значит делитель на щуп примерно 1:3 (100к и 47к)

Это вроде как 1:2 делитель! или что то поменялось?

 

Я не так выразился может. На выходе третья часть от входного напряжения, разве не так?

я всётаки ошибся, это делитель 1:3, и он выдаёт треть уровня как и должен, что то голова совсем не варит.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Вобщем с кварцем 8Мгц  работает но медленно, перепаиваю 27Мгц опять этот глюк.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Sasha80 пишет:

Вобщем с кварцем 8Мгц  работает но медленно, перепаиваю 27Мгц опять этот глюк.

Попробуйте увеличить питание до 5.5В не больше!!!

Если не заведется-Пробуйте меньше кварцы 25МГц или 20МГц.

Эти МК счас Китайцы клепают и идет сильный разброс характеристик. У меня некоторые и на 32МГц работали.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Нашел у себя такой 17.734476  Для проверки если его воткнуть, должен завестись?  С дробным значением частоты будет работать, если да то что в скетче прописывать? Округлять?

lexdi
lexdi аватар
Offline
Зарегистрирован: 20.12.2016

на видеокартах стоит 27мГц.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Sasha80 пишет:

Вот обнаружил проблемку, чет наверно недоделал! На развертках от 0 до 5 все Ок. Начиная от 6 и выше какой то шум, и 16,5 вольт показывает

Проблема с этими развертками тут уже обсуждалась. Были даны ряд рекомендаций по ее обходу. Но мне лично это не помогло на двух экземплярах МК из разных партий. Пришел к выводу, что кварц быстрее 20 мгц (предельная паспортная частота этого МК) ставить не стоит, если желаете сохранить полный функционал. Свой экземпляр переделал соответственно так же. Разгон действительно дает некоторый выигрыш, Автор тут прав совершенно, но он не столь уж велик, по моему мнению. Но это вопрос предпочтений и решаемых задач. тут каждый выбирает сам.

Вы упоминали про делитель на входе, если я правильно вас понял. Вот тут вас будут ожидать сложности. Делитель будет работать только если его входное сопротивление делать совсем небольшим. Связано это с архитектурой МК. Причем при некоторых пробах вам может показаться, что я ошибся и все прекрасно работает. Но вы тогда попробуйте повторить опыт. И еще раз. будете неприятно удивлены. Я долго бился как рыба об лед с делителями, и плюнул. Относительно стабильно работал только делитель на 2, да и то... Либо усилитель на входе с делителем, иначе стоит остановиться на Авторском варианте входного тракта. Что я и сделал в конечном итоге.

Вы сделали интересную реализацию этого замечательного прибора.

С моей точки зрения, эта разработка - шедевр. При этом уровне сложности схемы получить такие параметры - это нечто. Осциллограф для мальчишки теперь стал реальностью. Я в своей радиолюбительской юности даже мечтать о подобном не мог. А мой первый ослик, который заработал спустя лет 10, был по схеме на два порядка сложнее Пультоскопа.

Для начинающих, да и для некоторых профи он лишним не будет.

volodya198024
Offline
Зарегистрирован: 26.12.2016

я недавно у вас и на меня никто внимание не обращает.  моё сообщение  2232 может кто делал или задумывался над таковой проблеммой. Железо есть всё, мозга нехватит.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

volodya198024 пишет:

я недавно у вас и на меня никто внимание не обращает.  моё сообщение  2232 может кто делал или задумывался над таковой проблеммой. Железо есть всё, мозга нехватит.

Я в программировании ноль почти. Но как я понимаю проблему, о которой вы говорите: Там ПРОГРАМНАЯ синхронизация. И для реализации отдельного входа надо будет переделывать значительную часть кода. Не уверен, что кто-либо захочет это реализовать.

volodya198024
Offline
Зарегистрирован: 26.12.2016

Спасибо. начну собирать такой он тоже класс , а вслудующей жизни точно поумнею.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Ну у меня уже меньше 4х часов осталось. Скоро станет не до того, а посему: с Наступающим Вас господа! Пусть следующий год станет лучше предыдущего.

volodya198024
Offline
Зарегистрирован: 26.12.2016

А у меня через 40 мин.  Всех С НОВЫМ ГОДОМ!!!.

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

Laimīgu Jauno Gadu !  :)

Счастливого Нового Года!  Всем!  :)

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Всех с Наступающим 2017!!!Здоровья и всех благ!!!

oleg.forkop
Offline
Зарегистрирован: 21.06.2015

 

Soll das Neue Jahr besser sein als der vergangene! Er soll nur freue Nachrichten, interessante Ideen und positive Emotionen bringen! Freues Neues Jahr!

 

Пусть Новый год будет лучше предыдущего. Пусть он приносит только радостные новости, интересные идеи и позитивные эмоции! С праздником!

oleg.forkop
Offline
Зарегистрирован: 21.06.2015

 

Soll das Neue Jahr besser sein als der vergangene! Er soll nur freue Nachrichten, interessante Ideen und positive Emotionen bringen! Freues Neues Jahr!

 

Пусть Новый год будет лучше предыдущего. Пусть он приносит только радостные новости, интересные идеи и позитивные эмоции! С праздником!

alekseev2016
Offline
Зарегистрирован: 04.01.2017

Добрый день! Собрал пультоскоп по новой версии. При выборе генератора в меню экран зависает. Уже всё перепробовал. Помогите пожалуйста!!!

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

alekseev2016 пишет:

Добрый день! Собрал пультоскоп по новой версии. При выборе генератора в меню экран зависает. Уже всё перепробовал. Помогите пожалуйста!!!

Привет.

Дайте ссылку на новую версию и схему по которой собрали.

alekseev2016
Offline
Зарегистрирован: 04.01.2017
alekseev2016
Offline
Зарегистрирован: 04.01.2017
alekseev2016
Offline
Зарегистрирован: 04.01.2017

http://srukami.inf.ua/pultoscop_v25110.html

 

bodriy2014 пишет:

alekseev2016 пишет:

Добрый день! Собрал пультоскоп по новой версии. При выборе генератора в меню экран зависает. Уже всё перепробовал. Помогите пожалуйста!!!

Привет.

Дайте ссылку на новую версию и схему по которой собрали.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

alekseev2016

Ясно с сайта, значит ищите проблему в железе, спаянные соседние дорожки, не смытый флюс или пробитый конденсатор.

Версия на сайте многократно повторялось, программных боков вызывающих зависание не выявлено.

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

bodriy2014 пишет:

alekseev2016

Ясно с сайта, значит ищите проблему в железе, спаянные соседние дорожки, не смытый флюс или пробитый конденсатор.

Сделаю тут от себя примечание, когда я делал пробный запуск варианта с дисплеем LS020, у меня тоже при выборе в меню генератора всё остонавливалось. И я отчётливо помню тут раньше ещё кто-то об этом спрашивал. То есть, эта незадача не эксклюзив конкретного товарища. Но, с чем конкретно это связанно - этого я не знаю.
P.S.: у меня Пультоскоп пока отложен в сторонку изза других приоритетов, потому пока не копал в направлении решения.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Ребята, пока выходные, может попробуем сей полезный прибор снабдить еще одной полезной функцией. Может научим его считать и выводить [Коэффициент заполнения] = ([Длительность импульса (L), с] / [Период следования импульсов (T), с] ) *100%

Думаю будет полезно при отладке импульсников, чтоб ключи не крякнули.

bodriy2014  Может подскажете что и как?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Sasha80, в принципе есть готовая к употреблению  функция.  Можно имплантировать в любой проект на меге328

Sasha80
Offline
Зарегистрирован: 18.01.2016

dimax спасибо, буду посмотреть!

alekseev2016
Offline
Зарегистрирован: 04.01.2017

У меня пультоскоп собран на макетной плате. Старая версия корректно работает. Мог бы использовать и старую вместо новой, но в ней(в режиме паузы в осцилографе) нет прокрутки буфера.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Juris пишет:

bodriy2014 пишет:

alekseev2016

Ясно с сайта, значит ищите проблему в железе, спаянные соседние дорожки, не смытый флюс или пробитый конденсатор.

Сделаю тут от себя примечание, когда я делал пробный запуск варианта с дисплеем LS020, у меня тоже при выборе в меню генератора всё остонавливалось. И я отчётливо помню тут раньше ещё кто-то об этом спрашивал. То есть, эта незадача не эксклюзив конкретного товарища. Но, с чем конкретно это связанно - этого я не знаю.
P.S.: у меня Пультоскоп пока отложен в сторонку изза других приоритетов, потому пока не копал в направлении решения.

Я специально уточнил по какой схеме он делал,

с той что на сайте такого не было.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Sasha80 пишет:

Ребята, пока выходные, может попробуем сей полезный прибор снабдить еще одной полезной функцией. Может научим его считать и выводить [Коэффициент заполнения] = ([Длительность импульса (L), с] / [Период следования импульсов (T), с] ) *100%

Думаю будет полезно при отладке импульсников, чтоб ключи не крякнули.

bodriy2014  Может подскажете что и как?

В новой прошивке будет больше математики.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Жду недождусь :)  а пока поковыряюсь с кодом от Димакса

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

dimax пишет:

Sasha80, в принципе есть готовая к употреблению  функция.  Можно имплантировать в любой проект на меге328

Привет!

Два спасибо!

---за интересную и красивую функцию.

---и за ссылку на нее же, так как этого поста я не видел а лучше написать не смогу!)

Bosch
Offline
Зарегистрирован: 25.11.2016

Всем привет,собрал я все-таки осциллограф,используя скетч для 9340)Но,есть проблема,Сразу после запуска он сам переключает режимы,как будто я нажимаю кнопки,плату осмотрел,замыканий не нашел.В чем может быть проблема,подскажите,пожалуйста?

 

Sasha80
Offline
Зарегистрирован: 18.01.2016

Bosch пишет:

как будто я нажимаю кнопки

Ответ в твоем вопросе. Смотри внимательней на кнрпки. Искупай место пайки кнопок ацетончиком от флюса и т. д. может развел не так если ночью паял :) может кнопка коротить в конце концов.

Bosch
Offline
Зарегистрирован: 25.11.2016

Кнопок как раз и нету(

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Bosch пишет:

Всем привет,собрал я все-таки осциллограф,используя скетч для 9340)Но,есть проблема,Сразу после запуска он сам переключает режимы,как будто я нажимаю кнопки,плату осмотрел,замыканий не нашел.В чем может быть проблема,подскажите,пожалуйста?

Привет.

Давайте ссылку на скетч и схему.

В ветке уже много всего, в голове не удержишь!

bpl
Offline
Зарегистрирован: 15.02.2016

Sasha80 пишет:

Bosch пишет:

как будто я нажимаю кнопки

Смотри внимательней на кнрпки.

Думай о кнопках не так сильно и не о всех сразу.

Кнопки можете не ставить но три резистора на 10к поставьте или проверте, без них при переключении мыслью проблема.