next up previous
Next: Determinazione di ampiezza e Up: Gestione di un oscilloscopio Previous: Parlare con l'emulatore


Acquisizione e grafico dei dati

Una volta verificato che si riesce a parlare con l'emulatore, bisogna provare a leggere e fare un grafico della funzione d'onda raccolta. Siccome l'oscilloscopio restituisce i dati come interi, per fare un grafico questi devono essere convertiti secondo l'equazione (1). Per fare questa operazione possiamo usare il seguente approccio:

  1. fare un programma che configuri l'oscilloscopio, acquisisca la funzione d'onda e scriva su terminale le costanti di conversione ed i valori della funzione d'onda;
  2. usare la ridirezione dell'output per scrivere questi dati su di un file;
  3. scrivere una macro di ROOT che definisca una funzione in grado di leggere tale file e restituire un grafico della funzione d'onda che poi possiamo disegnare.
Realizzare un programma che configuri l'oscilloscopio ed acquisisca una funzione d'onda secondo questo schema:

  1. aprire una porta seriale per comunicare con l'oscilloscopio;
  2. definire il trigger: livello, salita o discesa, e canale sorgente;
  3. definire la scale dei tempi, quella verticale ed il canale da osservare;
  4. interrogare l'oscilloscopio per recuperare i valori di $X_{0}$, $X_{\textrm{incr}}$, $Y_{0}$, $Y_{\textrm{mult}}$ and $Y_{\textrm{off}}$;
  5. scrivere queste costanti su terminale;
  6. acquisire una funzione d'onda;
  7. scrivere il risultato su terminale.
Siccome bisognerà misurare la fase relativa tra la forzante e la risposta del circuito, quasi sempre sarà conveniente triggerare sul canale 1 al passaggio dello zero in salita (fissando la fase della forzante a zero) e leggere il canale 2. Spesso invece si cambieranno i valori delle scale quindi sarebbe comodo passare da linea di comando i valori delle scale dei tempi e delle tensioni.

Scrivere il programma in modo che accetti i valori delle scale dei tempi e delle tensioni da riga di comando. Per fare questo sarà necessario dichiarare la funzione main nella sua forma completa:
int main(int argc, char* argv[])
ed a questo punto gli argomenti da riga di comando saranno contenuti nelle stringhe argv[1] e argv[2], che possono essere lette tramite sscanf. Bisognerà poi usare sprintf per inserirlo nella stringa da inviare alla porta seriale tramite WriteSerial.

Realizzare una macro di ROOT che definisca una funzione
TGraph* LeggiOnda( char* inputfile, char* outputfile)
che legga dal file inputfile le costanti di conversione, ricostruisca la funzione d'onda, stampi i punti cosí calcolati nel file outputfile e ne faccia il grafico.

La parte concettualmente complicata di questo esercizio è il fatto che non è possibile per una funzione restituire un oggetto TGraph, ma può solo restituire un TGraph*. È quindi necessario per la funzione allocare dinamicamente l'oggetto. Questa operazione deve essere fatta utilizzando la sintassi del C++ che è diversa da quella del C: la funzione malloc viene sostituita dall'operatore new e LeggiOnda dovrà quindi contenere i seguenti frammenti di codice:

TGraph* LeggiOnda( char* inputfile, char* outputfile) { 
/* Dichiarazione di un puntatore ad oggetti TGraph */ 
TGraph* grafico; 
$\vdots $ 
/* Allocazione dinamica dell'oggetto TGraph */ 
grafico = new TGraph; 
$\vdots $ 
/* lettura del file di input, inserimento dei punti  
nel grafico, scrittura sul file di output */ 
$\vdots $ 
/* Al termine della macro restituiamo un puntatore all'oggetto costruito */ 
return grafico; 
}

In teoria il grafico che viene ricostruito dovrebbe essere un'onda sinusoidale.

Provate a far partire l'emulatore del circuito RLC con una frequenza di 10 kHz ed acquisire una funzione d'onda con scala orizzontale 0.1 ms/div. Ottenete davvero un'onda sinusoidale? Se no, perché? Che soluzione possiamo adottare?


next up previous
Next: Determinazione di ampiezza e Up: Gestione di un oscilloscopio Previous: Parlare con l'emulatore
Attilio Andreazza 2003-05-07