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 , collegati agli ingressi della funzione somma e uscita collegata all'indicatore: il VI calcola . 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" è ms/div; "Edge slope" positiva; "Trigger level" V; segnale .
- Tempo minimo di una single waveform: con divisioni orizzontali il tempo necessario per acquisire una finestra è s.
- 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 →).
- Livello V con segnale compreso tra e 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.
- Livello corretto: compreso nell'escursione, (in pratica attorno a 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 - di un diodo con una scheda myDAQ ha questa forma (interfaccia a sessione del Data Acquisition Toolbox):
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/addAnalogOutputChannelcon tre argomenti (ID della scheda, etichetta del canaleai0,ao0..., tipo di misura'Voltage'); - il buffer di uscita va riempito prima (
queueOutputData) e la frequenza è l'inverso del periodo di ogni punto; startForegroundavvia 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: : s ().
Il campo V è scelto in modo che il diodo (tensione zener V, soglia di conduzione diretta 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 V su un segnale da V: il codice non termina.
Versione ripasso
- LabVIEW: VI con pannello frontale (controlli = ingressi, indicatori = uscite) e diagramma a blocchi (terminali, fili, funzioni, flusso di dati); breakpoint, probe.
- Single waveform da oscilloscopio: durata minima s/div ( ms/div: s); dipende dal trigger (attesa aleatoria); livello fuori escursione ( V per V): programma bloccato fino al timeout; livello corretto V (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 →).
- Matlab: sessione, canali (ID,
ai0,'Voltage'),queueOutputData,startForeground(restituisce matrice colonne = canali); ; durata ( s) (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 →). - Errori: trigger fuori escursione, durata dalla sola traccia, frequenza comune non definita.
- LabVIEW: il VI ha pannello frontale (controlli = ingressi, indicatori = uscite) e diagramma a blocchi (terminali, funzioni con pin, fili); esecuzione a flusso di dati; breakpoint e probe per il debug.
- Settembre 2021: ms/div single waveform s più l'attesa del trigger; livello V su un segnale da V: nessun evento, istruzione bloccata fino al timeout; livello corretto tra e V.
- Matlab myDAQ:
queueOutputDatariempie il buffer di uscita,startForegroundgenera e acquisisce insieme con lo stesso e restituisce una colonna per canale; da a V in passi da V: punti s s.