Simulazioni LTspice convertite in documenti LaTeX

Simulazioni LTspice convertite in documenti LaTeX

Introduzione

LTspice è un software di simulazione di circuiti elettronici analogici sviluppato dal noto produttore di semiconduttori Analog Devices. Basato sul venerabile e storico programma SPICE (Simulation Program with Integrated Circuit Emphasis) un programma di simulazione circuitale presentato nella sua prima versione nel lontano 1973 seguito da successivi rilasci ai quali hanno fatto riferimento una nutrita pletora di programmi di simulazione.

Per le operazioni di simulazione circuitali probabilmente LTSpice è tra i software più utilizzati in ambito industriale/privato poiché, pur essendo un software free, non pone alcune restrizioni all’uso. Presenta molti modelli di componenti di vario tipo compresi circuiti integrati principalmente – e “quasi esclusivamente” – del produttore Analog Devices come gli integrati della serie AD, ADG, ADM, ADP, LT, LTC e OP. Non mancano contributi “esterni” nei modelli implementati nel software; ad esempio alcuni MOSFET a canale N e P della nipponica Toshiba oppure alcuni prodotti (e.g. induttori mutuamente accoppiati) della teutonica Wurth Elektronik. In ogni caso niente e nessuno vieta di aggiungere ulteriori modelli provenienti da altri costruttori e simulatori a patto che la sintassi che li descrive risulti “SPICE compatibile“, in altre parole leggibile anche da LTspice.

Primo passaggio, esportazione dei dati

Perché questo preambolo su LTspice in una sezione dedicata a \TeX - \LaTeX? In alcuni casi si potrebbe avere la necessità di inserire all’interno di un documento – di rilevante qualità – il risultato di una simulazione eventualmente limitata a un range di valori.

Per mantenere una elevata qualità del documento non è possibile utilizzare una “comune” immagine jpg, png o simili, ma c’è la necessità di ricorrere ad una soluzione più adeguata al contesto di utilizzo. La cosa migliore sarebbe salvare su specifico file i dati che generano il grafico nel simulatore quindi riprodurne l’andamento nel documento direttamente dall’interpretazione dei dati originali. Come operare?

La prima domanda da porsi è: esiste un modo per salvare su file i valori punto per punto del risultato della simulazione? La riposta è affermativa e la modalità è riportata nel seguito con una semplice procedura utilizzando il file astable.asc già presente nei circuiti d’esempio di LTspice. Lanciando la simulazione e visualizzando l’andamento, ad esempio della tensione sul collettore del BJT Q1 risulta l’output visibile in basso.

 

Ottenuto il risultato della simulazione ci si pone la seconda domanda: è possibile riportare quell’andamento su un file (documento) \LaTeX senza passare le immagini in formato emf esportate dallo stesso programma tantomeno dagli screenshot del desktop? Vale la pena ricordare che emf (Extended Windows Metafile) è un formato di grafica vettoriale, una versione a 32 bit del formato originale wmf di Microsoft Windows il quale supporta solo dati a 16 bit. L’emf salva i dati dell’immagine in un formato RGB e non supporta i dati CMYK.

Il formato emf in GNU/Linux si può aprire senza alcun problema utilizzando, ad esempio, programmi come LibreOffice Draw e Inkscape (immagini in basso) presenti nei repository di tutte le distribuzioni.

 

Queste soluzioni, però, ancora non soddisfano ciò che si vuole ottenere perché occorrerebbe sempre esportare il tutto come immagine jpg o png ritornando così al punto di partenza, pertanto una terza domanda è d’uopo: esiste un pacchetto, ambiente o libreria che in \LaTeX permetta di realizzare un grafico in due dimensioni prendendo i dati direttamente dai valori simulati da LTspice? E soprattutto, come si ottengono i valori appartenenti all’asse X e all’asse Y qualsiasi cosa essi rappresentino?

Parto dal rispondere all’ultima domanda poiché immediata: una volta termina la simulazione e visualizzato il grafico di interesse, è sufficiente un click con il tasto destro del mouse sull’area del grafico e dal menù contestuale optare per File quindi Export data as text (immagine al lato, click per ingrandirla). Verrà aperta una finestra di pop-up nella quale sarà sufficiente selezionare la grandezza (tensione/corrente) per la quale se ne vogliono esportare i dati, scegliere il nome e il percorso dove salvare il file quindi procedere al suo salvataggio cliccando su OK. Il file così salvato è un normale file di testo (estensione txt) consultabile con qualsiasi editor di testi. Come si può osservare (immagine in basso) il file è caratterizzato praticamente da due colonne e da un numero più o meno elevato di righe; oltre 3200 per la simulazione in parola. Il numero di colonne potrebbe essere superiore se si esportano i dati, ad esempio, di due o più nodi del circuito oppure si effettua l’analisi in frequenza del circuito che si sta simulando (la frequenza sull’asse delle X, modulo in dB e fase in gradi sull’asse delle Y). Nel caso specifico nella prima colonna è riportato il tempo (valori asse delle X) e nella seconda il valore che la grandezza riportata sull’ordinata – tensione sul collettore in questo specifico caso – assume per quel dato istante di tempo.

