Переделка осциллографа на база Ардуино

holms312
Offline
Зарегистрирован: 11.01.2020

Приветствую, нашел скетч осциллографа, чуть переделал под свой сенсорный дисплей tft 480*320.
Проблема в том что, мне нужно вывести график,но там малый вольтаж от 0до 200mV. График показывает,но маленький, едва заметны изменения . Можно ли увеличить вид графика?

#include <SPFD5408_Adafruit_TFTLCD.h>

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

#define txtLINE0   0
#define txtLINE1   16
#define txtLINE2   30
#define txtLINE3   46

const int LCD_WIDTH = 320;  //Panjang/Lebar LCD dalam pixel
const int LCD_HEIGHT = 240; //Tinggi LCD dalam pixel
const int SAMPLES = 270; 
const int DOTS_DIV = 30;

const int ad_sw = 10;                   // Analog 3 pin for switches
const int ad_ch0 = 6;                   // Analog 6 pin for channel 0
const int ad_ch1 = 5;                   // Analog 5 pin for channel 1
const unsigned long VREF[] = {150, 300, 750, 1500, 3000}; // reference voltage 5.0V ->  150 :   1V/div range (100mV/dot)
                                        // It means 5.0 * DOTS_DIV = 150. Use 4.9 if reference voltage is 4.9[V]
                                        //                        -> 300 : 0.5V/div
                                        //                        -> 750 : 0.2V/div
                                        //                        ->1500 : 100mV/div
                                        //                       -> 3000 :  50mV/div
const int MILLIVOL_per_dot[] = {33, 17, 6, 3, 2}; // mV/dot
const int MODE_ON = 0;
const int MODE_INV = 1;
const int MODE_OFF = 2;
const char *Modes[] = {"NORMAL", "INVERT", "OFF"};
const int TRIG_AUTO = 0;
const int TRIG_NORM = 1;
const int TRIG_SCAN = 2;
const int TRIG_ONE  = 3;
const char *TRIG_Modes[] = {"Auto", "Norm", "Scan", "One"};
const int TRIG_E_UP = 0;
const int TRIG_E_DN = 1;
#define RATE_MIN 0
#define RATE_MAX 13
const char *Rates[] = {"F1-1", "F1-2 ", "F2  ", "5ms", "10ms", "20ms", "50ms", "0.1s", "0.2s", "0.5s", "1s", "2s", "5s", "10s"};
#define RANGE_MIN 0
#define RANGE_MAX 4
const char *Ranges[] = {" 1V ", "0.5V", "0.2V", "0.1V", "50mV"};
unsigned long startMillis;
byte data[4][SAMPLES];                   // keep twice of the number of channels to make it a double buffer
byte sample=0;                           // index for double buffer

///////////////////////////////////////////////////////////////////////////////////////////////
// Define colors here

//color address harus diberikan saat menggunakan lib SPFD5408_Adafruit_TFTLCD.h
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

#define BGCOLOR   BLACK    //Warna Background
#define GRIDCOLOR GREEN    //Warna Grid
#define CH1COLOR  RED      //Warna Gelombang Channel 1
#define CH2COLOR  MAGENTA  //Warna Gelombang Channel 2

// Declare variables and set defaults here
// Note: only ch1 is available with Aitendo's parallel 320x240 TFT LCD  
byte range0 = RANGE_MIN, ch0_mode = MODE_OFF;  // CH0
short ch0_off = 204;
byte range1 = RANGE_MIN, ch1_mode = MODE_ON;  // CH1
short ch1_off = 204;
byte rate = 3;                                // sampling rate
byte trig_mode = TRIG_AUTO, trig_lv = 30, trig_edge = TRIG_E_UP, trig_ch = 1; // trigger settings
byte Start = 1;  // Start sampling
byte menu = 0;  // Default menu
///////////////////////////////////////////////////////////////////////////////////////////////

