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

Bober611
Offline
Зарегистрирован: 03.10.2017

Так они и так к земле подтянуты...

Еще у меня одного генератор не работает?

grif66
Offline
Зарегистрирован: 28.04.2017

я собирал на 5110 экране, тоже не работал генератор, несколько страниц назад писал об этом и про то, что изменил в скетче

Bober611
Offline
Зарегистрирован: 03.10.2017

Ок. Посмотрю. Спасибо

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

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

Bober611
Offline
Зарегистрирован: 03.10.2017

Походу лыжи у меня не правельные. Но я так и сделал...

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

подтяжка хз как там делана к минусу или плюсу, это в прошивке смотреть надо

questioner
Offline
Зарегистрирован: 10.06.2016

Прошу прощения, что-то я зарисовался и мозг отключил... исправил, спасибо за внимательность. Хотя, если подтянуть к +5 програмно, то будет работать, только скетч нужно править))

Electronik83
Offline
Зарегистрирован: 06.12.2015

Прошивку я свою выкладывал рабочую под ssd..

Давайте проголосуем может, кнопки как подключать лучше, как у автора - к питанию и резисторы на земельку или кнопки на землю,без резюков.

P.S. И что то я увлекся своим станком токарным, и ЧПУ охота достроить... Прошива моя будет, обязательно. Я пользусь - удобно.

user5
Offline
Зарегистрирован: 11.10.2017

Всем привет. Вышел на эту тему через youtube. Вопрос ко всем:
1) С чего вдруг такая зацикленность на мини-дисплеях? Разве вывод сигнала через USB не более практичен?
2) С чего вдруг такая зацикленность на Mega328, если платформа Arduino давно уже поддерживает такие же дешёвые STM32F103, который в стоке работает на 72 МГц?

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

user5, тут кружок любителей меги328 :)  А вам можно сходить например сюда.

grif66
Offline
Зарегистрирован: 28.04.2017

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

arcon73
Offline
Зарегистрирован: 06.04.2017

Здравия вам умные люди. Прошу прощения за глупые вопросы... Быть может кто то вразумит или сможет помочь.....

Так случилось что пришло понимание что требуется осцил (точнее компактный вариант...)  Облазив инет (опухши голова от не знакомых слов) понял что либо тратить много денег либо много нервов....ни то не другое не вариант... 

В спомнив что завалялся камень от ардуино , наткнулся на ваше решение. думаю вариант в полне хорош. надеюсь его воплотить.

Вот такие вопросы появились: 
1. камень 328 есть, плата стравится .... понравился вариант от karl2233 с русской прошивкой( быть может и найдётся кварц на 27+ )....надеюсь что 34063 найдется в нашей деревне....

оказалась проблема в экране.... ну нет в ближайшем откопать из хлама 5110... зато нашёлся LPH8731-3C от Siemes A62 , даже есть какая то инфа http://cxem.net/mc/mc218.php

Возможно ли мне как человеку не могучему в программировании прицепится к нему? или всё не так плохо?

2.  и так. потолок измерений прибора 2МГц ... теоретически покрывает большинство шимок (или я не прав?) , тоесть как тест индикатор например работоспособности фазы питания видеокарты вполне.... не забывая о максимум 5В входа..... Кажется подобный вопрос возникал, но не могу вспомнить, пишу сообщение уже 3 раз перескакивая по ссылкам.  Возможно ли улучшить ( обезопасить вход "простыми" методами) http://oldoctober.com/ru/oscilloscope/   для хотябы 12-15В...? Боюсь сним лазить в БП где бывает и 250 не выйдет.
или всё же требуется ОУ ....или с ним лучше....? Быть может уже путаюсь с соседней темой осцилографа VirtOS ... В архивах просто вроде нет схем с ОУ. (а то TL082 вроде заволялись). 

 

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

arcon73 пишет:

2.  и так. потолок измерений прибора 2МГц
 

Потолок прибора-звуковой диапазон частот. С некоторыми условностями килогерц до 50.

А VirtOS килогерц до 400. С условностями до 700-800.

Прибор до 2 Мгц таким уж простым не будет.

arcon73
Offline
Зарегистрирован: 06.04.2017

ага.... всё таки перепутал тему, опять заново перечитывать... 
имел ввиду о VirtOS 
https://www.youtube.com/watch?v=DLu7stRZ8K8

2000000Hz же 2Мгц?

 

sirota
Offline
Зарегистрирован: 18.08.2015

так там и спрашивайте.

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

аттенюаторы (делители) еще никто не отменял. тем более что ипользоваться будет как индикатор наличия колебаний, после 20 кГц форма сигнала отображается весьма условно. частоту измеряет точно.   может поможет ссылочка http://oldoctober.com/ru/oscilloscope/

sirota
Offline
Зарегистрирован: 18.08.2015

Stashevskiy68 пишет:

...после 20 кГц форма сигнала отображается весьма условно. частоту измеряет точно. 

