Résolution d’un problème numérique sur un composant fortement non-linéaire dans LTspice

Comme dans le post précédent, nous utilisons un « Voltage Controlled Switch » pour charger un condensateur, puis ouvrir le circuit. Nous allons prendre cet exemple pour illustrer un problème de simulation avec un composant fortement non linéaire.

Voici le circuit:

Le schéma LTspice est disponible ici

Nous avons volontairement choisi des valeurs de Ron très petite et Roff très grande.

Ci-dessous, avant t=1s, le circuit est fermé (Ron=0.0001 Ω), car la tension du sw (en rouge) est supérieure à 1V. La capa est chargée. A t=1s exactement, la résistance du switch passe brutalement de Ron=0.0001 Ω à Roff = 1M Ω. Le rapport Roff/Ron est très grand (1e+10).

La tension aux bornes du condensateur (en vert) chute lorsque que le commutateur passe de Ron à Roff, ce qui n’est pas logique.

C’est un problème de simulation. Le comportement du switch est instantané donc fortement non linéaire (voir tolerance on errors, en Anglais).

Si une large gamme de résistance ON à OFF doit être utilisée dans les interrupteurs (ROFF/RON >1e;+12), alors la tolérance sur les erreurs permises pendant l’analyse des transitoires doit être réduite en utilisant la ligne de contrôle .OPTIONS et en spécifiant que TRTOL est inférieur à la valeur par défaut de 7.0. Lorsque des interrupteurs sont placés autour des condensateurs, l’option CHGTOL doit également être réduite. Les valeurs suggérées pour ces deux options sont respectivement 1.0 et 1e-16. Ces changements incitent SPICE3 à être plus prudent autour des points de commutation afin qu’aucune erreur ne soit commise en raison de la modification rapide du circuit.

La solution consiste à ajouter la directive « .options trtol=0.001 » dans le schéma LTspice :

On peut aussi changer dans le « control Panel » -> « Spice », la valeur de TrTol de 1 à 0.001. C’est une solution « moins propre ».

Nous lançons la simulation :

Miracle, les choses s’arrangent!

En fait, je n’ai pas une compréhension réelle des paramètres de simulation. Je suis arrivé à cette solution grâce à la page web sus-citée et en cherchant « la bonne valeur » de Trtol (et ChgTol) en tâtonnant.

Et voilà!

Charge et décharge d’un condensateur avec un « Voltage Controlled Switch »

Mes deux posts sur LTspice ont eu du succès. J’ai décidé d’en faire un troisième, assez long. J’en profite pour faire de la pub sur d’autres articles de mon blog concernant des sujets tout aussi passionnants comme TensorFlow ou encore la BeagleBone Black (qui est vachement moins connue, je l’admets, mais c’est de la balle!). Surtout, n’hésitez pas à laisser des commentaires !!!

Problématique

Voilà le problème, qui m’a été soumis par mon beau-père, il y a déjà fort fort longtemps, du temps où j’étais jeune quoi.
Chargeons un condensateur dans un premier temps par une alimentation continue. Dans un second temps nous « débranchons » la source de tension et nous mettons un second condensateur, vide, en parallèle. Pas d’autre composant. Quelle sera alors la tension aux bornes des deux condensateurs?

Mon intuition me dit que la tension sera divisée par 2 puisque la charge sera répartie entre les deux capas. Si on note U la tension initiale du premier condensateur chargé et Uf la tension finale en régime stationnaire. Est-ce qu’on a Uf = U/2?

D’un autre côté, l’énergie stockée dans un condensateur est de 1/2 C U*U (voir ici pour le calcul de l’énergie). Si on note C1 la valeur du condensateur qu’on charge au début et C2 celui qui est déchargé. L’énergie avant de fermer le circuit est de :
Après, en « régime stationnaire », l’énergie sera répartie sur les deux capas :
où Uf est la tension finale que nous voulons calculer. Comme il n’y a pas de résistance dans le circuit, l’énergie est conservée :
Si les capas sont égales C1  = C2 = C, on  obtient On en déduit que la tension finale sera égale à la tension initiale divisée par la racine carrée de 2. Et cela quelque soit la capacité (égale) des condensateurs. Étonnant non?

Voyons ça dans LTspice.
Dans une première partie, nous allons nous familiariser avec le composant « Voltage Controlled Switch » qui permet de simuler un interrupteur.
Dans la seconde partie, nous étudierons le problème posé – en utilisant 2 composants « Voltage Controlled Switch ».

Partie I : « Voltage Controlled Switch » dans un circuit RC

Pour simuler ce truc, nous allons avoir besoin d’interrupteurs, un pour ouvrir le circuit de charge et un second pour fermer le circuit capacitif.