void setup(){

  tft.reset();  //perlu saat menggunakan lib.SPFD5408_Adafruit_TFTLCD.h
  //tft.initDisplay(); //tidak perlu saat menggunakan lib.SPFD5408_Adafruit_TFTLCD.h
  tft.begin(0x9341); //perlu address ini saat menggunakan lib.SPFD5408_Adafruit_TFTLCD.h
  tft.setRotation(3);

  tft.fillScreen(BGCOLOR);

  tft.setTextColor(WHITE);
  tft.setTextSize(1);
  tft.setCursor(75, 100);
  tft.print("Arduino Uno Oscilloscope");
  tft.setCursor(75, 120);
  tft.print("with SPFD5408 TFT LCD (320x240)");
  tft.setCursor(75, 140);
  tft.print("(c)RJDuino 2016-2021");
  delay(2000);

  tft.fillScreen(BGCOLOR);
   
  Serial.begin(9600);
  DrawGrid();
  DrawText();
}

void CheckSW() {
  static unsigned short oain[2];
  static unsigned long Millis = 0, oMillis = 0;
  unsigned long ms;
  unsigned short ain = analogRead(ad_sw);
  
  return;
  
  ms = millis();
  if ((ms - Millis)<5)
    return;
  Millis = ms;
  
  if (!(abs(oain[0] - oain[1])>10 && abs(oain[1] - ain)<2)) {
    oain[0] = oain[1];
    oain[1] = ain;
    return;
  }
  oain[0] = oain[1];
  oain[1] = ain;
  
  if (ain > 950 || (Millis - oMillis)<200)
    return;
  oMillis = Millis;

  // Serial.println(ain);
  
  int sw;
  for (sw = 0; sw < 10; sw ++) {
    const int sw_lv[] = {889, 800, 700, 611, 514, 419, 338, 231, 132, 70};
    if (ain > sw_lv[sw])
      break;
  }
  // Serial.println(sw);
  
  switch (menu) {
  case 0:
  default:
    menu0_sw(sw); 
    break;
  case 1:
    menu1_sw(sw); 
    break;
  case 2:
    menu2_sw(sw); 
    break;
  }
  
  DrawText();
}

void menu0_sw(int sw) {  
  switch (sw) {
   case 0:
    // START/HOLD
    if (Start)
       Start = 0;
     else
       Start = 1;
    break;
   case 1:
    // CH0 RANGE -
    if (range0 < RANGE_MAX)
      range0 ++;
    break;
   case 2:
    // CH1 RANGE -
    if (range1 < RANGE_MAX)
      range1 ++;
    break;
   case 3:
    // RATE FAST
    if (rate > 0)
      rate --;
    break;
   case 4:
    // TRIG MODE
    if (trig_mode < TRIG_ONE)
      trig_mode ++;
    else
      trig_mode = 0;
    break;
   case 5:
    // SEND
    SendData();
    break;
   case 6:
    // TRIG MODE
    if (trig_mode > 0)
      trig_mode --;
    else
      trig_mode = TRIG_ONE;
    break;
   case 7:
    // RATE SLOW
    if (rate < RATE_MAX)
      rate ++;
    break;
   case 8:
    // CH1 RANGE +
    if (range1 > 0)
      range1 --;
    break;
   case 9:
    // CH0 RANGE +
    if (range0 > 0)
      range0 --;
    break;
   case 10:
   default:
    // MENU SW
    menu ++;
     break;
  }
}

void menu1_sw(int sw) {  
  switch (sw) {
   case 0:
    // START/HOLD
    if (Start)
       Start = 0;
     else
       Start = 1;
    break;
   case 1:
    // CH0 offset +
    if (ch0_off < 1023)
      ch0_off += 1024/VREF[range0];
    break;
   case 2:
    // CH1 offset +
    if (ch1_off < 1023)
      ch1_off += 1024/VREF[range1];
    break;
   case 3:
    // trigger level +
    if (trig_lv < 60)
      trig_lv ++;
    break;
   case 4:
   case 6:
    // TRIG EDGE
    if (trig_edge == TRIG_E_UP)
      trig_edge = TRIG_E_DN;
    else
      trig_edge = TRIG_E_UP;
    break;
   case 5:
    // SEND
    SendData();
    break;
   case 7:
    // trigger level -
    if (trig_lv > 0)
      trig_lv --;
    break;
   case 8:
    // CH1 OFF -
    if (ch1_off > -1023)
      ch1_off -= 1024/VREF[range1];
    break;
   case 9:
    // CH0 OFF -
    if (ch0_off > -1023)
      ch0_off -= 1024/VREF[range0];
    break;
   case 10:
   default:
    // MENU SW
    menu ++;
     break;
  }
}