Голословно малость... свой шим (понижайка) с отключением после 3.3В. ESP-12E. Отлаживаю схему на работе, ваяю код. В общем неделя любви - норм. Приношу домой - труп. Все. Есп падает в исключения и более не дает внятного на 9600, хотя espflasher прошивает ее успешно. Ок. Вторая... третья. Плюнул с четвертой поехал на осцил по боля. И на тебе всплеск (ни частоту ни вольтаж не измерял, плюнул, было очень обидно). Получислоь так что этот всплеск по питанию убивал какую-то часть есп, но при этом эта же схема под 5В (с 2-х последовательных литиев, т.е. там просттерл был куда больше чем 4.2 для 3.3есп, выходит в потолке 8.4 от 5В положеных, но опять же я предпологаю) не убивала mega328u... в общем шимки сразу сломал, остальное под деталье, к нг сделаю себе подарок на 200МГц нормальный осцил. А тут... вообще ровная прямая была... я так обрадовался

aloyz
Offline
Зарегистрирован: 08.11.2017

Добрый день.Кто может скинуть нормальный скетч на ST7735.а то ни один не могу скомпелировать,всё ошибку выкидывает.

albus_homo
Offline
Зарегистрирован: 17.11.2017

Здравствуйте. Если вам не сложно, не могли бы вы в кратце обьяснить как это сие чудо устроено и работает. Просто я в области радиоэлектроники почти абсолюный ноль, а разобраться и научится хочется.

albus_homo
Offline
Зарегистрирован: 17.11.2017

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

albus_homo пишет:

Здравствуйте. Если вам не сложно, не могли бы вы в кратце обьяснить как это сие чудо устроено и работает. Просто я в области радиоэлектроники почти абсолюный ноль, а разобраться и научится НЕ хочется.

Аналого-цифровое преобразование для начинающих

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

Удивили вопросом.

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

И способен рисовать точку на дисплее, соответствующую этому уровню напряжения.

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

В Авторском варианте до 600 000 раз в секунду.

А управляет этим процессом программа, залитая в микроконтроллер.

И эта программа заставляет контроллер нарисовать линию от каждой предыдущей точки до каждой последующей. В результате на дисплее видим некую линию. Прямую, кривую. Любую.

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

Чтобы построить более менее адекватно скажем один период синусоиды, нужно не менее 10 выборок (точек графика). А лучше 20.

Вот собственно этим цифровой осциллограф и занимается - строит графики по точкам.

Чем сложнее форма сигнала, тем больше точек нужно для ее адекватного построения.

albus_homo
Offline
Зарегистрирован: 17.11.2017

Премного благодарен.

satelit 2
Offline
Зарегистрирован: 04.12.2016

всех приветствую!!! все 3 тысячи постов не могу прочитать заново, извините!!! собрал все это в корпусе внешнего жесткого диска, и пришла необходимость использовать делитель, что бы мерить выше пяти вольт. в начале я встречал посты как делать делитель. но хотелось бы услышать как вы сделали его на практике. просто эти переключатели очень грамозкие

sirota
Offline
Зарегистрирован: 18.08.2015

Найдите не громоздкий. В чем проблема?

satelit 2
Offline
Зарегистрирован: 04.12.2016

в наличие есть неграмозкий, только на 4 положения. увлекся инверторами, а там примерное нарпяжение 600вольт

 

satelit 2
Offline
Зарегистрирован: 04.12.2016

в наличие есть неграмозкий, только на 4 положения. увлекся инверторами, а там примерное нарпяжение 600вольт

 

satelit 2
Offline
Зарегистрирован: 04.12.2016

у кого есть ползунковый переключатель на 10 позиций? куплю по разумной цене

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

Здравствуйте господа. Собрал версию пультоскопа на дисплее 7735 128/64. Загузил вот это скетч:

//страничка проекта <a href="<a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a>" rel="nofollow"><a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a></a>
// форум <a href="<a href="http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783" rel="nofollow">http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783</a>" rel="nofollow"><a href="http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783" rel="nofollow">http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783</a></a>
// скетч и библиотеку изменил под LCD_ls020 VetalST
// скетч и библиотеку изменил под LCD 1.8 дюйма 160х128 ST7735 Владимир Иванов ( 240265 )
// LCD_ls020 подключаем:
// к ардуине на ATmega328
//**********************************************************
#include <Adafruit_GFX.h>    //<a href="https://github.com/adafruit/Adafruit-GFX-Library" rel="nofollow">https://github.com/adafruit/Adafruit-GFX-Library</a>
#include <Adafruit_ST7735.h> //<a href="https://github.com/adafruit/Adafruit-ST7735-Library" rel="nofollow">https://github.com/adafruit/Adafruit-ST7735-Library</a>
#include <SPI.h>
#include <FreqCount.h> //<a href="http://www.pjrc.com/teensy/td_libs_FreqCount.html" rel="nofollow">http://www.pjrc.com/teensy/td_libs_FreqCount.html</a>
#include <PWM.h> //<a href="https://puzzlebox.io/orbit/development/browser/orbit/arduino/libraries/PWM/PWM.h" rel="nofollow">https://puzzlebox.io/orbit/development/browser/orbit/arduino/libraries/PWM/PWM.h</a>