Or, il n’existe pas d’interrupteur simple dans LTspice et cela paraît logique parce c’est de la simulation, l’interrupteur est soit dans une position, soit dans une autre, mais une unique position par simulation. Pour commuter automatiquement, il faut adopter une autre stratégie.
Nous allons utiliser un composant appelé « Voltage Controlled Switch ». Voir discussion créer un interrupteur LTpsice.

Dans un premier temps, nous allons étudier un circuit RC simple et y ajouter un composant sw « Voltage Controlled Switch ». Ce composant sw a une résistance qui peut « switcher » entre deux valeurs en fonction d’une tension et d’un seuil. En fixant la résistance à une valeur faible (< 1 Ω) dans un cas et à une valeur grande dans l’autre cas (> 1 M Ω, voire plus), cela permet de simuler un interrupteur, contrôlé par une tension externe. En fait, il va y avoir un circuit principal (RC dans ce cas) et un second circuit avec une unique source de tension (composant « voltage »). Celui-ci pilote l’interrupteur (switch) .

Noter qu’il existe le même type de composant contrôlé en courant « Current Controlled Switch » csw, mais nous n’en parlerons pas dans ce post.

Le composant sw « Voltage Controlled Switch »

Dans un circuit RC, on introduit le composant sw:

En faisant un clic droit sur le composant sw, j’ai mis la valeur « value » à « monSW ». Il nous faut ajouter trois choses :

  1. une source de tension pour piloter pour le sw
  2. une directive pour spécifier les résistances du composant sw et la tension seuil
  3. le temps d’étude en régime transitoire (run, transient)

On ajoute une « spice directive », qu’on trouve soit sur la barre d’outil, soit dans l’onglet « édition » -> « Spice directive ». On ajoute la directive .model monSW SW(Ron=1 Roff=1Meg Vt=1 Vh=0). Cela signifie que le composant que j’ai renommé monSW à une tension seuil Vt de 1V – une tension d’hystérésis Vh de 0V, c-a-d que le seuil de déclenchement est le même en diminuant ou en augmentant la tension de commande – une résistance Ron de 1 Ω si la tension externe est supérieure à Vt et une résistance de 1 M Ω  si la tension est inférieure à Vt . Du coup, si la tension est supérieure à 1 V, le circuit est fermé et sinon le circuit est considéré comme ouvert. On peut ajuster Ron et Roff si bessoin Voir ici pour plus d’information (en Anglais).

Ensuite, on règle la tension de commande. Click droit sur le composant voltage entouré en rouge dans la figure ci-dessus et puis on clique sur « advanced »

 

On choisit/coche PWL(t1 v1 t2 v2) à gauche et pour t=0 on met 2V et pour t=2 (secondes) on met 0V.  La tension va passer linéairement de 2V à 0V en 2 secondes.

Du coup, la résistance au départ est de 1 Ω et la tension va passer en dessous de 1V à t= 1 seconde et ouvrir le circuit (1 M Ω).

Reste à cliquer sur le petit bonhomme qui court dans la barre à outils, ou aller dans l’onglet « simulate » puis « run ». Une fenêtre s’ouvre et on met 3 secondes pour le « Stop time »  et on coche la case « Start external DC supply voltages at 0V » ça nous donne la directive suivante: « .tran 3 startup ».

Au final, le circuit est:

On trace les courbes. En bleu, la tension « de commande ». En vert, la tension aux bornes du condensateur.

La courbe en bleu passe en dessous de 1V au temps t= 1 seconde. Donc avant 1 s, le circuit est fermé et la tension aux bornes de la capa est de 5V. Quand le circuit est ouvert, à partir de 1 seconde, le condensateur se décharge dans la résistance.
Du fait que le produit RC=0.1, la tension est divisée par 10 en 0.23 secondes. Et donc, la tension aux bornes de la capa est de 0.5 V à t=1.23 s.

Le fichier LTspice du circuit est disponible ici.

Partie II : charge d’un condensateur et circuit purement capacitif

Les étapes de construction du circuit sont moins détaillées que dans la première partie.

On met d'abord en place un circuit purement capacitif avec un switch en série..
On met en place le premier interrupteur de manière similaire à la partie I, avec une source de tension pour le piloter.
Même réglage de la tension qui pilote interrupteur que dans la partie I : l'interrupteur s'ouvre à t=1 sec.
Figure ci-dessous: ajout d'une seconde capa et d'un second interrupteur pour connecter les deux condensateurs ensemble à t=3 secondes.
Réglage de la tension qui pilote le second interrupteur: 0V pendant 2 sec puis 2V à 4 sec, linéaire. Ainsi le seuil 1V est dépassé à 3 sec, l'interrupteur numéro 2 se ferme.