Una possibile implementazione in \LaTeX

Per ottenere un grafico di alta qualità che si divincoli dall’utilizzo di immagini di dubbia qualità all’interno di un documento di un certo pregio, dopo aver salvato i dati della simulazione è possibile produrre il grafico utilizzando il pacchetto pgfplots presente di default, se si è optato per l’installazione completa, in TeX Live 2021.

Pgfplots è un pacchetto basato su Pgf/TikZ e in quanto tale occorre inserirlo all’interno dell’ambiente TikZ/tikzpicture. Permette la creazione di grafici tecnico/scientifici di alta qualità in scala lineare e logaritmica, in due dimensioni e tridimensionali il tutto condito da una “interfaccia intuitiva” direttamente in \TeX.

L’idea alla base vede, da parte del programmatore, il fornire in ingresso i dati analitici per uno o più grafici, il nome degli assi, una eventuale didascalia …et voilà, pgfplots applica la scala sugli assi con le relative suddivisioni, calcolerà eventuali logaritmi, disegnerà il grafico e riporterà didascalie e nomi degli assi.

Come già ricordato, pgfplots è costruito completamente sull’infrastruttura TikZ/Pgf pertanto la conoscenza di TikZ potrà semplificare la stesura dei sorgenti con pgfplots, sebbene non sia assolutamente indispensabile.

L’obiettivo è creare un grafico molto simile,s e non uguale anche nei colori, all’output visibile in LTspice. Il sorgente |LaTeX che permette di raggiungere tale risultato è riportato di seguito:

\documentclass{article}
\usepackage{pgfplots}

\pgfplotsset{grid style={dotted,gray}}
\pgfplotsset{seleziona range valori/.style 2 args={
    x filter/.code={
        \ifnum\coordindex<#1\def\pgfmathresult{}\fi
        \ifnum\coordindex>#2\def\pgfmathresult{}\fi
    }
}}

\begin{document}
\begin{tikzpicture}

   \begin{axis}[
      axis background/.style={fill=black},
      grid=both,
      title=V(n003),
      xlabel={$t$},
      ylabel={$V_{C_{Q1}}$},
      ymin=0,
      ymax=5,
      ytick distance=0.5,
      tick label style={font=\tiny},
      seleziona range valori={642}{1814},
   ]
      \addplot[color=green] table {astable.txt};	
   \end{axis}

\end{tikzpicture}
\end{document}

 

Sebbene risulti abbastanza comprensibile nel seguito riporterò qualche commento che psosa aiutare ad una migliore comprensione.

Dopo l’usuale e obbligatoria definizione della classe documento (riga 1) e dell’utilizzo del pacchetto pgfplots (riga 2) che automaticamente caricherà Pgf/TikZ, alla riga 4, utilizzando il comando \pgfplotsset, definisco un minimale stile della griglia; colore grigia e puntata. Si può utilizzare la direttiva dashed in luogo di dotted per una griglia tratteggiata (che a me non piace …graficamente è troppo “invadente”!).

Alla riga 5 inserisco un filtro che riprende i valori degli indici 1# e 2# definiti più in basso (riga 25) attraverso l’utilizzo di un handler accoppiato alla direttiva .style la quale permette di personalizzare, a seconda del contesto, l’apparenza e/o il comportamento del programma. Nel caso in questione, attraverso una chiave che accetta due argomenti, verrà personalizzato il comportamento utilizzando come handler la frase seleziona range valori unitamente a x filter/.code={…} ovvero un un filtro per la coordinata X che modifica il valore corrente della coordinata sulla quale viene invocata. Sia .style che x filter così come .code appartengono al pacchetto pgfplots pertanto il loro uso potrà essere approfondito sul relativo manuale.

In altre parole utilizzando la primitiva condizionale \TeX \ifnum per la comparazione dei numeri interi, se \coordindex (di pgfplots) restituisce l’indice corrente della riga della tabella dei dati compresa tra i due argomenti (a partire da 0 non contando intestazioni e commenti), allora i dati verranno riportati nel grafico. Qualsiasi valore al di fuori di questi indici non verrà preso in considerazione. Notare infatti la \def\pgfmathresult{} laddove \def è una primitiva \TeX che definisce il comando \pgfmathresult{} di valore nullo qualora l’indice dovesse cadere fuori dal range indicato dagli indici 1# e 2#.