// For the breakout, you can use any 2 or 3 pins
// These pins will also work for the 1.8" TFT shield
#define TFT_CS    10
#define TFT_RST   A0   // можно подключить к D9
#define TFT_DC     8

// Option 1 (recommended): must use the hardware SPI pins
// (for UNO thats sclk = 13 and sid = 11) and pin 10 must be
// an output. This is much faster - also required if you want
// to use the microSD card (see the image drawing example)
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

// Option 2: use any pins but a little slower!
//#define TFT_SCLK 13   // set these to be whatever pins you like!
//#define TFT_MOSI 11   // set these to be whatever pins you like!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

#define Out  9   //пин для генератор сигналов и DSS(не менять)
#define dds  9   //пин для генератора dds (не менять)

//#################№№№№№№####пользовательские настройки!
#define levo 2
#define ok 3
#define pravo 4
#define akb A3 //любой своюодный аналоговый пин для измерения напряжения АКБ
#define delit 6 //включен или отключен делитель на х10
#define overclock 27 //Частота на которой работает Ардуино
byte SinU=30; // =30;   //уровень синхронизации 0 до 255
int PWM = 128;//стартовое значение ШИМ от 0 до 255
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=4.9;  //напряжение питания, меряем мультиметром
byte pultoskop=1; //флаг выбора генератора или осциллографа
//###########################################################

byte menuDDS=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};
byte hag=0;
int mnog=0;
boolean flag=0;
byte mass[256];//массив АЦП
//byte massDEL[401];
byte menu=1;//переменная верхнего меню
byte razv=5;//значение развертки
byte x=30; //счетчик оси Х
int Vmax=0;// максимальное напряжение
unsigned long pause=0;//переменная для замены Delay
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
bool clen_p=0;//флаг чистки паузы
long countX=0;
byte sinhMASS=0;
unsigned long count =0;
int prokr=0;
char str[10];
int temp;
float armcurrent;
int d=0;

String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}


//********************* ОТРИСОВКА ЛИНИИ *********************************
void Line(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
 uint16_t color) {
  bool vektor = abs(x0 - x1) > abs (y0 - y1);
  if (vektor) {
    if (y1 > y0) {
      int h = x1 - x0 + 1;
      int d = y1 - y0 + 1;
      h = h / d;
      for (; y0 <= y1; y0++) {
       tft. drawFastHLine(x0, y0, h, color);
        x0 = x0 + h;
      }
    }
    else {
      int h = x1 - x0 + 1;
      int d = y0 - y1 + 1;
      h = h / d;
      for (; y0 >= y1; y0--) {
       tft. drawFastHLine(x0, y0, h, color);
        x0 = x0 + h;
      }
    }
  }
  else {
    if (y1 > y0) {
      int h = y1 - y0 + 1;
      int d = x1 - x0 + 1;
      h = h / d;
      for (; x1 >= x0; x0++) {
       tft. drawFastVLine(x0, y0, h, color);
        y0 = y0 + h;
      }
    }
    else {
      int h = y0 - y1 + 1;
      int d = x1 - x0 + 1;
      h = h / d;
      for (; x1 >= x0; x1--) {
        tft.drawFastVLine(x1, y1, h, color);
        y1 = y1 + h;
      }
    }
  }
}

//********************* МЕНЮ DDS *********************
void DDS_Menu () {
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println(utf8rus("СИНУС"));
    tft.setCursor(35, 50);
    tft.println(utf8rus("ТРЕУГОЛЬНИК"));
    tft.setCursor(35, 70);
    tft.println(utf8rus("ПИЛА"));
    tft.setCursor(35, 90);
    tft.println(utf8rus("ПИЛА ОБР"));
}

//***************** ОТРИСОВКА В ПАУЗЕ ОСЦИЛОГРАФА *******************
void Pause(){
        tft.fillRect(0, 12, 160, 3, ST7735_BLACK);//стиране шкалы прокрутки
          tft.fillRect(6, 12, 154, 99, ST7735_BLACK);//стиране поле графика
         // tft.fillRect(0,116, 160, 12, ST7735_BLACK);//стиране НИЖНЕГО МЕНЮ
          //////////////////////////////////////////////////////////////
          tft.drawLine(prokr/4,12,prokr/4+25,12, ST7735_YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,13,prokr/4+25,13, ST7735_YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,14,prokr/4+25,14, ST7735_YELLOW);//шкала прокрутки

          //++++++++++++++++ СЕТКА
          for(byte i=110;i>18;i=i-3){
            tft.drawPixel(6,i, ST7735_BLUE);
            tft.drawPixel(25,i, ST7735_BLUE);
            tft.drawPixel(44,i, ST7735_BLUE);
            tft.drawPixel(63,i, ST7735_BLUE);
            tft.drawPixel(82,i, ST7735_BLUE);
            tft.drawPixel(101,i, ST7735_BLUE);
            tft.drawPixel(120,i, ST7735_BLUE);
            tft.drawPixel(139,i, ST7735_BLUE);
            tft.drawPixel(158,i, ST7735_BLUE);
           // tft.drawPixel(159,i, ST7735_BLUE);
          }
          for(byte i=6;i<160;i=i+3){
            tft.drawPixel(i,25, ST7735_BLUE);
            tft.drawPixel(i,42, ST7735_BLUE);
            tft.drawPixel(i,59, ST7735_BLUE);
            tft.drawPixel(i,76, ST7735_BLUE);
            tft.drawPixel(i,93, ST7735_BLUE);
            tft.drawPixel(i,110, ST7735_BLUE);
          }
          //////////////////////////////////////////////////////
          x=5;
          for(int y=prokr;y<prokr+146;y++){
            if(razv<7){ x++;}
            if(razv==7){x=x+2;}
            if(razv==8){ x=x+3; }
            if(razv==9){ x=x+4; }
            if(razv==10){ x=x+5; }
            if(x>160){ x=160; }
          // tft.drawPixel(x,110-mass[y]/3,ST7735_GREEN);
           tft.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
          }
      }