Une fois les deux générateurs de tension qui pilotent les interrupteurs réglés:

Finalisation du circuit: les directives spice pour les « Voltage Controlled Switches ».
On a utilisé le même modèle pour les deux interrupteurs (monSW1 et monSW2). Les directives « .model monSW1 SW(…) » et « .model monSW2 SW(…) » sont identiques: une résistance Ron à 1 Ω et Roff à 100 M Ω et une tension seuil de 1 Volt.

Circuit final:

Le fichier LTspice du circuit est disponible ici.

Le hic!!!

Ci-dessous les courbes: en vert la tension aux bornes de C1 et en bleu la tension aux bornes de C2. En marron, la ligne constante à 1V. Au départ, Le condensateur 1 est très rapidement chargé. Le premier interrupteur s’ouvre à t=1s et le second interrupteur se ferme à t=3s.

Le premier switch s’ouvre à t=1 seconde, car la courbe bleu claire passe en dessous de 1V et le second switch se ferme à t=3 secondes, car la courbe rouge passe au-dessus de 1V.

La tension aux bornes des 2 capas est : 2.5 Volts, soit U/2 et non pas U/racine(2).

Explication possible

La charge électrique q d’un condenseur s’écrit : q = C U.
Lorsqu’on met les deux condensateurs en parallèle, la charge électrique reste la même, mais la capacité C est multiplié par deux. Par conséquent, la tension est divisée par deux: q = C U = 2C U/2.

Vraiment bizarre!!!!

Liens utiles:
tutoriel pour apprendre à utiliser LTspice
Les raccourcis clavier
changer la taille des lignes et des caractères sur les figures (en Anglais)
cours sur les condensateurs
créer un interrupteur sous LTspice (discussion)

Les fichiers audio dans LTspice pour la simulation d’effets

Cet article explique comment importer et exporter des fichiers audio (au format wav) dans LTspice.
Cela est très intéressant pour tester un effet analogique et simuler par exemple le rendu d’une pédale de guitare!

Commençons par un montage de base avec un AO:

baseInv

C’est un amplificateur inverseur. Comme R1 = R2, c’est un inverseur simple.

L’AMPLIFICATEUR OPERATIONNEL

Pour l’ampli op, on a choisi un ampli op standard LM741. 

Je passe rapidement sur les détails techniques : on utilise le fichier LM741.sub et on ajoute la directive
« .lib C:\monchemin\LM741.sub »
On renomme opamp2 en LM741/NS.

LM741

Il reste à ajouter une alimentation symétrique en -4.5v, +4.5V pour alimenter l’AO. On utilise pour cela deux « cells » avec les labels V+ et V- :alimA0

Ci-joint le circuit inverseur.

AJOUT D’UN FICHIER AUDIO EN ENTREE

Le « trick », c’est de presser la touche « ctrl » tout en cliquant droit sur le générateur de tension (le composant « voltage »):

EntreeWav1

Dans le champ « value », on utilise le mot clef wavefile
wavefile= »C:\monchemin\monfichier.wav » chan 0
chan 0 indique de prendre le premier canal, en cas de fichier stéréo.
EntreeWav2
Ci-joint le fichier audio (enregistré avec un smartphone de base) : say it aint so extrait . Ce fichier dure environ 15.2 secondes. Dans la « simulation command », on ajuste la durée à 15.3 secondes.

ENREGISTREMENT DU FICHIER AUDIO EN SORTIE

On ajoute pour cela une directive avec le mot clef .wave :
.wave « C:\monchemin\monfichierWavOut.wav » 16 44100 Vout

  • .wave : pour indiquer que la sortie est un audio au format wav,
  • « C:\… » : le nom du fichier de sortie,
  • 16 : nombre de bits de quantification – 16 bits est la valeur standard,
  • 44100 : fréquence d’échantillonnage en Hz, c’est à dire le nombre de valeurs par seconde. 44100, c’est la qualité CD,
  • Enfin, Vout est le label qui correspond à la sortie.
  • SortieWav

SIMULATION D’UN EFFET PASSE-BAS

Pour que cela devienne intéressant, on transforme notre circuit inverseur en un passe-bas par l’ajout d’une capa en parallèle de la résistance R2.

SortieWavPasseBas

La fréquence de coupure du passe-bas est 1/(2*pi*R2*C1). Avec C1=160n, cette fréquence est d’environ 1kHz.

On lance la simulation. Notez bien que la simulation demande une latence considérable. Il est conseillé de tester son circuit sur des fichiers courts.

