Forum Italiano sui Prodotti NI

annulla
Visualizzazione dei risultati per 
Cerca invece 
Intendevi dire: 

Problema con oscilloscopio

Ciao a tutti, sono uno studente di ingegneria e sto usando il labview per un progetto che servirà alla mia tesi.

Come si vede dalle foto che allego ho come obiettivo quello di generare un segnale dal labview grazie al blocchetto "simulate signal", trasferirlo grazie ad una DAQ ad una scheda NI, ed usare la scheda come tramite per poi visualizzarlo sullo schermo di un oscilloscopio. Per visualizzare il segnale in modo continuo ho anche sfruttato la struttura del "while loop". La scheda NI è collegata al computer e all'oscilloscopio con appositi cavi sui suoi ingressi e sulle sue uscite analogiche.

Fatto tutto questo preambolo arrivo al mio problema: il segnale generato dal labview viene visualizzato sullo schermo dell'oscilloscopio, ma in alcuni istanti di tempo appare come interrotto; più precisamente appare interrotto negli istanti in cui termina un loop e inizia il successivo. Nella foto allegata la forma d'onda è una sinusoide, ma succede anche con forme d'onda diverse. Analizzando un po' la situazione credo di aver capito che il problema sta nei gruppi di campioni, i "samples" che genera il blocchetto del simulatore di segnali, ovvero che quando un loop finisce quelli generati al loop successivo non sono perfettamente allineati con quelli del precedente. Ho provato anche ad aumentare nelle impostazioni del generatore di segnali il numero di campioni generati e il numero di campioni al secondo; in questo modo il singolo loop dura per più tempo e l'interruzione del segnale è meno frequente, ma ad ogni modo quando il loop arriva alla fine è comunque presente. Dato che il segnale in questione servirà successivamente a controllare il funzionamento di un motore a corrente continua, devo evitare che il segnale si interrompa e che sia sempre continuo, altrimenti negli stessi istanti si interromperebbe anche il motore. Qualcuno sa come risolvere il problema? Magari c'è qualche blocchetto diverso dal simulatore di segnali, o una struttura diversa che posso usare al posto del "while loop" per raggiungere lo stesso risultato, ma che non conosco. Mi scuso se nella terminologia che uso sono impreciso, ma ho iniziato ad usare il labview da non molto tempo e non ho ancora una conoscenza approfondita.

Per fare più chiarezza possibile allego le immagini di block diagram, impostazioni del simulatore di segnali, impostazioni della DAQ, e le foto della scheda NI e dello schermo dell'oscilloscopio dove si nota l'interruzione del segnale. Nelle ultime due foto in particolare si può leggere anche il modello dell'oscilloscopio e della scheda NI utilizzate.

Grazie mille a chiunque sia in grado di aiutarmi.

0 Kudos
Messaggio 1 di 9
2.573Visualizzazioni

Così, genera un buffer lo scrive poi lo rigenera lo riscrive etc. Esattamente come dici di vedere sull oscilloscopio. Ti do una piccola traccia, prova a cercare producer consumer. In pratica una funzione genera continuamente punti e li mette su una fifo,  l'altra li scoda dalla fifo e li manda in uscita. 

 

Elimina anche i vi express usando i daqmx per fare una generazione continua.

 

 

È molto generico, la producer consumer può essere un po difficile , ma è la strada per poter avere generazione continua.

Buon lavoro

 

0 Kudos
Messaggio 2 di 9
2.548Visualizzazioni

Ti ringrazio tantissimo intanto per i consigli che mi hai dato, spero possano tornarmi utili. Ti faccio una domanda forse banale per chiarirmi le idee, ma purtroppo sto ancora prendendo dimestichezza con labview. Questo "producer consumer" è un blocchetto/struttura che devo cercare sul block diagram? E con "fifo" cosa intendi?

Approfitto per chiederti anche un'ultima cosa: quando blocco il run del programma sullo schermo dell'oscilloscopio ovviamente si ferma anche il segnale, diventando non più una sinusoide ma un valore fisso costante, che però non è zero, ma penso sia l'ultimo valore generato dal simulatore di segnali prima di essere interrotto, visto che ho fatto varie prove ed è diverso di volta in volta quando blocco. Per via del controllo del motore quando fermo il programma è bene che il motore si fermi, e che il segnale diventi costante e anche nullo. Sicuramente questo sarà risolvibile più facilmente, ma hai qualche idea/consiglio anche riguardo a questo?

0 Kudos
Messaggio 3 di 9
2.536Visualizzazioni