//************* ОТРИСОВКА ВЕРХНЕГО МЕНЮ ************************
void PrintVmenu(){
tft.fillRect(0, 0, 45, 9, ST7735_BLACK);
          if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){

    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
    tft.println( "2.2V/d");
        }
        if(opornoe==1){

          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "10V/d");
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "0.22V/d");
        }
        if(opornoe==1){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "1V/d");
        }
      }

       tft.setCursor(55, 1);
    tft.println( utf8rus("Разв"));
        sprintf(str, "%d", razv);
    tft.setCursor(91, 1);
    tft.println( str);

}

//******************* ОТРИСОВКА ГЛАВНОГО МЕНЮ *****************

void GlavMenu (){

     tft.setTextSize(1);
      tft.setTextColor(ST7735_WHITE);
      tft.setCursor(35, 25);
      tft.println(utf8rus("Осцилограф"));
       tft.setCursor(35, 55);
       tft.println(utf8rus("Генератор PWM"));
       tft.setCursor(35, 85);
        tft.println(utf8rus("Генератор DDS"));
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println(utf8rus("Батарея ="));
      armcurrent = ((analogRead(akb)*VCC/1024)*11.17);//проверка напряжения на АКБ
      temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
      sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));
      tft.fillRect(90,110,24,10,ST7735_BLACK);
       tft.setTextColor(ST7735_BLUE);
       tft.setCursor(90, 110);
       tft.println(str);

}



void setup(){
  //tft.cp437(true);
  if(opornoe==0){
    ADMUX = 0b11100100;
  }//выбор внутреннего опорного 1,1В
  if(opornoe==1){
    ADMUX = 0b01100100;
  }//Выбор внешнего опорного
 SPI.begin;
 SPI.setClockDivider(SPI_CLOCK_DIV2);

  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
  tft.setRotation(1);              //  повернуть по горизонту
  tft.fillScreen(ST7735_BLACK);
  tft.drawRect(0,0,160,128,ST7735_WHITE); // рисуем рамку
  tft.drawRect(2,2,156,125,ST7735_BLUE); // рисуем рамку
  tft.drawRect(4,3,152,121,ST7735_RED); // рисуем рамку

   // подтянули кнопки к питанию
  //digitalWrite(levo, HIGH); digitalWrite(pravo, HIGH); digitalWrite(ok, HIGH);

 while(digitalRead(ok)==LOW){
    if(digitalRead(pravo)==HIGH){
     // delay (10);
      while((digitalRead(pravo)==HIGH));
      pultoskop=pultoskop-1;
      if(pultoskop<1)pultoskop=3;
    }
    if(digitalRead(levo)==HIGH){
     // delay (10);
      while((digitalRead(levo)==HIGH));
      pultoskop=pultoskop+1;
      if(pultoskop>3)pultoskop=1;
    }


    if(pultoskop==1){
      GlavMenu ();
 //     tft.setTextSize(1);
      tft.setTextColor(ST7735_RED);
      tft.setCursor(35, 25);
      tft.println(utf8rus("Осцилограф"));

    }

    if(pultoskop==2){
     GlavMenu ();
       tft.setCursor(35, 55);
       tft.setTextColor(ST7735_RED);
       tft.println(utf8rus("Генератор PWM"));
    }

     if(pultoskop==3){
      GlavMenu ();
       tft.setCursor(35, 85);
       tft.setTextColor(ST7735_RED);
       tft.println(utf8rus("Генератор DDS"));
    }
 delay(200);

}

     tft.fillScreen(ST7735_BLACK);//очистка дисплея
  if(pultoskop==1){
    FreqCount.begin(1000);
 //   tft.fillScreen(ST7735_BLACK);//очистка дисплея
  }
  if(pultoskop==2){
    InitTimersSafe();
    bool success = SetPinFrequencySafe(Out, frequency);
 //   tft.fillScreen(ST7735_BLACK);//очистка дисплея
  }
  if(pultoskop==3){
   InitTimersSafe();
   bool success = SetPinFrequencySafe(Out,200000);
//   tft.fillScreen(ST7735_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<255;i++){
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          delayMicroseconds(500);
          mass[i]=ADCH;
      }
  }
  if (razv>0){
      for(int i=0;i<255;i++){
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          mass[i]=ADCH;
      }
  }

}