void menu2_sw(int sw) {  
  switch (sw) {
   case 0:
    // START/HOLD
    if (Start)
       Start = 0;
     else
       Start = 1;
    break;
   case 1:
    if (ch0_mode < 2)
      ch0_mode ++;
    break;
   case 2:
    if (ch1_mode < 2)
      ch1_mode ++;
    break;
   case 3:
   case 7:
    // TRIG channel
    if (trig_ch == 0)
      trig_ch = 1;
    else
      trig_ch = 0;
    break;
   case 5:
    // SEND
    SendData();
    break;
   case 8:
    if (ch1_mode > 0)
      ch1_mode --;
    break;
   case 9:
    if (ch0_mode > 0)
      ch0_mode --;
    break;
   case 10:
    // MENU SW
    menu = 0;
     break;
   case 4:
   case 6:
   default:
    // none
    break;
  }
}

void SendData() {
  Serial.print(Rates[rate]);
  Serial.println("/div (30 samples)");
  for (int i=0; i<SAMPLES; i ++) {
      Serial.print(data[sample + 0][i]*MILLIVOL_per_dot[range0]);
      Serial.print(" ");
      Serial.println(data[sample + 1][i]*MILLIVOL_per_dot[range1]);
   } 
}

void DrawGrid() {
    for (int x=0; x<=SAMPLES; x += 2) { // Horizontal Line
      for (int y=0; y<=LCD_HEIGHT; y += DOTS_DIV) {
        tft.drawPixel(x, y, GRIDCOLOR);
        CheckSW();
      }
      if (LCD_HEIGHT == 240)
        tft.drawPixel(x, LCD_HEIGHT-1, GRIDCOLOR);
    }
    for (int x=0; x<=SAMPLES; x += DOTS_DIV ) { // Vertical Line
      for (int y=0; y<=LCD_HEIGHT; y += 2) {
        tft.drawPixel(x, y, GRIDCOLOR);
        CheckSW();
      }
    }
}

void DrawText() {
  //Status ukur Oscilloscop-> akan ditampilkan pada sebelah kanan layar
  tft.setTextColor(WHITE);
  tft.setTextSize(1);
  tft.setCursor(SAMPLES+13, 5);
  tft.print("MODE");
  tft.setTextColor(CYAN);  
  tft.setCursor(SAMPLES-3, 20);
  tft.print(Ranges[range1]);
  tft.println("/DIV");
  tft.setCursor(SAMPLES+3, 30);
  tft.print(Rates[rate]);
  tft.println("/DIV");
  tft.setTextColor(MAGENTA);
  tft.setCursor(SAMPLES+3, 40);
  tft.println(TRIG_Modes[trig_mode]);
  tft.setTextColor(BLUE);
  tft.setCursor(SAMPLES+3, 50);
  tft.println(trig_edge == TRIG_E_UP ? "UP" : "DN"); 
  tft.setTextColor(RED);
  tft.setCursor(SAMPLES+3, 60);
  tft.println(Modes[ch1_mode]);
  tft.setTextColor(YELLOW);
  tft.setCursor(SAMPLES+3, 70);
  tft.println(trig_ch == 0 ? "T:1" : "T:2");

  //Index skala ukur
  tft.setTextColor(WHITE);
  tft.setTextSize(1);
  tft.setCursor(5, 20);
  tft.println("6.0"); 
  tft.setCursor(5, 50);
  tft.println("5.0"); 
  tft.setCursor(5, 80);
  tft.println("4.0"); 
  tft.setCursor(5, 110);
  tft.println("3.0"); 
  tft.setCursor(5, 140);
  tft.println("2.0"); 
  tft.setCursor(5, 170);
  tft.println("1.0"); 
  tft.setCursor(5, 200);
  tft.println("0"); 
  tft.setCursor(5, 230);
  tft.println("-1"); 
 
#if 0
    GLCD.FillRect(101,txtLINE0,28,64, WHITE);  // clear text area that will be drawn below 
    
    switch (menu) {
      case 0:
        GLCD.GotoXY(SAMPLES + 1,txtLINE0);         // locate curser for printing text
        GLCD.Puts(Ranges[range0]); 
        GLCD.GotoXY(SAMPLES + 1,txtLINE1);         // locate curser for printing text
        GLCD.Puts(Ranges[range1]); 
        GLCD.GotoXY(SAMPLES + 1,txtLINE2);         // locate curser for printing text
        GLCD.Puts(Rates[rate]); 
        GLCD.GotoXY(SAMPLES + 1,txtLINE3);         // locate curser for printing text
        GLCD.Puts(TRIG_Modes[trig_mode]); 
        break;
      case 1:
        GLCD.GotoXY(SAMPLES + 1,txtLINE0);         // locate curser for printing text
        GLCD.Puts("OF1"); 
        GLCD.GotoXY(SAMPLES + 1,txtLINE1);         // locate curser for printing text
        GLCD.Puts("OF2");
        GLCD.GotoXY(SAMPLES + 1,txtLINE2);         // locate curser for printing text
        GLCD.Puts("Tlv"); 
        GLCD.GotoXY(SAMPLES + 1,txtLINE3);         // locate curser for printing text
        GLCD.Puts(trig_edge == TRIG_E_UP ? "UP" : "DN"); 
        break;
      case 2:
        GLCD.GotoXY(SAMPLES + 1,txtLINE0);         // locate curser for printing text
        GLCD.Puts(Modes[ch0_mode]); 
        GLCD.GotoXY(SAMPLES + 1,txtLINE1);         // locate curser for printing text
        GLCD.Puts(Modes[ch1_mode]);
        GLCD.GotoXY(SAMPLES + 1,txtLINE2);         // locate curser for printing text
        GLCD.Puts(trig_ch == 0 ? "T:1" : "T:2"); 
        break;
    }
#endif
}

void DrawGrid(int x) {
    if ((x % 2) == 0)
      for (int y=0; y<=LCD_HEIGHT; y += DOTS_DIV)
        tft.drawPixel(x, y, GRIDCOLOR);
    if ((x % DOTS_DIV) == 0)
      for (int y=0; y<=LCD_HEIGHT; y += 2)
        tft.drawPixel(x, y, GRIDCOLOR);
}

void ClearAndDrawGraph() {
  int clear = 0;
  
  if (sample == 0)
    clear = 2;
#if 0
   for (int x=0; x<SAMPLES; x++) {
     GLCD.SetDot(x, LCD_HEIGHT-data[clear+0][x], WHITE);
     GLCD.SetDot(x, LCD_HEIGHT-data[clear+1][x], WHITE);
     GLCD.SetDot(x, LCD_HEIGHT-data[sample+0][x], BLACK);
     GLCD.SetDot(x, LCD_HEIGHT-data[sample+1][x], BLACK);
  }
#else
   for (int x=0; x<(SAMPLES-1); x++) {
     tft.drawLine(x, LCD_HEIGHT-data[clear+0][x], x+1, LCD_HEIGHT-data[clear+0][x+1], BGCOLOR);
     tft.drawLine(x, LCD_HEIGHT-data[clear+1][x], x+1, LCD_HEIGHT-data[clear+1][x+1], BGCOLOR);
     if (ch0_mode != MODE_OFF)
       tft.drawLine(x, LCD_HEIGHT-data[sample+0][x], x+1, LCD_HEIGHT-data[sample+0][x+1], CH1COLOR);
     if (ch1_mode != MODE_OFF)
       tft.drawLine(x, LCD_HEIGHT-data[sample+1][x], x+1, LCD_HEIGHT-data[sample+1][x+1], CH2COLOR);
     CheckSW();
  }  
#endif
}

