¿Cómo puedo reconstruir los datos exportados del osciloscopio?

0

Quiero reconstruir los datos del osciloscopio importados en una hoja de cálculo directamente desde mi osciloscopio Velleman PCSU200.

Los datos de interés principal son la frecuencia y la amplitud, no estoy interesado en ningún otro dato.

La información en la hoja de cálculo es similar a la imagen (fragmento) que se muestra a continuación: (los datos resultantes son más de 4000 filas, por lo que son demasiado grandes para publicar aquí; puedo hacer que esté disponible para descargar si es necesario.

Mi pregunta es, ¿cómo puedo calcular la frecuencia y la amplitud a partir de los datos dados? La configuración de la amplitud en el alcance siempre será fija para el propósito de estas mediciones si eso ayuda, sin embargo, la base de tiempo variará.

EDITAR:Heagregadounaimagenrevisadadelacapturadelahojadecálculo.Además,heañadidounacapturadepantalladelapantalladealcance.Comopuedeverse,seestámostrandounaformadeondade1kHz.

EDIT2Sólousaréondassinusoidalespuras.

Losdatosdelahojadecálculosepuedendescargar aquí . (es un archivo de texto simple con una extensión .txt, por lo que simplemente se procesará en su navegador web)

    
pregunta Tony

2 respuestas

1

La información que necesita está casi toda en la parte superior del volcado de datos:

  • Frecuencia de muestreo
  • voltaje de escala completa
  • nivel del suelo

Falta una pieza: probablemente es un ADC de 8 bits, es decir, cuenta de 0 a 255, lo que se puede inferir de que la GND está aproximadamente a la mitad (127). Pero confírmelo en la hoja de datos de Velleman.

Entonces, cuente el número de muestras N entre picos (por ejemplo, picos positivos) o mejor, cruces de "cero" positivos (donde "cero" = 127, el nivel de GND).

Frecuencia = Velocidad de muestreo / N.

El voltaje de cualquier muestra S dada es (S - 127) * Escala completa / 256.

La amplitud es simplemente la tensión máxima, mejor calculada como
(Voltaje (pico positivo) - Voltaje (pico negativo)) / 2
lo que da cuenta de cualquier compensación DC. Tiene una hoja de cálculo allí mismo, es ideal para el trabajo.

    
respondido por el Brian Drummond
1

enlace

  

......   
y no se trata de ...   
Software de programación para PC.   
...

Esta pregunta es algo ... ish fuera de tema. Pero pensé que, dado que conozco una solución C ++, es mejor que la comparta.

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[]){

  if(argc!=2){
      cout << "Drop a file on me or"<<
              "call me from the command line with one argument.\n\n";
      //cin.get();//pause, useful for when you drop a file onto the exe.
      return 1;
  }else{
    cout << "You rang?\n\n";
  }


  string suffix(argv[1]);//convert to string

  if(suffix.length()<5){
    //bad names are: "t", "xt", "txt", ".txt"
    //good names are: "a.txt" or "abc.txt"
    cout << "Doesn't look good Sonny," <<
            " give me a file on the format of \"*.txt\".\n\n";
    //cin.get();//pause, useful for when you drop a file onto the exe.
    return 1;
  }else{
    cout << "The length checks out.\n\n";
  }

  suffix.erase(0,suffix.length()-3);

  if(suffix!="txt"){
    cout << "Accepted type is \"txt\", yours is \"" << suffix << "\"\n\n";
    //cin.get();//pause, useful for when you drop a file onto the exe.
    return 1;
  }else{
    cout << "Got a file of the correct type. Let's proceed.\n\n";
    cout << "===========================================\n\n";
  }



  ifstream file(argv[1]);//let's finally open the file
  string row; //contains row of document, with a ',' as a delimiter
  unsigned int samples, 
           sample_rate, 
           ground,data, 
         previous_data,
       zero_crossing=0,
                 end=0,
              start=-1;

  //First get the number of samples and sample rate.

  getline(file,row,'-');//throw away first part
  file >> samples; //acquired samples.
  cout << "Number of samples = " << samples << endl;    
  getline(file,row,',');//skip
  getline(file,row,',');//skip

  file >> sample_rate; //acquired the sample rate
  cout << "Sample rate = " << sample_rate << endl;

  getline(file,row,',');//skip
  getline(file,row,',');//skip

  file >> ground;
  cout << "Ground level = " << ground << endl << endl;

  //Okay, now we just need to read the rest of the document     
  for(unsigned int i=0;i<samples;++i){
    getline(file,row,',');//skip the "Data0" text
    previous_data=data;
    file >> data;


    if(data<ground && previous_data>=ground){
    //we've just passed ground and we're going upwards.
      if(start==-1){
        //is this the first time we've came across this zero crossing?
        start=i;    
      }else{
        zero_crossing++;
        //this is a potential stop
        end=i;  
      }
    }
  }

  double mean_period = (end-start)/((double)zero_crossing);
  double frequency = sample_rate / mean_period;


  cout << "First occurance of a negative edge = " << start << endl;
  cout << "Last occurance of a negative edge = " << end << endl;
  cout << "Length between those two = " << end-start << endl;
  cout << "Number of crossings detected = " << zero_crossing << endl;
  cout << "Mean length per period = " << mean_period << endl;
  cout << "Frequency = " << frequency << endl;


  cout << endl << endl;
  //cin.get();//pause, useful for when you drop a file onto the exe.
  return 0;
}

Compilado con el siguiente comando: " g ++ -std = c ++ 11 main.cc ", asumiendo que guarda el código anterior en un archivo llamado " main.cc ".

He intentado comentar cosas que "parecen extrañas" o necesitan algunos comentarios para que sea más fácil de seguir.

El algoritmo es esencialmente: Detecta cero cruces con una derivada negativa. Registre la primera vez y la última vez que ocurrió y cuente cuántas veces ocurrió.

Resta la primera vez de la última vez para obtener la longitud de N períodos. N períodos que son iguales al número de cruces por cero ocurridos. Ahora tiene la duración de un período que se ha promediado en todos los períodos detectados.

Calcule la frecuencia dividiendo la frecuencia de muestreo con la duración de un período y presente estos datos.

Así es como se ve en acción, en una máquina Linux.

Noestoysegurodesisoymalo,peronopudecolocarunarchivoenelarchivo"a.out", por lo que no pude probar lo que normalmente podría hacer en Windows. Pero dejé algunos comandos de "pausa" en el código que puede eliminar en caso de que quiera ver la información.

    
respondido por el Harry Svensson

Lea otras preguntas en las etiquetas