void MenuT(){//перерисовка нижнего меню

  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)-0.2; }//-0.2 КОРЕКЦИЯ ПОКАЗАНИЙ ЧАСТОТЫ ГЦ //delitel 128
        flagFrec1=0;
        flagFrec3=0;
      }
    }
  }

  //#######################################частоты сигнала

   tft.setTextColor(ST7735_WHITE);
   tft.setCursor(1, 120);
    tft.println( "F=");

  if(opornoe==1){
    if((Vmax*VCC/255)>2.8){ countX=count*(overclock/16.0); }
    if((Vmax*VCC/255)<=2.8){ countX=Frec*(overclock/16.0); }
  }
  if(opornoe==0){ countX=Frec*(overclock/16.0); }
  if(countX<1000){
    sprintf(str, "%d Hz", countX);
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(18, 120);
    tft.println( str);
  }
  if(countX>=1000){
  float countXK=countX/1000.0;
  temp = (countXK - (int)countXK) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д
  sprintf(str, "%d.%03d kHz", (int)countXK, abs(temp));
  tft.setTextColor(ST7735_WHITE);
  tft.setCursor(18, 120);
  tft.println( str);
  }
  tft.setTextColor(ST7735_WHITE);
   tft.setCursor(18, 120);
    tft.println( str);

    //--------- Напряжение --------------------
  if(digitalRead(delit)==HIGH){//включен или отключен делитель
      if(opornoe==0){ armcurrent = (Vmax*1.1/255)*10; }
     if(opornoe==1){ armcurrent = (Vmax*VCC/255)*10;  }
  }
   else {
     if(opornoe==0){ armcurrent = Vmax*1.1/255; }
     if(opornoe==1){ armcurrent = Vmax*VCC/255;  }
   }
  tft.setTextColor(ST7735_WHITE);
   tft.setCursor(100, 120);
    tft.println( "U=");
    temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
    sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));
   tft.setTextColor(ST7735_WHITE);
   tft.setCursor(118, 120);
    tft.println( str);
}