void ClearAndDrawDot(int i) {
  int clear = 0;

  if (i <= 1)
    return;
  if (sample == 0)
    clear = 2;
#if 0
   for (int x=0; x<SAMPLES; x++) {
     GLCD.SetDot(x, LCD_HEIGHT-data[clear+0][x], WHITE);
     GLCD.SetDot(x, LCD_HEIGHT-data[clear+1][x], WHITE);
     GLCD.SetDot(x, LCD_HEIGHT-data[sample+0][x], BLACK);
     GLCD.SetDot(x, LCD_HEIGHT-data[sample+1][x], BLACK);
  }
#else
  tft.drawLine(i-1, LCD_HEIGHT-data[clear+0][i-1], i, LCD_HEIGHT-data[clear+0][i], BGCOLOR);
  tft.drawLine(i-1, LCD_HEIGHT-data[clear+1][i-1], i, LCD_HEIGHT-data[clear+1][i], BGCOLOR);
  if (ch0_mode != MODE_OFF)
    tft.drawLine(i-1, LCD_HEIGHT-data[sample+0][i-1], i, LCD_HEIGHT-data[sample+0][i], CH1COLOR);
  if (ch1_mode != MODE_OFF)
    tft.drawLine(i-1, LCD_HEIGHT-data[sample+1][i-1], i, LCD_HEIGHT-data[sample+1][i], CH2COLOR);
#endif
  DrawGrid(i);
}

void DrawGraph() {
   for (int x=0; x<SAMPLES; x++) {
     tft.drawPixel(x, LCD_HEIGHT-data[sample+0][x], CH1COLOR);
     tft.drawPixel(x, LCD_HEIGHT-data[sample+1][x], CH2COLOR);
  }
}

void ClearGraph() {
  int clear = 0;
  
  if (sample == 0)
    clear = 2;
  for (int x=0; x<SAMPLES; x++) {
     tft.drawPixel(x, LCD_HEIGHT-data[clear+0][x], BGCOLOR);
     tft.drawPixel(x, LCD_HEIGHT-data[clear+1][x], BGCOLOR);
  }
}

inline unsigned long adRead(byte ch, byte mode, int off)
{
  unsigned long a = analogRead(ch);
  a = ((a+off)*VREF[ch == ad_ch0 ? range0 : range1]+512) >> 10;
  a = a>=(LCD_HEIGHT+1) ? LCD_HEIGHT : a;
  if (mode == MODE_INV)
    return LCD_HEIGHT - a;
  return a;
}