Con la riga 12 termina il preambolo del documento \LaTeX. Con la riga 12 viene aperto l’ambiente document che verrà chiuso con la riga 31. Tale ambiente dovrà contenere l’ambiente grafico TikZ che viene aperto alla riga 13 e chiuso alla riga 30. All’interno dell’ambiente grafico TikZ verrà creato l’ambiente axis di pgfplots per il tracciamento del grafico in scala lineare sui due assi.

Nell’ambiente axis viene prima impostato lo sfondo come colore nero (riga 16) quindi abilitata la griglia (riga 17). Le righe 18, 19 e 20 definiscono, rispettivamente, la didascalia e le etichette per l’asse X e l’asse Y. La riga 21 e 22 i limiti di valori per l’asse delle Y.

Alla riga 27 viene finalmente aggiunto il grafico di colore verde (come il default in LTspice), di un insieme di dati tabellati presenti nel file astable.txt esportato da LTspice in base alla procedura riportata in precedenza. Tale file, come anticipato, è caratterizzato da alcune migliaia di righe (a seconda della lunghezza del tempo di simulazione) e 2 colonne come è facile verificare con l’immagine precedente dell’editor di testi; nella prima colonna il tempo, nella seconda colonna la tensione sul nodo 003 (collettore di Q1). La selezione delle righe nel file astable.txt avviene alla riga 25 dove viene richiamato l’handler che include tutti i dati che vanno dalla riga 642 alla 1814, tali dati sono quelli specifici, ad esempio, al range di valori indicati dalla finestra di ouptut di LTspice riportata nell’immagine a lato. Tali righe potranno essere selezionate manualmente nel file astable.txt quindi riportate all’handler alla riga 26. Il risultato – formato PDF del documento – è visibile in basso nell’anteprima dell’editor \LaTeX Gummi.

 

Qualche automatismo

Nella soluzione precedente si è visto come per ottenere il grafico in un dato intervallo viene utilizzato un filtro il cui codice è visibile dalla riga 5 alla 10 e nella riga 25. Il filtro agisce per indice (numero di riga) e non per valore del dato. È evidente come rimuovendo tali righe verrà visualizzato tutto il range della simulazione, da 0 a 25ms in questo scenario come riportato nell’immagine in basso dove il colore di sfondo è stato portato a quello predefinito (il bianco) e la traccia è stata disegnata in blu.

 

Riportare manualmente il numero di righe significa aprire il file astable.txt e verificare da quale riga far iniziare la visualizzazione e a quale terminarla quindi riportare i valori nella riga 25. Nulla di difficoltoso, però se si potesse in qualche modo automatizzare la procedura senza andare a trovare le righe sarebbe sicuramente meglio.

Una possibile soluzione vede l’imposizione sui limiti dell’asse X come fatto per l’asse Y (e.g. riga 21 e riga 22). Ipotizzando di volere una rappresentazione del grafico compresa tra i 18ms e i 21ms sarebbe sufficiente aggiungere le righe xmin=0.018 e xmax=0.021 all’interno delle opzioni dell’ambiente axis (nelle parentesi quadre per intenderci, ad esempio subito sotto i limiti imposti per l’asse delle Y) per ottenere il seguente risultato:

 

Ma, come avviene nel mondo GNU/Linux, per ottenere il medesimo risultato è possibile seguire anche altre strade. Una di queste vede, ad esempio, l’utilizzo dell’handler restrict expr to domain (ben descritto nel paragrafo Skipping Or Changing Coordinates – Filters del manuale di pgfplots) da aggiungere come opzione dell’ambiente axis (quindi tra parentesi quadre), ad esempio la riga restrict expr to domain={rawx}{0.018:0.021}, virgola finale compresa. Il risultato vede:

 

È possibile filtrare il valore anche per colonne inserendo alposto delal riga precedente la seguente restrict expr to domain={\thisrow{time}}{0.018:0.021}, laddove time è il nome della prima colonna del file astable.txt e data in pasto al comando \thisrow{} (manuale pgfplots per approfondiemnti), eventualmente fatta seguire da una riga unbounded coords=discard, in presenza di valori che vanno all’infinito. L’output è di fatto identico al precedente tranne per il colore dela grafico qui riportato in nero.

 

Quelli riportati sono solo alcuni esempi di trasposizione tra i valori in output di LTspice e \LaTeX. Ognuno potrà personalizzare l’output come meglio crede anche perché le potenzialità di pgfplots sono ben superiori alle minimali caratteristiche qui riportate come esempi.

mikiadmin

Un pensiero su “Simulazioni LTspice convertite in documenti LaTeX

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *