Utilisation conjointe de Python et LTspice
Introduction
L'intégration de Python avec LTspice offre une opportunité de repousser les limites de LTspice pour la simulation des circuits électroniques. Plutôt que d'utiliser LTspice de manière conventionnelle, cette approche propose de tirer parti de la puissance de Python pour automatiser et personnaliser le processus de conception de circuits. En manipulant les fichiers .asc de LTspice comme des templates, et en utilisant Jinja pour leur rendu, il devient possible de générer dynamiquement des circuits adaptés à des besoins spécifiques, tout en gardant une grande flexibilité dans la configuration des paramètres.
Création de circuits avec Python
Méthodologie
- Création du circuit
.ascde base avec LTspice (vérification du bon fonctionnement), - Edition du fichier
.ascavec une éditeur de texte. Remplacement des valeurs numériques des composants par des tags Jinja. - Création du script Python permettant de charger le template Jinja, puis de le remplir avec le contenu de variables Python.
Exemple : Circuit RC-RC
Création du circuit
Après avoir créé un circuit avec LTspice, il est possible d'accéder au contenu du circuit en ouvrant le fichier .asc avec un éditeur de code.
Version 4
SHEET 1 1876 900
WIRE -864 32 -880 32
WIRE -768 32 -864 32
WIRE -624 32 -688 32
WIRE -560 32 -624 32
WIRE -448 32 -480 32
WIRE -400 32 -448 32
WIRE -624 96 -624 32
WIRE -448 96 -448 32
WIRE -880 192 -880 112
WIRE -624 192 -624 160
WIRE -448 192 -448 160
FLAG -864 32 ve
IOPIN -864 32 In
FLAG -624 192 0
FLAG -400 32 vs
IOPIN -400 32 Out
FLAG -448 192 0
FLAG -880 192 0
SYMBOL res -784 48 R270
WINDOW 0 32 56 VTop 2
WINDOW 3 0 56 VBottom 2
SYMATTR InstName R1
SYMATTR Value 10k
SYMBOL cap -640 96 R0
SYMATTR InstName C1
SYMATTR Value 10n
SYMBOL res -576 48 R270
WINDOW 0 32 56 VTop 2
WINDOW 3 0 56 VBottom 2
SYMATTR InstName R2
SYMATTR Value 100k
SYMBOL cap -464 96 R0
SYMATTR InstName C2
SYMATTR Value 1n
SYMBOL voltage -880 16 R0
WINDOW 123 24 124 Left 2
WINDOW 39 0 0 Left 2
SYMATTR Value2 AC 1 0
SYMATTR InstName V1
SYMATTR Value ""
TEXT -800 280 Left 2 !.ac dec 10 100 10kEdition du fichier
Dans ce code LTspice, la valeur d'un composants est spécifiée au moyen d'une ligne de la forme : SYMATTR Value .... Pour convertir le fichier LTspice est un template Jinja, il suffit de remplacer les valeurs des composants par des tags Jinja. Il est également possible de remplacer la directive SPICE par un tag Jinja pour plus de flexibilité.
Version 4
SHEET 1 1876 900
WIRE -864 32 -880 32
WIRE -768 32 -864 32
WIRE -624 32 -688 32
WIRE -560 32 -624 32
WIRE -448 32 -480 32
WIRE -400 32 -448 32
WIRE -624 96 -624 32
WIRE -448 96 -448 32
WIRE -880 192 -880 112
WIRE -624 192 -624 160
WIRE -448 192 -448 160
FLAG -864 32 ve
IOPIN -864 32 In
FLAG -624 192 0
FLAG -400 32 vs
IOPIN -400 32 Out
FLAG -448 192 0
FLAG -880 192 0
SYMBOL res -784 48 R270
WINDOW 0 32 56 VTop 2
WINDOW 3 0 56 VBottom 2
SYMATTR InstName R1
SYMATTR Value 10k
SYMATTR Value {{R1}}
SYMBOL cap -640 96 R0
SYMATTR InstName C1
SYMATTR Value 10n
SYMATTR Value {{C1}}
SYMBOL res -576 48 R270
WINDOW 0 32 56 VTop 2
WINDOW 3 0 56 VBottom 2
SYMATTR InstName R2
SYMATTR Value 100k
SYMATTR Value {{R2}}
SYMBOL cap -464 96 R0
SYMATTR InstName C2
SYMATTR Value 1n
SYMATTR Value {{C2}}
SYMBOL voltage -880 16 R0
WINDOW 123 24 124 Left 2
WINDOW 39 0 0 Left 2
SYMATTR Value2 AC 1 0
SYMATTR InstName V1
SYMATTR Value ""
TEXT -800 280 Left 2 !.ac dec 10 100 10k
TEXT -800 280 Left 2 !{{spice_directive}}Création du code Python
Structure du dossier
.
├── circuit.py
└── templates
└── RC_RC_LP.asc
└── buildContenu du fichier Python
from jinja2 import Environment, FileSystemLoader
import os
class RC_RC_LP():
template_name = "RC_RC_LP.asc"
def __init__(self, R1, C1, R2, C2):
self.R1 = R1
self.C1 = C1
self.R2 = R2
self.C2 = C2
def create_asc(self, filename="build/RC_RC_LP_out.asc", spice_directive=".ac dec 10 100 10k"):
# Ensure the build directory exists
os.makedirs(os.path.dirname(filename), exist_ok=True)
file_loader = FileSystemLoader('templates')
env = Environment(loader=file_loader)
template = env.get_template(self.template_name)
values = {
'R1': self.R1,
'C1': self.C1,
'R2': self.R2,
'C2': self.C2,
'spice_directive': spice_directive
}
template.stream(values).dump(filename)
filter = RC_RC_LP(1e3, 1e-9, 1e5, 1e-9)
filter.create_asc()