void  loop() {
 
  if (trig_mode != TRIG_SCAN) {
      unsigned long st = millis();
      byte oad;
      if (trig_ch == 0)
        oad = adRead(ad_ch0, ch0_mode, ch0_off);
      else
        oad = adRead(ad_ch1, ch1_mode, ch1_off);
      for (;;) {
        byte ad;
        if (trig_ch == 0)
          ad = adRead(ad_ch0, ch0_mode, ch0_off);
        else
          ad = adRead(ad_ch1, ch1_mode, ch1_off);

        if (trig_edge == TRIG_E_UP) {
           if (ad >= trig_lv && ad > oad)
            break; 
        } else {
           if (ad <= trig_lv && ad < oad)
            break; 
        }
        oad = ad;

        CheckSW();
        if (trig_mode == TRIG_SCAN)
          break;
        if (trig_mode == TRIG_AUTO && (millis() - st) > 100)
          break; 
      }
  }
  
  // sample and draw depending on the sampling rate
    if (rate <= 5 && Start) {
    // change the index for the double buffer
    if (sample == 0)
      sample = 2;
    else
      sample = 0;

    if (rate == 0) { // full speed, channel 0 only
      unsigned long st = millis();
      for (int i=0; i<SAMPLES; i ++) {
        data[sample+0][i] = adRead(ad_ch0, ch0_mode, ch0_off);
      }
      for (int i=0; i<SAMPLES; i ++)
        data[sample+1][i] = 0;
      // Serial.println(millis()-st);
    } else if (rate == 1) { // full speed, channel 1 only
      unsigned long st = millis();
      for (int i=0; i<SAMPLES; i ++) {
        data[sample+1][i] = adRead(ad_ch1, ch1_mode, ch1_off);
      }
      for (int i=0; i<SAMPLES; i ++)
        data[sample+0][i] = 0;
      // Serial.println(millis()-st);
    } else if (rate == 2) { // full speed, dual channel
      unsigned long st = millis();
      for (int i=0; i<SAMPLES; i ++) {
        data[sample+0][i] = adRead(ad_ch0, ch0_mode, ch0_off);
        data[sample+1][i] = adRead(ad_ch1, ch1_mode, ch1_off);
      }
      // Serial.println(millis()-st);
    } else if (rate >= 3 && rate <= 5) { // .5ms, 1ms or 2ms sampling
      const unsigned long r_[] = {5000/DOTS_DIV, 10000/DOTS_DIV, 20000/DOTS_DIV};
      unsigned long st0 = millis();
      unsigned long st = micros();
      unsigned long r = r_[rate - 3];
      for (int i=0; i<SAMPLES; i ++) {
        while((st - micros())<r) ;
        st += r;
        data[sample+0][i] = adRead(ad_ch0, ch0_mode, ch0_off);
        data[sample+1][i] = adRead(ad_ch1, ch1_mode, ch1_off);
      }
      // Serial.println(millis()-st0);
    }
    ClearAndDrawGraph();
    CheckSW();
    DrawGrid();
    DrawText();
    //SendData(); //kirim data ke serial
  
  
  } else if (Start) { // 5ms - 500ms sampling
  // copy currently showing data to another
    if (sample == 0) {
      for (int i=0; i<SAMPLES; i ++) {
        data[2][i] = data[0][i];
        data[3][i] = data[1][i];
      }
    } else {
      for (int i=0; i<SAMPLES; i ++) {
        data[0][i] = data[2][i];
        data[1][i] = data[3][i];
      }      
    }

    const unsigned long r_[] = {50000/DOTS_DIV, 100000/DOTS_DIV, 200000/DOTS_DIV,
                      500000/DOTS_DIV, 1000000/DOTS_DIV, 2000000/DOTS_DIV, 
                      5000000/DOTS_DIV, 10000000/DOTS_DIV};
    unsigned long st0 = millis();
    unsigned long st = micros();
    for (int i=0; i<SAMPLES; i ++) {
      while((st - micros())<r_[rate-6]) {
        CheckSW();
        if (rate<6)
          break;
      }
      if (rate<6) { // sampling rate has been changed
        tft.fillScreen(BGCOLOR);
        break;
      }
      st += r_[rate-6];
      if (st - micros()>r_[rate-6])
          st = micros(); // sampling rate has been changed to shorter interval
      if (!Start) {
         i --;
         continue;
      }
      data[sample+0][i] = adRead(ad_ch0, ch0_mode, ch0_off);
      data[sample+1][i] = adRead(ad_ch1, ch1_mode, ch1_off);
      ClearAndDrawDot(i);     
    }
    // Serial.println(millis()-st0);
    DrawGrid();
    DrawText();
    //SendData(); //kirim data ke serial
  } else {
    CheckSW();
  }
  if (trig_mode == TRIG_ONE)
    Start = 0;
}




mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Добавьте ОУ на входе. С Кусил=20

holms312
Offline
Зарегистрирован: 11.01.2020

Спасибо, есть ли еще врианты? Например переделать скетч?
Просто боюсь что после ОУ сильно сигнал искозится, усилит помехи

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вам посоветовали единственно правильный вариант. Не следует думать, что характеристики АЦП Ардуино сколь-нибудь превосходят характеристики среднего ОУ.