void loop() {
  if(pultoskop==1){
    while(1){

      //********** ОТРИСОВКА И ПЕРЕБОР ВЕРХНЕГО МЕНЮ ***************************

      //***************** опорное  **************************
      if(menu==0){
        tft.fillRect(0, 0, 45, 9, ST7735_RED);
       PrintVmenu();

        if(digitalRead(pravo)==HIGH){
         tft.fillRect(0, 12, 30, 120, ST7735_BLACK);//стирание напряжения
          opornoe=1;
        }
        if(digitalRead(levo)==HIGH){
          tft.fillRect(0, 12, 30, 120, ST7735_BLACK);//стирание напряжения
          opornoe=0;
        }
      }
      /////////////////////////// развертка /////////////////////////////
      if(menu==1){
        tft.fillRect(48, 0, 57, 9, ST7735_RED);
     PrintVmenu();

        if(digitalRead(pravo)==HIGH){//добавть скорость
        delay (30);
        while((digitalRead(pravo)==HIGH));
          razv++;
          if(razv==11){ razv=10;}
        }
        if(digitalRead(levo)==HIGH){//убавить скорость
        delay (30);
        while((digitalRead(levo)==HIGH));
          razv--;
          if(razv==255){ razv=0; }
        }
      }
      ///////////////////// синхронизация /////////////////////////////////
      if(menu==2){
        prokr=0;
        paus=0;
    PrintVmenu();

  tft.fillRect(105, 0, 174, 9, ST7735_RED);
  tft.setCursor(112, 1);
  tft.println( utf8rus("Синх-ция"));
        if(digitalRead(levo)==HIGH){
          SinU=SinU-10;
          if(SinU<10){ SinU=10; }
        }
        if(digitalRead(pravo)==HIGH){
          SinU=SinU+10;
          if(SinU>240){ SinU=240; }
        }

        tft.fillCircle(155,110-SinU/3, 3, ST7735_RED);
        tft.fillCircle(155,110-SinU/3, 1, ST7735_BLACK);
      }
      ///////////////////// пауза //////////////////////////////////
      if(menu==3){
        paus=1;
        if(clen_p==0){
         clen_p=1;

         tft.fillRect(105, 0, 174, 9, ST7735_RED);
    PrintVmenu();

    tft.setCursor(112, 1);
    tft.println( utf8rus("ПАУЗА"));
      }
        }

      if(digitalRead(ok)==HIGH){
        delay (30);
        while((digitalRead(ok)==HIGH));
        menu++;
        tft.fillRect(6, 16, 154, 99, ST7735_BLACK);//стиране поле графика
        tft.fillRect(0,116, 160, 12, ST7735_BLACK);//стиране НИЖНЕГО МЕНЮ
        if(menu==4){
          menu=0;
          paus=0;
          clen_p=0;
        }
        tft.fillRect(0, 0, 160, 15, ST7735_BLACK);//стиране ВЕРХ МЕНЮ
      }

      //************** ОСЬ НАПРЯЖЕНИЯ ##########################################
      tft.drawLine(2, 20, 2, 114, ST7735_BLUE);
      tft.drawLine(2, 25, 5, 25, ST7735_BLUE);
      tft.drawLine(2, 42, 5, 42, ST7735_BLUE);
      tft.drawLine(2, 59, 5, 59, ST7735_BLUE);
      tft.drawLine(2, 76, 5, 76, ST7735_BLUE);
      tft.drawLine(2, 93, 5, 93, ST7735_BLUE);
      tft.drawLine(2, 110,5, 110, ST7735_BLUE);

      //************ ОСЬ РАЗВЕРТКИ ##########################################
      tft.drawLine(2, 115,158, 115, ST7735_BLUE);
      //  Черточки ******************
            for(byte i=6;i<160;i=i+19){
            tft.drawPixel(i,114, ST7735_BLUE);
            tft.drawPixel(i,113, ST7735_BLUE);
            tft.drawPixel(i,112, ST7735_BLUE);
 }
      //***************выбор внутреннего опорного 1,1В ########################################
      if(opornoe==0){ ADMUX = 0b11100100; }
      //**************Выбор внешнего опорного ***************************
      if(opornoe==1){ ADMUX = 0b01100100; }
      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<151;y++){ if(Vmax<mass[y]){ Vmax=mass[y]; } }
      //максимальное значение сигнала ##########################

      //************************ ОТРИСОВКА ГРАФИКА *************************
      if(paus==0){
        tft.fillRect(6, 25, 154, 86, ST7735_BLACK);//стиране поле графика
//***//*************** стиране НИЖНЕГО МЕНЮ **********************
     tft.fillRect(18, 120, 80, 8, ST7735_BLACK);
     tft.fillRect(118, 120, 25, 8, ST7735_BLACK);
//*****************************************************************
        tft.fillCircle(10,110-SinU/3, 2, ST7735_YELLOW);//рисуем уровень синхронизации
        tft.fillCircle(10,110-SinU/3, 3, ST7735_YELLOW);//рисуем уровень синхронизации
           x=5;
       for(int y=sinhMASS-1;y<sinhMASS+151;y++){

           if(razv<7){ x++; }
          if(razv==7){ x=x+2; }
          if(razv==8){ x=x+3; }
          if(razv==9){ x=x+4; }
          if(razv==10){ x=x+5; }
          if(x>159){ x=159; }

        Line(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график через Line (быстрее в 2 раза)
        }
        MenuT();
      }
     ///////////////////////////// режим паузы ////////////////////////////////////////////////

    if(paus==1){

        if(digitalRead(pravo)==HIGH){//листаем
          prokr=prokr+2;
          if(prokr>554){prokr=0; }
      Pause();
        }
      if(digitalRead(levo)==HIGH){//листаем
          prokr=prokr-2;
          if(prokr<0){prokr=554; }
      Pause();
        }
      }
     // delay(300); // можно удалить или подобрать по скорости обновления экрана
    }
  }

  //************************************************************************************************
  //#######################################  режим uенератора от 1 Гц до 2 МГц
  if(pultoskop==2){
    while(1){
      if (flag==0){//флаг выборов режима настройки  Частоты
        if(digitalRead(levo)==HIGH){
          frequency=frequency-mnog;
          if(frequency<0){
            frequency=0;
          }
          bool success = SetPinFrequencySafe(Out, frequency);
          delay(3);//защита от дребезга
          tft.fillRect(6, 60, 160, 80, ST7735_BLACK);//стирание поля
        }
        if(digitalRead(pravo)==HIGH){
          frequency=frequency+mnog;
          bool success = SetPinFrequencySafe(Out, frequency);
          delay(3);//защита от дребезга
          tft.fillRect(6, 60, 160, 80, ST7735_BLACK);//стирание поля закрашиваем
        }
      }
      if (flag==1){//флаг выборов режима настройки ШИМ
        if(digitalRead(levo)==HIGH){
          PWM=PWM-2;
          if(PWM<0){
            PWM=255;
          }
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля
          tft.fillRect(90, 100, 129, 125, ST7735_BLACK);//стирание в низу число шим
        }
        if(digitalRead(pravo)==HIGH){
          PWM=PWM+2;
          if(PWM>255){
            PWM=0;
          }
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля
          tft.fillRect(90, 100, 129, 125, ST7735_BLACK);//стирание в низу число шим
        }
      }

      if(digitalRead(ok)==HIGH){//переключение разряда выбора частоты
        delay (30);
        while((digitalRead(ok)==HIGH));
        hag++;
        if(hag>=6){
          hag=0;
        }
        tft.fillRect(6, 100, 154, 28, ST7735_BLACK);//стирание поля
      }
      ////////////

      tft.setCursor(10, 19);
      tft.setTextColor(ST7735_GREEN);
      tft.setTextSize(2);
      tft.println("PWM =");
     // temp = PWM*100/255;
      tft.setCursor(80, 19);
      tft.println( PWM*100/255,1);
      tft.setCursor(122, 19);
      tft.println( "%");

      armcurrent = (127*PWM/255)+25; // вычисляем длинны линии

      tft.drawLine(6,10,armcurrent,10, ST7735_YELLOW);
      tft.drawLine(6,11,armcurrent,11, ST7735_YELLOW);
      tft.drawLine(6,12,armcurrent,12, ST7735_YELLOW);
      tft.drawLine(6,13,armcurrent,13, ST7735_YELLOW);
      tft.drawLine(6,14,armcurrent,14, ST7735_YELLOW);

      tft.drawLine(6,37,armcurrent,37, ST7735_YELLOW);
      tft.drawLine(6,38,armcurrent,38, ST7735_YELLOW);
      tft.drawLine(6,39,armcurrent,39, ST7735_YELLOW);
      tft.drawLine(6,40,armcurrent,40, ST7735_YELLOW);
      tft.drawLine(6,41,armcurrent,41, ST7735_YELLOW);

      ///////////////////////////////////
      long frequencyX=frequency*(overclock/16.0);
       tft.setTextSize(2);
      if(frequencyX<1000){
        sprintf(str, "%d Hz", frequencyX);
        tft.setCursor(30, 60);
        tft.setTextColor(ST7735_WHITE);
        tft.println(str);
        tft.setTextSize(1);
      }

      if(frequencyX>=1000&&frequencyX<1000000){
        tft.setTextSize(2);
        armcurrent=frequencyX/1000.0;
        temp = (armcurrent - (int)armcurrent) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%003d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(15, 60);
        tft.setTextColor(ST7735_WHITE);
        tft.println(str);
       tft.setTextSize(1);
      }

      if(frequencyX>=1000000){
        tft.setTextSize(2);
        armcurrent=frequencyX/1000000.0;
        temp = (armcurrent - (int)armcurrent) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%003d MHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 60);
        tft.setTextColor(ST7735_WHITE);
        tft.println(str);
       tft.setTextSize(1);

      }
      if(frequencyX>2000000)frequency=0;

      //////////////////////////////////////////////////////////////

        tft.setCursor(5, 100);
        tft.setTextColor(ST7735_BLUE);
        tft.setTextSize(1);
        tft.println(">>");

      if(hag==0){//выбор множителя частоты
        mnog=1;
        flag=0;
        armcurrent = 1*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println(str);

      }
      if(hag==1){//выбор множителя частоты
        mnog=10;
        armcurrent = 10*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println(str);
      }
      if(hag==2){//выбор множителя частоты
        mnog=100;
        armcurrent = 100*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println(str);
      }
      if(hag==3){//выбор множителя частоты
        mnog=1000;
        armcurrent = 1*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println(str);
      }
      if(hag==4){//выбор множителя частоты
        mnog=10000;
        armcurrent = 10*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println(str);
      }
      if(hag==5){//выбор  PWM
        flag=1;
        tft.setTextSize(2);
        tft.setCursor(25, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println("PWM =");
       // temp = PWM*100/255;
        tft.setCursor(95, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println(PWM*100/255,1);
        tft.setCursor(132, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println("%");
      }
        tft.setCursor(145, 100);
        tft.setTextColor(ST7735_BLUE);
        tft.setTextSize(1);
        tft.println("<<");


      pwmWrite(Out, PWM);
      delay(50);
    }
  }
 //************************************************************************************************
  //#######################################  режим DDS ренератор
if(pultoskop==3){
  while(1){
int fr=10;

if(menuDDS==0){
  DDS_Menu ();
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_RED);
 //   tft.setTextSize(1);
    tft.println(utf8rus("СИНУС"));

    delay(400);
    while(!(PIND & (1<<PIND2))){
    PWM=sinM[d];
    pwmWrite(dds,PWM);
    //delayMicroseconds(fr);
    d++;
    if(d==32){d=0;}}
     menuDDS++;
  }
if(menuDDS==1){
  DDS_Menu ();
    tft.setCursor(35, 50);
    tft.setTextColor(ST7735_RED);
    tft.println(utf8rus("ТРЕУГОЛЬНИК"));

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=trianglM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
  }
if(menuDDS==2){
  DDS_Menu ();

    tft.setTextColor(ST7735_RED);
    tft.setCursor(35, 70);
    tft.println(utf8rus("ПИЛА"));

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=pilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
  }
if(menuDDS==3){
  DDS_Menu ();

    tft.setCursor(35, 90);
    tft.setTextColor(ST7735_RED);
    tft.println(utf8rus("ПИЛА ОБР"));

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=RpilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
  }
if(menuDDS==4){menuDDS=0;}
}
}
/////////////////////DDS
}

Есть пару вопросов, подскажите пожалуйста.

1: В режиме ДДС генератора накрасивые сигналы, что не так? Делал по схеме вывод с 9 пина через переменник. На скринах синус и пила.

 

2: Собирал делитель 1:10 вот по этой схеме

Как подогнать значения показаний с делителей друг под друга, Только ли подбирая резисторы? Может возможно программно? Если да, то как?

3: Не понял как в этой прошивке выбирать опорное напряжение. В прошлой версии своего пультоскопа это делал через среднюю кнопку (ОК), в этой версии скетча чет не увидел этой возможности. Может кто пользуется прошивкой под такой же дисплей поделится ньюансами?

Спасибо.

 

aloyz
Offline
Зарегистрирован: 08.11.2017

Sasha80 ,а каким id пользуетесь?

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

Arduino IDE 1.8.2 Через нее все вгружал.

Сейчас некоторые другие попробывал, все то же. DDS неправильный.

 

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Sasha80 пишет:
1: В режиме ДДС генератора накрасивые сигналы, что не так? Делал по схеме вывод с 9 пина через переменник. На скринах синус и пила.

А где вы такие картинки взяли?

Это не звуковой вход ПК?

 

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

Да, да, это вход З.К. на компьютере.

aloyz
Offline
Зарегистрирован: 08.11.2017

У меня выкидывает ошибку при компиляции,код ваш.

Sasha80
Offline
Зарегистрирован: 18.01.2016
Странно, у меня все ОК. Может библиотек у вас не хватает?
 

 

aloyz
Offline
Зарегистрирован: 08.11.2017

На7735 есть ,а что ещё надо?

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

#include <Adafruit_GFX.h>  
#include <Adafruit_ST7735.h>
#include <SPI.h>
#include <FreqCount.h>
#include <PWM.h>

ну и U8glib для русификации

 

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Sasha80 пишет:
Да, да, это вход З.К. на компьютере.

Скорее всего с генератором все впорядке. Пилу на входе ЗК сложно увидеть.

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

Пилу то может и сложно, но вот синусоида же, тоже корявая. Видно что нижнее плечо короче, да и горбатость странная.

PS: На картинке не пила, а треугольник, ошибся чудок.

 

 

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

В Пультоскопе ДДС генератор вырабатывает псевдо сигнал. Импульсами переменной ширины. А искажения формы могут быть вызваны некорректной подборкой фильтра на выходе генератора.

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

satelit 2 пишет:

у кого есть ползунковый переключатель на 10 позиций? куплю по разумной цене

Я бы рекомендовал поэкспериментировать с делителями перед тем, как собирать основательную конструкцию. Боюсь, что с ними все может оказаться не столь просто без ОУ на входе.

У меня с делителями прямо на АЦП МК не вышло нифига хорошего. Дело в том, что у АЦП хитрый вход. Он ведет себя совсем иначе.

 

Sasha80
Offline
Зарегистрирован: 18.01.2016
Дык нет никакого фильтра на выходе генератора, только переменник, пробовал напрямую с Д9 брать сигнал, все тоже.
 

 

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

Sasha80 пишет:

Дык нет никакого фильтра на выходе генератора, только переменник, пробовал напрямую с Д9 брать сигнал, все тоже.

Фильтром, например, могут послужить паразитные емкости монтажа, щупов и т.д.

Я никогда не задавался вопросом, а могут ли програмные эквалазеры исказить сигнал виртуального осциллографа.

ДДС не главная функция Пультоскопа. Если все остальное работает, я бы не стал так уж за него биться. Он все-равно достаточно условный.

Mitchel
Offline
Зарегистрирован: 27.08.2017

Для DDS фильтр - это резистор на 270 Ом и конденсатор на 0.1. При других значениях у меня тоже были похожие искажения

Mitchel
Offline
Зарегистрирован: 27.08.2017

Delete дубль

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

С тем что устройство весьма условно согласен, но вместе с тем и полезно, хотел бы все таки чтоб все работало :)