Ciao, allora, per producer consumer si intende questo Producer Consumer.

Due loop paralleli quindi, in uno formi la tua waveform, questa la metti in una coda (enqueue) che hai creato con lo stesso tipo di dato (obtain queue).

Nel loop sotto, invece scodi i dati (dequeue) che inserisci in una daqmx write (puoi crearti un task in max per generate contonous) quindi nel loop ti basta fare la write appunto su quel task (il loop non è temporizzato, perché si temporizza con il write daqmx). Per dare un segnale fisso a zero volt quando vuoi, basta che scrivi zero su write (con un case sull'enqueue magari usi nel caso false il segnale generato, nel caso true una costante a zero.

Se usi abort per fermare il vi, non pulisci il buffer di generazione che si congela all'ultimo stato di tensione generato, quindi oscilloscopio rimane costante all'ultimo punto generato. Dovresti interrompere il loop con un pulsante di stop e in uscita al loop devi usare un clearTask.vi.

 

 

 

0 Kudos
Messaggio 4 di 9
2.529Visualizzazioni

Ti allego un esempio, 

I due loop come ti dicevo, uno accoda i dati generati e l'altro li scoda e li invia in uscita.

 

Il selettore selezione se inviare la waveform generata o una fake con un elemento a 0V(così sull'oscilloscopio dovrebbe stare a zero V).

 

Quando interrompi il primo loop, con lo stop la coda viene rilasciata, per cui si ferma per errore di mancato riferimento coda, anche il loop consumer.

 

Se vuoi assicurare che quando premi stop, prima di uscire di porta a zero il segnale, puoi usare una Or e lo stop lo inserisci negato, insieme al selettore.

 

Buon Lavoro,

 

Ciao

0 Kudos
Messaggio 5 di 9
2.520Visualizzazioni

Non so davvero come ringraziarti, purtroppo per vedere se funziona e se il problema è risolto dovrò aspettare di tornare in laboratorio all'università tra qualche giorno, ma sono sicuro che qualche passo avanti in questo modo verrà fatto. Se ci fossero altri problemi darò altri aggiornamenti qui, grazie ancora.

0 Kudos
Messaggio 6 di 9
2.515Visualizzazioni

Figurati, spero ti aiuti a fare u bel lvoro sulla Tesi.

 

Ricordati di impostare la costante del canale fisico con il canale ce hai collegato realmente (io ne ho messo uno di una scheda che avevo io (Dev1/AO0).

 

0 Kudos
Messaggio 7 di 9
2.510Visualizzazioni

Ciao, in questi mesi ho fatto molti passi avanti con la tesi, e anche grazie a te sono riuscito a implementare le DAQmx nel block diagram. Non è stato necessario usare due While Loop con la struttura producer/consumer, ma uno solo per avere un block diagram più semplice e immediato, e mi sembra che il problema dell'interruzione del segnale tra un loop e l'altro sia risolto. Sono rimasto con un unico problema al momento: ho usato un piccolo stratagemma per avere l'annullamento del segnale quando premo il pulsante di stop sul front panel, come vedi dalla foto che metto in allegato, e si tratta della parte con il selettore vicino al simulatore di segnali; quando però premo il pulsante di stop nonostante l'algoritmo si fermi, compare il messaggio di errore che vedi sempre nella foto che allego, e il segnale non assume un valore nullo all'ultimo istante come vorrei. Ho anche provato ad aggiungere le DAQmx "Wait Until Done" e "Stop Task" ma non ho risolto. Hai qualche consiglio a riguardo? Ti ringrazio già in anticipo.

Scarica tutti
0 Kudos
Messaggio 8 di 9
2.353Visualizzazioni

Hai messo lo start del task dopo la write, devi metterlo all inizio. quando va in esecuzione la write automaticamente esegue lo start del task, quando esce si trova un altro start che restituisce l'errore perché il task è già in esecuzione. 

Comunque il codice così non va bene, magari funziona ma il tempo ciclo lo sta gestendo l'acquisizione con 100000/1000000 = 0,1s ovvero 100ms.

Hai un buffer piccolo di 100000 quindi se il generate signal o la parte sopra ti rallenta l'esecuzione alla lunga potresti avere un errore sui buffer.

Lo stratagemma funziona ma stai ancora generando in uscita, anche se moltiplichi per 0 ottenendo un output nullo. Forse meglio se gli mettevi un vettore a zero. 

 

0 Kudos
Messaggio 9 di 9
2.326Visualizzazioni