holms312
Offline
Зарегистрирован: 11.01.2020

Всем спасибо,буду пробовать усилить

holms312
Offline
Зарегистрирован: 11.01.2020

Всем привет, сигнал усилил картинка вполне устраивает. Но пришел к выводу что осциллограф на ардуино достаточно медленно реагирует на сигнал. А ума не хватает построить график на прямую с аналогового входа.
Буду очень признателен тому кто поможет построить график на TFT дисплее 480x320 8bit.
На данный момент картинка такая, все устраивает, только задержка большая ощутимо. И экран еще по непонятной причине мерцает

b707
Offline
Зарегистрирован: 26.05.2017

holms312 пишет:

ума не хватает построить график на прямую с аналогового входа.

если читать данные и сразу выводить на экран - все будет тормозить еще сильнее и самплинг получится очень маленький

 

 

holms312
Offline
Зарегистрирован: 11.01.2020

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

b707
Offline
Зарегистрирован: 26.05.2017

holms312 пишет:

я предположил что и на дисплей будет выводить быстро

ну и направсно. Вывод на дисплей - медленная операция

Кроме того. такая переделка потребует существенного переписывания кода... а судя по первому вопросу, вам это не под силу. Отмасштабировать сигнал на экране - элементарная операция. а вы с ней не справились. Переписать код на синхронный вывод на экран существенно сложнее.

holms312
Offline
Зарегистрирован: 11.01.2020

Что вы имеете ввиду под "отмасштабировать сигнал на экране"?

b707
Offline
Зарегистрирован: 26.05.2017

holms312 пишет:

Что вы имеете ввиду под "отмасштабировать сигнал на экране"?

ваш вопрос в заглавном сообщении.

holms312
Offline
Зарегистрирован: 11.01.2020

Масштаб был увеличен, очень даже не плохо,что полностью устраивает,как и советовали через ОУ

b707
Offline
Зарегистрирован: 26.05.2017

holms312 пишет:

Масштаб был увеличен, очень даже не плохо,что полностью устраивает,как и советовали через ОУ

Через ОУ - это более правильно, о чем вам и написали в ответах. Но это можно было сделать правкой буквально пары строк в скетче. Раз вам это не пришло в голову - я делаю вывод. что этот код для вас - "темный лес", поэтому вы вряд ли осилите написать вывод данных напрямую на экран.

Но если верите в себя - пробуйте. буду рад ошибиться

 

 

holms312
Offline
Зарегистрирован: 11.01.2020

b707 пишет:

holms312 пишет:

Масштаб был увеличен, очень даже не плохо,что полностью устраивает,как и советовали через ОУ

Через ОУ - это более правильно, о чем вам и написали в ответах. Но это можно было сделать правкой буквально пары строк в скетче. Раз вам это не пришло в голову - я делаю вывод. что этот код для вас - "темный лес", поэтому вы вряд ли осилите написать вывод данных напрямую на экран.

Но если верите в себя - пробуйте. буду рад ошибиться

 

 


Если честно совсем не хочется писать на форумах, но приходится. Т.к выхода нет. Да знаний ардуино маловато, да и нет времени углубляться, т.к не основная специальность. Очень много воды и никакой помощи. Хотя бы направление где читать, элементарно не мог найти где вывести график на тфт дисплей. А так всеравно спасибо, за ответ.
Отдельная благодарность тому кто посоветовал сделать на ОУ. Т.к  "можно было сделать правкой буквально пары строк в скетче" , эти пару строк мне никто бы не помог написать)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

holms312 пишет:

Отдельная благодарность тому кто посоветовал сделать на ОУ. Т.к  "можно было сделать правкой буквально пары строк в скетче" , эти пару строк мне никто бы не помог написать)

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

Ибо, если бы кто-то "помог", Вы бы вскоре убедились, что результат получается неудовлетворительный, и все равно нужен ОУ.

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

holms312
Offline
Зарегистрирован: 11.01.2020

andriano пишет:

holms312 пишет:

