Ce document montre la réalisation d'un détecteur d'enveloppe fonctionnant avec une porteuse de 40 kHz, destiné au traitement du signal fourni par un récepteur d'ultrasons de cette fréquence. Les deux applications visées sont la démodulation d'amplitude et l'extraction de l'enveloppe d'un paquet d'ondes.
Un détecteur de crête simple est constitué d'une diode et d'un condensateur.
Figure pleine pageLorsque la tension Vin est croissante et supérieure à Vout plus le seuil de la diode (0,7 V), la diode est passante et le condensateur se charge. Lorsque Vin passe par un maximum et décroît, la diode devient bloquante et la tension Vout garde la valeur maximale tant que Vin ne dépasse pas cette valeur plus 0,7 V.
La simulation est faite avec LTspice. La source de tension est de type PWL : le signal est fourni par un fichier PWL (voir annexe pour la génération de ce fichier) qui définit une sinusoïde de 40 kHz modulée à 500 Hz avec un indice de modulation de 0,3.
import numpy as np from matplotlib.pyplot import * [t,Vin,Vout] = np.loadtxt('detecteurCrete.txt',unpack=True,skiprows=1) figure(figsize=(16,6)) plot(t*1e3,Vin,'k',label='Vin') plot(t*1e3,Vout,'r',label='Vout') xlabel('t (ms)') ylabel('Volts') legend(loc='upper right') xlim(0,3) grid()detecteurCrete-fig1.pdf
Ce détecteur de crête fournit une tension inférieure de 0,7 volts environ à la valeur de crête, ce qui limite son usage à des signaux dont l'amplitude est de plusieurs volts. Nous verrons plus loin comment éliminer ce décalage. Pour obtenir un détecteur d'enveloppe, il faut permettre au condensateur de se décharger partiellement entre deux maxima de la porteuse. On place pour cela une résistance R1 en parallèle avec le condensateur de capacité C1. La constante de temps R1C1 doit être choisie afin que la diminution de la tension Vout soit de l'ordre de grandeur de la plus grande diminution de Vout entre deux cycles de la porteuse. Le choix de la constante de temps dépend donc de la fréquence de modulation et il convient de la choisir pour la plus grande fréquence de modulation prévue.
Figure pleine page detecteurEnveloppe-fig1.pdfPour la fréquence de modulation de 500 Hz et l'indice de modulation de 0,3, la valeur permet de suivre la diminution de l'amplitude lorsqu'elle est la plus rapide. Pour le même indice de modulation, ce détecteur fonctionnera bien pour toute fréquence de modulation inférieure à 500 Hz. Lorsque l'amplitude est croissante, il y a des ondulations dues à la décharge du condensateur entre deux maxima. Elles pourront être éliminées par un filtrage ultérieur.
Un détecteur d'enveloppe actif [1] utilisant un amplificateur linéaire intégré (ou amplificateur opérationnel) permet en principe d'éliminer le décalage entre la tension de sortie et la valeur du maximum en entrée (du à la tension de seuil de la diode).
Figure pleine pageLorsque la tension Vin est légèrement supérieure à Vout, la diode est passante et la rétroaction négative permet à l'ALI de fonctionner en régime linéaire. Le courant de sortie de l'ALI permet alors de charger le condensateur via la diode. Lorsque Vin devient inférieure à Vout, la diode devient bloquante et l'ALI passe en saturation négative.
demodulateur1-fig1.pdfOn constate que moyenne de Vout sur un cycle n'atteint pas la valeur de crête de Vin, bien que le décalage (0,2 V) soit nettement plus petit que celui du montage passif. Par ailleurs, la charge du condensateur ne se fait pas à tous les cycles de Vout. Par exemple, la troisième charge se fait seulement après quatre cycles suivant la deuxième charge. Il est intéressant d'obsever la tension en sortie de l'ALI :
demodulateur1-fig2.pdfLa diode est passante si AO1OUT est supérieure à Vout+0,7. Comme prévu, l'ALI est en saturation négative (-9 V environ) lorsque la diode est bloquante. Lorsque la diode devient passante, sa sortie doit donc passer de -9 V à une valeur positive (supérieure à Vout) en un temps très court. Visiblement, il ne peut y parvenir que si le temps pendant lequel la tension Vin est supérieure à Vout est assez long, ce qui explique que la conduction de la diode ne se produise pas pour certains cycles de Vin. Même lorsque la conduction de la diode se déclenche, la tension Vout n'atteint pas la tension de crête mais une valeur inférieure de 0,2 V.
Voici le courant dans la diode, qui est aussi le courant en sortie de l'ALI :
demodulateur1-fig3.pdfLes valeurs maximales du courant montrent que ce n'est pas le courant de sortie de l'ALI qui limite le temps de réponse.
Le circuit suivant [1] permet à l'ALI de fonctionner en permanence en régime linéaire :
Figure pleine pageL'ALI AO2 réalise un suiveur de tension dont la sortie effectue une rétroaction négative pour AO1 via la résistance R2, ce qui permet à AO1 de rester en régime linéaire lorsque D1 est bloquante.
demodulateur2-fig1.pdfL'amélioration par rapport au circuit précédent est évidente : la tension Vout est plus proche de la valeur de crête de Vin et l'intervalle de temps pendant lequel la diode D1 est bloquante ne dépasse jamais deux cycles. Voici la tension en sortie de AO1 et Vout :
demodulateur2-fig2.pdfL'ALI AO1 fonctionne toujours en régime linéaire. La tension en sortie ne passe pas en dessous de -2 V, ce qui permet à la tension en sortie de passer plus rapidement à une valeur supérieure à Vout+0,7. Malgré cela, il peut arriver que le temps pendant lequel Vin est supérieure à Vout n'est pas assez long pour permettre à la tension en sortie de AO1 d'atteindre une valeur suffisante pour que la diode deviennent passante.
Voici les courants dans les deux diodes :
demodulateur2-fig3.pdfOn remarque que la diode D2 est passante (faiblement) lorsque D1 est bloquante. La diode D2 permet donc un courant négatif en sortie de AO1 lorsque D1 est bloquante, ce qui est évidemment impossible avec le circuit précédent.
La sortie Vout doit être numérisée à une fréquence d'échantillonnage égale au double de la plus grande fréquence de modulation (1000 Hz dans notre exemple). Il convient donc de lui appliquer un filtrage passe-bas pour éliminer les ondulations et ainsi éviter le repliement de fréquence.
Nous utilisons pour cela un filtre passe-bas du deuxième ordre de type Sallen et Key.
Figure pleine pageLe filtre réalise une fonction de transfert de Butterworth si R3=R4 et C3=2C2. La fréquence de coupure est :
Avec les valeurs choisies, on a donc fc=2300 Hz.
demodulateur2-filtre-fig1.pdfLa fréquence de coupure choisie permet bien d'éliminer les ondulations à 40 kHz. Il y a bien sûr un retard entre la sortie et l'entrée du filtre mais ce retard sera identique pour toute fréquence de modulation inférieure à 500 Hz puisque cette fréquence est largement dans la bande passente (le déphasage dépend linéairement de la fréquence), ce qui fait que la démodulation se fera sans distorsion.
Il est intéressant de voir l'influence d'une réduction de R1. Voici le résultat avec :
demodulateur2-filtre-fig2.pdfCe choix n'a pas d'effet sur le signal en sortie du filtre car les ondulations à 40 kHz sont largement dans la bande atténuante. L'avantage d'un temps de décharge plus court et de permettre une fréquence de modulation plus grande (ou un indice plus grand). Il faut remarquer que cet abaissement de R1 est possible avec ce filtre d'ordre 2 mais serait sans doute impossible avec un filtre d'ordre 1.
Il est important de remarquer que l'ajout d'un filtre passe-bas est indispensable pour effectuer une démodulation de bonne qualité. En effet, un bon suivi de l'enveloppe exige un temps de décharge court du condensateur C1 ce qui va de pair avec des ondulations de forte amplitude à ses bornes et avec la nécessité d'éliminer ces ondulations avec le filtre passe-bas. L'augmentation du temps de décharge ne permet pas d'obtenir ce résultat car elle s'accompagne nécessairement d'une baisse de la fidélité du suivi dans les parties d'amplitude décroissante. Considérer la cellule C1R1 comme un filtre passe-bas linéaire est une erreur : on doit considérer le fonctionnement de cette cellule avec la diode, un ensemble qui constitue un système non linéaire et dont l'objectif est de fournir un signal ondulant dont la moyenne sur un cycle est très proche de la valeur de crête de Vin.
Il est intéressant de voir l'effet du filtrage sur le premier circuit de détection. Un suiveur est tout de même nécessaire avant l'entrée du filtre :
Figure pleine page demodulateur1-filtre-fig1.pdfCette simulation confirme que la valeur maximale atteinte par la tension en sortie du filtre est notablement plus basse que la valeur maximale de l'amplitude. Ce décalage se constate aussi en déterminant mentalement la valeur moyenne de Vout sur un cycle, qui est bien inférieure à la valeur de crête. Pour effectuer une démodulation d'amplitude, ce décalage n'est peut-être pas gênant à condition qu'il n'y ait pas de distorsion, ce que la simulation ci-dessus ne peut évaluer.
Il s'agit d'extraire l'enveloppe d'un paquet d'ondes en sortie d'un transducteur utrasonore de 40 kHz. L'objectif est différent de celui de la démodulation d'amplitude. On s'intéresse principalement à la partie montante du paquet et le retard en sortie du filtre doit être minimisé. Le paquet survient après une période plus ou moins longue pendant laquelle Vin=0. Il s'agit donc d'étudier la réponse transitoire du système, alors que celle-ci n'était pas considérée dans l'étude précédente. Les deux paramètres à ajuster pour optimiser la réponse sont R1 (qui détermine le temps de décharge) et R3=R4 (qui détermine la fréquence de coupure du filtre).
Le signal fourni par fichier PWL est un paquet dont l'enveloppe est une demi-sinusoïde de 500 Hz.
Figure pleine page demodulateur2-filtre-Paquet-fig1.pdfL'objectif est de détecter le plus précisément possible l'apparition du paquet. On s'intéresse donc à la partie montante de l'enveloppe et le suivi de la partie descendante est sans importance. Il faut seulement que la fréquence de répétition des paquets sont assez faible pour que C1 soit complètement déchargé lorsqu'un paquet survient.
L'inconvénient de ce détecteur d'enveloppe est le retard entre la tension Voutf (en sortie du filtre) et l'enveloppe réelle du signal. La durée approximative du retard est de deux cycles de la porteuse. Un détecteur d'enveloppe numérique n'aurait pas cet inconvénient mais il nécessiterait une numérisation à au moins 80 kHz, alors que la numérisation de Voutf peut se faire à une fréquence beaucoup plus basse.
Pour réduire le retard, il faut augmenter la fréquence de coupure du filtre c'est-à-dire réduire R3=R4. Voici le résultat avec R3=R4=560 Ω :
demodulateur2-filtre-Paquet-fig2.pdfLe retard est bien réduit (il est passé de deux cycles à un cycle) mais au prix d'une moins bonne atténuation des ondulations à 40 kHz. Réduire encore R3 aurait trop d'effet sur ces ondulations.
Voici le circuit retenu pour la démodulation d'amplitude :
Figure pleine pageVoici le circuit retenu pour la détection de paquet :
Figure pleine pageLa fréquence de coupure du filtre est 4 fois plus grande, ce qui réduit le retard et permet donc d'obtenir une tension Voutf (sortie du filtre) au plus proche de l'enveloppe dans la partie montante du paquet. Ce choix de R3=R4 ne convient pas pour la démodulation.
En pratique, il faudra probablement ajuster R1 et R3=R4 pour s'adapter à la forme réelle du paquet.
Pour la démodulation d'amplitude R3=R4=2200Ω.
Voici les signaux obtenus pour une modulation d'amplitude de 500 Hz. L'épaisseur du trait de Voutf est due au bruit de quantification (oscilloscope 8 bits).
[t,Vin,Vout,Voutf] = np.loadtxt('AM500Hz.csv',unpack=True,skiprows=1,delimiter=',') figure(figsize=(16,6)) plot(t*1e3,Vin,'k',label='Vin') plot(t*1e3,Vout,'r',label='Vout') plot(t*1e3,Voutf,'g',label='Voutf') xlabel('t (ms)') ylabel('Volts') legend(loc='upper right') grid()AM500Hz-fig1.pdf AM500Hz-fig2.pdf
et pour une modulation de 1000 Hz :
AM1000Hz-fig1.pdfVoici la réponse à un paquet de forme rectangulaire (Burst) :
Burst-fig1.pdfPour la détection de paquets R3=R4=560Ω.
Voici la réponse à un paquet de forme rectangulaire (Burst) :
Burst-fig2.pdfPour obtenir un paquet ayant une enveloppe comme celui de la simulation ci-dessus, nous utilisons la carte SysamSP5. Le script est donné en annexe.
Voici les signaux lorsque l'amplitude du paquet est 5 fois plus petite :
Dans ce cas, le filtrage passe-bas est insuffisant car les ondulations de Vout ont une amplitude relative plus grande. Pour améliorer le filtrage, on choisit R3=R4=1 kΩ :
Comme mentionné plus haut, cet amélioration du filtrage se fait au détriment d'une augmentation du retard.
On peut aussi augmenter le temps de décharge de C1 en augmentant R1. Voici le résultat pour R1=5,6 kΩ et R3=R4=560Ω :
Le résultat est intéressant dans la mesure où les ondulations de Voutf ne présentent plus de parties décroissantes mais l'amélioration du filtrage est une meilleure solution.
Un fichier PWL pour une source de tension d'une simulation SPICE est un fichier texte contenant les instants et les tensions correspondantes sous la forme t1 v1 t2 v2 t3 v3 .... Voici un script qui génère le signal de modulation d'amplitude :
import numpy as np import matplotlib.pyplot as plt f=40e3 fmod=500 m = 0.3 U = 1.0 tmax = 4e-3 N = 10000 t = np.linspace(0,tmax,N) u = U*(1+m*np.sin(2*np.pi*fmod*t))*np.sin(2*np.pi*f*t) data = np.zeros(2*N) for i in range(N): data[2*i] = t[i] data[2*i+1] = u[i] np.savetxt('modulation-1V.pwl',data,fmt='%3f') plt.figure() plt.plot(t,u) plt.grid() plt.show()
Voici le script qui génère le paquet d'ondes :
import numpy as np import matplotlib.pyplot as plt f=40e3 fmod=1e3 m = 0.3 U = 1.0 tmax = 1/fmod N = 10000 t = np.linspace(0,tmax,N) u = np.zeros(N) i1 = 1000 N1 = int(1/fmod/2/t[1]) t1 = t[i1:i1+N1]-t[i1] u[i1:i1+N1] = U*(np.sin(2*np.pi*fmod*t1))*np.sin(2*np.pi*f*t1) data = np.zeros(2*N) for i in range(N): data[2*i] = t[i] data[2*i+1] = u[i] np.savetxt('paquet.pwl',data,fmt='%3f') plt.figure() plt.plot(t,u) plt.grid() plt.show()
Le script ci-dessous génère un paquet sur la sortie SA1 de la carte SysamSP5 et effectue simultanément les acquisitions de Vin (voie EA0), Vout (voie EA1) et Voutf (voie EA2).
import pycanum.main as pycan import numpy as np import matplotlib.pyplot as plt f=40e3 fmod=1e3 m = 0.3 U = 1.0 tmax = 1/fmod N = 5000 t = np.linspace(0,tmax,N) te = t[1] print(te) fechant = 1/te u = np.zeros(N) i1 = 500 N1 = int(1/fmod/2/t[1]) t1 = t[i1:i1+N1]-t[i1] u[i1:i1+N1] = U*(np.sin(2*np.pi*fmod*t1))*np.sin(2*np.pi*f*t1) can = pycan.Sysam("SP5") can.config_entrees([0,1,2],[2.0,2.0,2.0]) can.config_echantillon(te*10**6,N) can.acquerir_avec_sorties(u,0) t = can.temps()[0] U = can.entrees() Vin = U[0] Vout = U[1] Voutf = U[2] can.fermer() plt.figure(figsize=(16,6)) plt.plot(t*1e3,Vin,'k',label='Vin') plt.plot(t*1e3,Vout,'r',label='Vout') plt.plot(t*1e3,Voutf,'g',label='Voutf') plt.xlabel('t (ms)') plt.ylabel('Volts') plt.legend(loc='upper right') plt.grid() plt.savefig("../../../../figures/sciphys/electro/enveloppe/paquet-fig1.png") plt.savefig("../../../../figures/sciphys/electro/enveloppe/paquet-fig1.pdf") plt.show()
Le schéma suivant montre un détecteur d'enveloppe fonctionnant avec une alimentation simple de 5 V, qui peut être alimenté directement par l'alimentation 5 V d'une carte Arduino. Le signal appliqué en entrée est décalé de 2,5 volts. La simulation SPICE est faite avec un ALI TLV2372, qui peut être alimenté en 5 V et dont la sortie peut balayer la totalité de la plage de tension de 0 à 5 V (ampli rail-to-rail). En pratique, on réalisera le circuit avec un TLV2374, qui contient 4 amplificateurs. La référence de 2,5 volts est fournie par un diviseur de tension associé à un suiveur, que nous n'avons pas représenté sur le circuit car il fait partie d'un système plus large comportant également un amplificateur.
Figure pleine page demodulateur1-filtre-Paquet-TLV2372-fig1.pdfVoici les signaux pour un paquet d'amplitude maximale :
demodulateur1-filtre-Paquet-TLV2372-fig2.pdfLa sortie du détecteur d'enveloppe est inférieure à la tension d'alimentation (5 V) en raison de la tension aux bornes de la diode D1. Si on veut traiter correctement un paquet dont l'amplitude dépasse 2,5 volts, il faudra augmenter la tension d'alimentation.