Ci-joint, le fichier audio en sortie du passe-bas : say it aint so extrait passe base 1kHz .

CONCLUSION

L’audio en entrée et en sortie, la possibilité de simuler des effets analogiques. Rien à dire : LT spice c’est génial!

P.J. : le schéma spice pour le passe-bas avec audio en entrée et sortie : PB

Comment importer une diode Zener dans LTspice?

Bonsoir,

Je reprends mon blog. Je me suis  découvert une passion pour l’électronique pendant l’année 2015 et je ponds ici un premier article technique.

J’utilise un logiciel gratuit (?) LTspice qui permet de modéliser n’importe quel schéma d’électronique ANALOGIQUE. A la root’s quoi.

Je trouve ce logiciel génial. Il permet de faire un pont entre le fer à souder et la simulation sur ordi. La théorie et la pratique quoi. Par contre, il faut pas mal barouder sur le net pour trouver les bonnes informations quand ça coince.

Entrons dans le vil du sujet: l’objectif de ce post est d’expliquer comment importer un modèle de composant dans LTspice, en l’occurrence une diode Zener 5.1V.

Le contexte: je souhaite obtenir une alimentation symétrique (+4.5V,0V,-4.5V) à partir d’une pile 9V.

Voici le schéma du montage sous LTspice :

AlimZenerDebut2

En rouge, entourée la diode Zener. Le modèle ne me convient pas.

Je veux une diode Zener à 5.1V.

Voici comment j’ai procédé:

  1. chercher une librairie sur le net. google  » ltspice zener diode « . On choisit un lien proposé, par exemple: http://www.simonbramble.co.uk/lt_spice/ltspice_lt_spice_models.htm (lien valide au 2/01/2015). On télécharge le fichier »spicemodels_zener_diodes.zip » en cliquant sur le lien « Zener Diodes« .On le dé-zip et on extrait un fichier « zener_diodes.txt ».
  2. Il y a un petit problème : ce fichier contient des erreurs, il manque des « .ENDS » à la fin de certaines sous-fonctions (qui commencent par. SUBCKT). Alors, soit on ajoute des « .ends » partout où il en manque, et il en manque! J’ai opté pour une autre solution: j’ai recopié les définitions (des diodes) qui m’intéressent dans un nouveau fichier « ZenerDiodesBZX84.lib ». Comme son nom l’indique, je n’ai gardé que les diodes zener de type « BZX84 ». J’ai vérifié qu’aucun « .ends » ne manque à l’appel. J’ai ensuite placé ce fichier dans un répertoire de mon choix « G:\Users\Laurent\Documents\LTspice\modelWeb ». Il n’est pas nécessaire de le placer dans un sous-répertoire de LTspice, et je le déconseille.
  3. Je lance dans LTspice. Je crée le beau circuit qui contient une diode Zener. Il n’y a pas de diode zener 5.1V!
    1. J’ajoute la directive SPICE : « .lib G:\Users\Laurent\Documents\LTspice\modelWeb\ZenerDiodesBZX84.lib« , afin que LTspice prenne en compte ma librairie de diodes Zener.
    2. Je vais avec la souris sur le texte associé à la diode. Je clique droit et je remplace le texte « D » par « DI_BZX84C5V1 » pour avoir une diode Zener bzx84C5V1 qui a un seuil de 5.1V.
      AlimZenerRes
      C’est presque fini. Presque!
    3. Là c’est tricky. Dernière étape: il faut indiquer à LTspice que le composant est défini de manière externe, c’est à dire dans ma librairie. Pour cela, il faut placer la souris sur la diode et presser la touche ctrl tout en cliquant droit avec la souris. Il apparaît une fenêtre « Component Attribut Editor ». L’attribut « Prefix » a pour valeur « D » pour indiquer que c’est une diode. On remplace cette valeur par « X », qui indique que c’est un composant défini de manière externe.
      attributEditor
      Attribute Editor avant changement

      attributEditorAfter
      Attribute Editor après changement

J’ai pas mal galéré entre le fichier .lib qui contenait des erreurs et surtout le changement de la valeur de l’attribut « Prefix ».

Ce qui est à retenir:

  1. On peut ajouter des composants dont on trouve la définition sur le net. On les inclut dans un circuit avec la directive Spice: « .lib maLibrairie.lib ».
  2. S’il s’agit d’une variante d’un composant existant déjà dans Spice, on donne au champ « Prefix », dans la fenêtre « Component Attribut Editor », la valeur « X », qui signifie « Externe ».

J’ai trouvé la solution sur le site « Adding Spice Models to LTspice« .

Je mets en lien la librairie et le circuit avec la diode Zener en question.