Mitchel, подскажите конденсатор на минус, а резистор в проход сигнала?

 

 

Mitchel
Offline
Зарегистрирован: 27.08.2017

Да. Схема на сайте автора http://srukami.inf.ua/pultoscop_v25110.html

Electronik83
Offline
Зарегистрирован: 06.12.2015

Да. Да. Синус и автора горбат слегка. Я правил фигуры в своих версиях последних.

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

разобрался, слишком большой переменник поставил на выходе, 10к (по схеме 2,2 к), он сглаживал сильно. И конденсатор у меня стоял до резистора 270 ом, а не после. Конденсатор 100n перепаял, переменник пока убрал, стало все впорядке.

Получается остался вопрос с подгонкой значений делителей 1:1 и 1:10 Подскажите, есть ли возможность их подогнать программно?

 

 

Mitchel
Offline
Зарегистрирован: 27.08.2017

Sasha80 пишет:

Получается остался вопрос с подгонкой значений делителей 1:1 и 1:10 Подскажите, есть ли возможность их подогнать программно?

Да можно, везде где используешь коэффециент 10 нужно при необходимости подправить. Например здесь

459   if(digitalRead(delit)==HIGH){//включен или отключен делитель
460       if(opornoe==0){ armcurrent = (Vmax*1.1/255)*10; }
461      if(opornoe==1){ armcurrent = (Vmax*VCC/255)*10;  }
462   }

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

Я подбирал этот коэффициент измеряя пультоскопом извесное точное напряжение (сверять с мультиметром)