Отдельная благодарность тому кто посоветовал сделать на ОУ. Т.к  "можно было сделать правкой буквально пары строк в скетче" , эти пару строк мне никто бы не помог написать)

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

Ибо, если бы кто-то "помог", Вы бы вскоре убедились, что результат получается неудовлетворительный, и все равно нужен ОУ.

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


Спасибо вам за отзыв, ОУ было правильное решение.
Единственный актуальный вопрос, если напрямую строить график с аналогового входа, получится увеличить чувствительность графика (скорость построения)?

nik182
Offline
Зарегистрирован: 04.05.2015

Скорость определяется временем записи пикселей на экран. Полная перерисовка экрана - секунды в автоинкрементном цикле. Перерисовка отдельных пикселей быстрее, но когда нужно сначала по одному затереть старые, а потом положить новые и всё это без автоинкремента то скорости тоже получаются очень маленькие. Даже на самых дешёвых осциллографах ставят PLM матрицы на управление дисплеем, что бы получить приемлемые скорости. Есть dso 138 на stm32f1 - это максимум чего можно добиться. Советую посмотреть схему входных цепей. Рисовать сигнал на весь экран это масштабировать существующий. Просто помножить вертикальный адрес пикселя на нужный коэффициент.     

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

holms312 пишет:

Единственный актуальный вопрос, если напрямую строить график с аналогового входа, получится увеличить чувствительность графика (скорость построения)?

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

-NMi-
Offline
Зарегистрирован: 20.08.2018

С етим говнокодом канЭш ничо нипалучиццо. А так на базе avr всё просто: adc в triggering и мы уже собираем данные с равными промежутками времени и аккуратненько в isr_adc складываем их в массив тактов эдак за 100 проца. Всё остальное время - рисуем)))

На базе stm всё гоОораздо проще: натравливаем на adc dma и... кайфуем и рисуем...

Так-шо... пасаны...

nik182
Offline
Зарегистрирован: 04.05.2015

Всё так. Вот только одна точка АЦП это как раз около 100 тактов процессора. Если на экране точек 160 то один экран это около 1 мс набора данных. Максимальную частоту в прямоугольниках можно увидеть 80 кГц. Как то такой осциллограф не понимаю куда применить можно. Лучше уж на блюпиле с выводом на комп.  Там ещё и на других процессорах есть. 

holms312
Offline
Зарегистрирован: 11.01.2020

nik182 пишет:

Всё так. Вот только одна точка АЦП это как раз около 100 тактов процессора. Если на экране точек 160 то один экран это около 1 мс набора данных. Максимальную частоту в прямоугольниках можно увидеть 80 кГц. Как то такой осциллограф не понимаю куда применить можно. Лучше уж на блюпиле с выводом на комп.  Там ещё и на других процессорах есть. 


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

holms312
Offline
Зарегистрирован: 11.01.2020

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

nik182
Offline
Зарегистрирован: 04.05.2015

Попробую написать ещё раз. Без графического сопроцессора на TFT дисплей невозможно вывести без большой задержки. Ни как. Самый минимум это stm32 c ltdc контроллером. В блюпиле ltdc нет :-( 

Где то за 1000 руб можно было взять STM32F429-Discovery с дисплеем. Сейчас она в чипе по 4000. На сайте ST 29.3 $  или вот https://www.avito.ru/sankt-peterburg/tovary_dlya_kompyutera/stm32_f4_discovery_1904063954?slocation=621540

 

b707
Offline
Зарегистрирован: 26.05.2017

holms312 пишет:

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

купите на Али готовый dso138 за тысячу - это вам обойдется раз в пять дешевле, чем сделать такой на основе своего кода

-NMi-
Offline
Зарегистрирован: 20.08.2018

b707 пишет:

- это вам обойдется раз в пять дешевле, чем сделать такой на основе своего кода

До него это очень "туго" доходит, видимо в децтве калькулятор или счёты в руках не держал.  А ща вот дурдуину нашёл и скечч скачал - думает что фсех наипал.  Ан, нет.