Salta al contenuto
Note per Studenti Acquisizione e generazione da programma - LabVIEW e Matlab

Acquisizione e generazione da programma - LabVIEW e Matlab

In questa pagina 3

Un esperimento di laboratorio con molti punti di misura (la risposta in frequenza di un amplificatore, la caratteristica di un diodo) è lungo e ripetitivo da eseguire a mano. Si collegano gli strumenti al computer e si scrive un programma che imposta il generatore, acquisisce i dati, li elabora e li salva. Il corso presenta due ambienti, LabVIvirtual instrument: un programma LabVIEW, con pannello frontale e diagramma a blocchiEW e Matlab. Dall'anno 2024-25 la lezione dichiara che all'esame non ci sono domande su LabVIEW, ma nei temi del 2019 e 2021 compaiono quesiti sul codice, e i concetti (trigger, tempo di acquisizione, timeouttempo massimo di attesa oltre il quale il programma termina con errore) servono comunque.

LabVIEW

LabVIEW (Laboratory Virtual Instrument Engineering Workbench) è un ambiente di programmazione grafico che collega gli strumenti al computer. Un programma si chiama VI (virtual instrument) e ha due finestre:

  • il pannello frontaleinterfaccia utente del VI, con controlli e indicatori (front panel): l'interfaccia utente, come lo strumento fisico. Contiene i controlliingressi del programma che l'utente può modificare (ingressi che l'utente modifica: numeri, interruttori, scelte) e gli indicatoriuscite del programma: numeri, grafici, risultati (uscite: risultati, grafici). Devono essere comprensibili e contenere tutte le informazioni necessarie all'operatore;
  • il diagramma a blocchi (block diagram): il "codice sorgente", scritto in forma di diagramma e non di testo. Per ogni controllo e indicatore compare un terminalerappresentazione sul diagramma di un controllo o indicatore (ingressi con freccia uscente, uscite con freccia entrante; il tipo, per esempio DBL, indica un numero in virgola mobile a precisione doppia). Le funzioni (somma, trigonometria, stringhe, cicli, elaborazione di segnali) sono icone con pin di ingresso e di uscita, collegate ai terminali da fili.

Il modello di esecuzione è a flusso di datimodello in cui un blocco esegue quando tutti i suoi ingressi sono disponibili (dataflow): un blocco viene eseguito quando tutti i suoi ingressi sono disponibili; la lunghezza del filo non conta. Esempio minimo: due controlli numerici AA, BB collegati agli ingressi della funzione somma e uscita collegata all'indicatore: il VI calcola A+BA+B. Per il debug si usano i breakpointpunto in cui si interrompe l'esecuzione per il debug (si ferma l'esecuzione) e le probesonda software che mostra il valore su un filo durante l'esecuzione (si legge il valore sul filo).

Acquisizione da un oscilloscopio

Per leggere una forma d'onda da un oscilloscopio comandato dal PC si usano driversoftware del costruttore che permette di comandare lo strumento dal computer del costruttore: le funzioni di configurazione impostano scale e trigger e un'istruzione di tipo Single waveform (acquisizione di una traccia) restituisce i campioni.

Esempio (tema di settembre 2021). Il parametro "Time scale" è 100100 ms/div; "Edge slope" positiva; "Trigger level" 11 V; segnale v(t)=0,2sin⁡(2π 200 t)v(t)=0{,}2\sin(2\pi\,200\,t).

  1. Tempo minimo di una single waveform: con 1010 divisioni orizzontali il tempo necessario per acquisire una finestra è Tw=100 ms/div×10=1T_w=100\ \text{ms}/\text{div}\times10=1 s.
  2. Dipende dal trigger? Sì: l'acquisizione inizia solo dopo un evento di trigger valido (condizione su livello e pendenza), quindi al tempo di acquisizione deterministico si aggiunge un tempo di attesa aleatorio (Trigger e sincronizzazioneIl trigger fa partire l'acquisizione sempre dallo stesso punto di un segnale periodico, per avere una traccia stabile. Si imposta con sorgente, livello, pendenza (fronte di salita o discesa), modo (auto, normal, single), hold-off e posizione ($t=0$ = istante di trigger). Il livello deve cadere dentro l'escursione del segnale, $V_{min}<V_{trig}<V_{max}$ (meglio dove la pendenza è massima); con accoppiamento AC cambia l'escursione. Segnali con più passaggi per il livello in un periodo si risolvono con un livello tra le ampiezze degli impulsi o con un hold-off poco più corto del periodo. Per segnali a bassissima frequenza si disattiva l'auto.Trigger e sincronizzazione →, Ciclo di acquisizione, memoria e visualizzazioneIl DSO lavora a cicli $T_{cycle}=T_A+T_B+T_C$: acquisizione $T_A=T_w$ (scelta dall'operatore), ripristino $T_B$ (tempo morto, dipende dall'hardware), attesa dell'evento di trigger $T_C$ (aleatorio). Velocità massima di aggiornamento $1/(T_A+T_B)$, duty cycle $d=T_A/T_{cycle}$. La memoria di acquisizione ha $N$ campioni (acquisizione massima $NT_s$); la memoria grafica ha $N_V=1000$ pixel di durata $\Delta T=T_w/N_V$. Se $\Delta T>T_s$ si decima: modalità uniform, high resolution (media), peak detect (vede i glitch), envelope; se $T_w>NT_s$ si decima già prima di scrivere in memoria; se $\Delta T<T_s$ si interpola.Ciclo di acquisizione, memoria e visualizzazione →).
  3. Livello 11 V con segnale compreso tra −0,2-0{,}2 e +0,2+0{,}2 V: il segnale non raggiunge mai il livello, l'evento di trigger non si verifica e l'istruzione resta bloccata in attesa di un trigger valido; se è impostato un timeout il programma termina con un errore di timeout.
  4. Livello corretto: compreso nell'escursione, −0,2 V<Vtrig<0,2 V-0{,}2\ \text{V}<V_{trig}<0{,}2\ \text{V} (in pratica attorno a 00 V, dove la pendenza è massima).

Nei temi del 2019 si chiede, davanti a una porzione di codice che genera o acquisisce un segnale, di descrivere in poche righe le tre sezioni: tipicamente configurazione dello strumento (forma d'onda, frequenza, ampiezza, scale, trigger), generazione o acquisizione vera e propria, chiusura della sessioneoggetto che raccoglie i canali e le impostazioni dell'acquisizione e gestione degli errori.

Matlab e il Data Acquisition Toolbox

Con Matlab si controllano le schede di acquisizione (Schede di acquisizione datiUna scheda di acquisizione dati (DAQ) campiona e quantizza segnali di tensione e li salva in un buffer FIFO senza perdere campioni, per un'analisi offline; l'oscilloscopio invece visualizza in tempo reale e ha tempi morti. Blocchi: ingressi con multiplexer, amplificatore a guadagno programmabile (PGA) o per strumentazione, ADC (risoluzione fissa), buffer, uscite DAC per generare segnali di test. Ingressi single-ended (riferiti a massa, $V_{mis}=V_i-V_{GND}$) o differenziali ($V_{mis}=V_+-V_-$, reiezione del modo comune); sorgenti grounded o floating; anello di massa: $V_{HL}=V_x+E_C$. Campionamento simultaneo (un clock per tutti) o sequenziale (sfasamento $\Delta t$ tra canali).Schede di acquisizione dati →) e si elaborano i dati (Segnali e sistemi in Python - campioni, convoluzione e filtriAl calcolatore un segnale continuo è un vettore di campioni con un asse dei tempi. Con numpy si definiscono i segnali, si approssimano area ed energia con somme moltiplicate per il passo, si calcola la convoluzione continua con np.convolve(x, y)*dt (asse = somma degli istanti iniziali), si simulano filtri con equazioni alle differenze e si verificano numericamente linearità e tempo-invarianza.Segnali e sistemi in Python - campioni, convoluzione e filtri → mostra un flusso analogo in Python). Un programma per tracciare la caratteristica VV-II di un diodo con una scheda myDAQ ha questa forma (interfaccia a sessione del Data Acquisition Toolbox):

matlab
devices = daq.getDevices;                     % elenco delle schede collegate (serve l'ID)
s = daq.createSession('ni');                  % sessione di lavoro
ch_in1 = addAnalogInputChannel(s, devices.ID, 'ai0', 'Voltage');   % tensione sul diodo
ch_in2 = addAnalogInputChannel(s, devices.ID, 'ai1', 'Voltage');   % tensione sullo shunt
ch_out = addAnalogOutputChannel(s, devices.ID, 'ao0', 'Voltage');  % tensione di prova

measPoints = (-2.4:0.05:0.8)';                % valori costanti da riprodurre in uscita
measPeriod = 0.1;                             % s tra due punti, per far assestare il circuito
s.Rate = 1 / measPeriod;                      % stessa frequenza per DAC e ADC
queueOutputData(s, measPoints);               % carica il buffer di uscita
data = s.startForeground();                   % genera e acquisisce insieme
Vd = data(:, 1);  I = data(:, 2) / Rshunt;    % caratteristica: corrente in funzione di Vd
  • Sessione: contiene tutti i canali e le impostazioni; ogni canale si aggiunge con addAnalogInputChannel/addAnalogOutputChannel con tre argomenti (ID della scheda, etichetta del canale ai0, ao0..., tipo di misura 'Voltage');
  • il buffer di uscita va riempito prima (queueOutputData) e la frequenza FsF_s è l'inverso del periodo di ogni punto;
  • startForeground avvia insieme generazione e acquisizione e finisce quando il buffer di uscita è esaurito; restituisce una matrice con una colonna per canale di ingresso (con un solo canale è un vettore colonna, senza canali è vuota);
  • durata dell'intera misura: Npunti⋅TpN_{punti}\cdot T_p: 65⋅0,1=6,565\cdot0{,}1=6{,}5 s (N=0,8−(−2,4)0,05+1=65N=\frac{0{,}8-(-2{,}4)}{0{,}05}+1=65).

Il campo [−2,4; +0,8][-2{,}4;\ +0{,}8] V è scelto in modo che il diodo (tensione zener 2,72{,}7 V, soglia di conduzione diretta 0,90{,}9 V nell'esempio del corso) sia provato in tutte le zone: interdetto, conduzione diretta, conduzione inversa (zener) senza superare la corrente massima erogabile dall'uscita della scheda.

Errori comuni

  • Dimenticare che l'acquisizione parte dal trigger: se il livello è fuori dall'escursione il programma sembra "bloccato".
  • Contare il tempo di una scansione solo dalla durata di una traccia e non dal numero di punti.
  • Mescolare ingressi della scheda (ai) e uscite (ao) nella stessa lista senza definire la frequenza comune.
  • Impostare un livello di trigger a 11 V su un segnale da ±0,2\pm0{,}2 V: il codice non termina.

Versione ripasso

Teoria collegata