PLL - Boucles à verrouillage de phase


Sommaire.

1. Préambule.
2. Rappel théorique sur la PLL.
  2.1 Le comparateur de phase.
    2.1.1 Mélangeur linéaire, multiplieur.
    2.1.2 Ou exclusif.
    2.1.3 Détecteur de phase séquentiel.
    2.1.4 Comparateur phase/fréquence séquentiel.
    2.1.5 Pompe de charge (charg pump).
  2.2 Le filtre de boucle.
    2.1.1 Filtre passif d'ordre 1.
    2.1.2 Filtre passif d'ordre 2.
    2.1.3 Filtres actifs.
    --:: simulation analogique.
  2.3 Le VCO.
    --:: Oscillateurs RF à transistors.
    --:: Oscillateur à résonnateur diélectrique.
3. Tableau récapitulatif des fonctions de transferts.
4. Caractérisation de la pll, calcul des éléments.
  4.1 Notions mathématiques : transformée de Laplace.
  4.2 Système en boucle ouverte.
  4.3 Système en boucle fermée.
5. Modélisation sous Mathlab.
6. Glossaire.
7. Documentation, bibliographie.

télécharger le document au format pdf.


1. Préambule.

C'est en 1932 que De Bellescize publia sa théorie sur la détection synchronisée et décrivit la PLL pour la première fois [La réception synchrone, Onde électrique Vol, 11 juin 1932 pp230-240]. En 1947, une réalisation à PLL était appliquée pour la première fois dans la synchronisation en fréquence d'un récepteur télé. Dès 1970, le développement rapide des semi-conducteurs permirent d'intégrer dans un composant un système à PLL. Ce principe est actuellement utilisé dans la plupart des systèmes de transmission.
Généralement, les systèmes de communication sans fil nécessite l'utilisation d'une source pure, stable et rapidement modifiable. Pour cela, la PLL corrige la différence de phase entre un signal de référence et un signal de retour. Plusieurs techniques existent, la synthèse de fréquence directe (DFS), la synthèse N/N+1 ou, développée plus récemment, la synthèse N fractionnée.

2. Rappel théorique sur la PLL.

La boucle à verrouillage de phase est composée d'un détecteur de phase qui calcul l'erreur de phase entre un signal de référence et le signal pilote ; cette erreur est ensuite filtrée par un filtre de boucle (filtre passe bas) avant d'entrer sur la commande d'un VCO.
Le détecteur de phase influence sur la dynamique et la performance de la PLL. Plusieurs comparateurs de phase existent ; le comparateur dit « charge pump », par exemple, utilise deux bascules D puis des buffers qui convertissent l'état logique du détecteur de phase en courant permettant de commander le VCO via un filtre de boucle. Le filtre de boucle est un élément important d'un système à PLL qui relie le détecteur de phase au VCO. Généralement un filtre passif est utilisé du fait de sa simplicité, de son faible coût et de ses performances en bruit de phase.

2.1 Le comparateur de phase.

Le comparateur de phase délivre une tension dont la valeur moyenne est proportionnelle à la différence de phase des signaux d'entrées. Le détecteur de phase peut-être analogique (mélangeur doublement équilibré, multiplieur 4 quadrants) ou numérique (porte ou exclusif, logique séquentielle...).
Kd = Du/Dphi représente le gain du détecteur de phase en Volt/rad.

2.1.1 Mélangeur / multiplieur

Le multiplieur analogique linéaire peut prendre différentes formes, selon l'application; soit un multiplieur quatre quadrants à cellules de Gilbert, soit une structure à diode pour les fréquences plus élevées...

v_1 = Ua cos(w1t)
v_2 = Ub cos(w1t + PHI)
or sin(a) * sin(b) = 0.5 * cos(a-b) - 0.5 * cos(a + b)
Vd = (k * Ua * Ub / 2) * [cos(PHI) - cos(2w+PHI)]
Vd # (k * Ua * Ub / 2) * cos(PHI) après filtrage passe bas.

2.1.2 Ou exclusif.

Les détecteurs de phase numériques requièrent des signaux carrés sur leurs entrées et permettent un verrouillage plus facile que dans le cas précédent lors d'écart entre le signal utile et le signal de référence. La porte OU exclusif constitue le comparateur le plus simple.

                              ___     ___     __            ____
Pour Phi=0,    u=0V       ___|   |___|   |___|        a ___|    |        a  b  S
                          _     ___     ___                |XOR |___S    0  0  0
Pour Phi=Pi/2, u=Vdd/2     |___|   |___|   |___|      b ___|    |        0  1  1
                          _   _   _   _   _   _            |____|        1  0  1
Pour Phi=Pi,   u=Vdd       |_| |_| |_| |_| |_| |_                        1  1  0

Le point de verrouillage à fréquence centrale s'effectue à Vdd/2.
Les signaux d'entrées doivent avoir un rapport cyclique de 0.5.
Il est possible de se verrouiller sur des fréquences externes à la plage de maintien (verrouillage sur harmonique).

Kd = (Logic'1' - Logic'0') / PI

2.1.3 Détecteur de phase séquentiel.

Le circuit de base utilise une bascule RS déclenchée sur front, on trouve des variantes utilisant une ou plusieurs bascules D ou JK.

La sortie Q est mise à l'état haut avec un front descendant sur u1 (set), le passage de la sortie à l'état bas s'effectuant sur un front descendant de u2 (reset). Du fait du déclenchement du montage sur un front du signal, ce principe est indépendant du rapport cyclique. Contrairement au cas précédent, ce système est indépendant du rapport cyclique des signaux d'entrée. Par contre, pour des fréquences d'entrées verrouillées sur f1 et f2 assez proche, la valeur de sortie ne se stabilise pas et évolue à une période égale à la différence des deux fréquences.

Kd = (Logic'1' - Logic'0') / 2.PI

2.1.4 Comparateur phase/fréquence séquentiel (PFD).

Le détecteur phase/fréquence donne une information à la fois sur la phase, mais aussi sur la fréquence. Une information de phase est fournie pour une erreur de +/- 2PI radians.
Exemple de réalisation & principe :
Le PFD compare le signal de référence Fref avec le signal divisé provenant du VCO et active des sorties UP et DOWN selon la différence de phase entre ces deux signaux. Quand la différence de phase est supérieure à 2.PI, le circuit est dans un mode de détection de fréquence, la sortie de courant délivre alors une valeur constante (cas d'un circuit charge pump). Le filtre de boucle intègre cette valeur et le PFD continue d'opérer jusqu'à ce que l'erreur entre les deux signaux d'entrée passe en dessous de 2.PI ; le circuit opère alors en mode détection de phase ; dès que la différence de phase approche zéro, le circuit entre dans un état verrouillé.

Description VHDL du comparateur de phase :

   process(Clk_comp,aRST,Reset)
   begin
     if(aRST='1' or reset='1') then
       Q_up <= '0';
     elsif rising_edge(Clk_comp) then
       Q_up <= '1';
     end if;
   end process;
   process(Fvco_div,aRST,Reset)
   begin
     if(aRST='1' or reset='1') then
       Q_down <= '0';
     elsif rising_edge(Fvco_div) then
       Q_down <= '1';
     end if;
   end process;
   reset <= Q_up and Q_down;
   PHiD_P_pdh <= '0' when (PhiD_down_pdh='1') else 'Z';
   PHiD_M_pdh <= '1' when (PhiD_up_pdh='1') else 'Z';

La sortie UP vaut '1' et DOWN vaut '0' si le signal du VCO est trop faible en fréquence. (erreur de phase positive) UP est positionné à '1' à chaque front montant de clk_comp et positionné à '0' quand up et down vallent '1'. La sortie DOWN vaut '1' et UP vaut '0' si le signal du VCO est trop haut en fréquence. (erreur de phase négative) DOWN est positionné à '1' à chaque front montant de Fvco_div et positionné à '0' quand up et down vallent '1'. L'erreur de phase généreré des variations autour de la fréquence centrale jusqu'à stabilisation, la PLL sera alors verrouillée, il n'y a aura plus d'erreur de phase et les deux sorties UP et DOWN seront à '0'.

Kd = (Logic'1' - Logic'0') / 2.PI

2.1.5 Circuit à pompe de charge. (charge pump)

Le comparateur « charge pump » est identique au détecteur phase/fréquence mise à part qu'il dispose d'une unique sortie de courant au lieu de deux en tension. On ajoute donc deux buffer de courant en sortie du montage précédent. (généralement des transistors MOS comme représenté sur le montage ci-dessus) Souvent le courant de sortie est programmable permettant des consommations plus faibles du circuit d'intégration qui suit. Cet intégrateur génère, à partir du courant, une tension qui pilote le VCO ; de ce fait, un faible courant du détecteur augmente les impédances de l'intégrateur alors qu'un courant élevé diminue le niveau des impédances.

Kd = (Imax/2.PI) en Amp/rad

2.2 Le filtre passe bas.

Le signal de sortie du comparateur de phase est constitué d'harmonique et d'une composante continue. Le rôle du filtre passe bas est de ne conserver que cette composante continue qui est proportionnelle à l'écart de phase. Souvent un filtrage trop peu rigoureux laisse passer des résidus de la fréquence de comparaison que l'on peut retrouver ensuite en pied de porteuse.

2.1.1 Réseau d'ordre 1.

Le filtre RC d'ordre 1 est le plus simple ; il impose d'avoir un VCO présentant une impédance d'entrée d'influence négligeable.

1/(1+RCp)

Le réseau RC pouvant être insuffisant pour la stabilité de la boucle, on lui préfère ce réseau à retard de phase (R1R2C).

(1+R2Cp)/(1+R1Cp+R2Cp)

2.1.2 Réseau R1R2C1C2.

Le filtrage des réseaux précédent est assez sommaire et transmet une partie de la fréquence de comparaison.
On utilise donc un filtre d'ordre deux dont la fonction de transfert vaut :

(1+R2C1p)/(1+R1C1p+R2C1p+R1C2p+R1R2C1C2p²)

2.1.3 Filtres actifs.

Il éxiste une multitude de montages, on présentera ici le plus classique, l'intégrateur.

(1+R2Cp)/(R1Cp)

La structure qui suit est un peu plus complex, elle présente un pré filtrage en T qui atténue la fréquence de comparaison.

(1/R1C2p)(1+R2C2p)/(2+R1C1p) (à confirmer avec spice)

Cette structure peut être utilisée typiquement avec un comparateur de phase à sortie UP & DOWN, comme décrit ci-dessus.
Etude des fonctions de transfert et diagramme de Bode avec spice : simulation analogique.

2.3 Le VCO.

Il peut être de plusieurs type :
Soit un oscillateur à circuit accordé : LC avec varicap. Oscillateurs RF à transistors.
Soit à quartz, dans ce cas l'excusrion est faible. Oscillateurs à quartz.
Ou à résonnateur diélectrique (hyper fréquence par exemple). Oscillateur à résonnateur diélectrique.
Le VCO est généralement conçu de façon à obtenir une réponse linéaire ; on le carctérise par son gain Kvco = Df/Dv en MHz/V.

3. Tableau récapitulatif des fonctions de transferts.

4. Caractérisation de la pll, calcul des éléments.

4.1 Notions mathématiques : transformée de Laplace.

Transformation de Laplace. (pierre Simon Laplace, mathématicien (1749-1827).
Définition :
Soit f(t) une fonction du temps Sa transformée unilatérale de Laplace est définit par :

La transformée de Laplace inverse unilatérale f(t) d'une fonction F(p) est définie par :

Rappel concernant les systèmes asservis. Un système asservis est un système bouclé dont la grandeur de sortie est asservie sur celle d'entrée. On notera :

Ho(p) = la fonction de transfert de la chaine direct.
B(p) = la chaine de retour.
Ho(p).B(p) = fonction de transfert de la boucle ouverte.
Ho(p)/(1+Ho(p).B(p)) = fonction de transfert de la boucle fermée. (Formule de Black)

Fonction de transfert d'un VCO = Kvco/p
On rappel que 1/p est le résultat de la conversion fréquence/phase.
w = dφ/dt donc w(p) = p.φ(p).
La pulsation est la dérivée par rapport au temps de la phase instantanée.
Kd est le gain du détecteur de phase.
F(p) représente la fonction de transfert du filtre passe bas.

4.2 Système en boucle ouverte.

Quelques considérations d'ordre général.
L'Ordre de la PLL = ordre du filtre de boucle + 1.
L'état de verrouillage doit être obtenu avec un temps de réponse rapide.
Plage de capture : la synthèse peut récupérer toute dérive de phase.
Plage de verrouillage : c'est la plage d'utilisation normale d'une PLL. (inférieur à plage de capture).
La fonction de transfert en boucle ouverte permet de définir les éléments du filtre de boucle.
La stabilité du système est définit par la marge de phase.

le gain en boucle ouverte est donné par la relation :

  BO(p) =  (Kvco / p) *  (Kd / N) * F(p).

Pour la valeur | Ho(s)| = 0dB on cherche à obtenir une marge de phase de 45° soit :

MP = 180° - arg Ho(p) = 45°

La fréquence de coupure de la fonction de transfert doit se situer aux environ de Fcomp/100, la fréquence de comparaison étant définit par Fquartz/R (ex : 8MHz/64 = 125KHz) et représente le pas de fréquence synthétisable. Les résidus et harmoniques de la fréquence de comparaison sont filtrés par le filtre de boucle en fonction de l'ordre choisit. Lorsque l'écart entre fref et fosc/N est trop important, il est possible que l'information délivrée par le comparateur de phase au VCO soit inexploitable et empêche le démarrage de la PLL. La plage de capture est définit par cette restriction (bande de fréquence où la PLL se verrouille). Une fois l'asservissement obtenu, fosc doit suivre toutes variation de fref ; la plage de poursuite est limitée par la plage propre du VCO ou par une valeur d'erreur trop faible par rapport à ce que le VCO peut accepter ou encore la saturation des différents éléments. (bande de fréquence où la PLL reste verrouillée). Dans le cas d'un comparateur de fréquence, ces deux plages sont confondues.

4.3 Système en boucle fermée.

Soit Ho(p) la fonction de transfert de la chaîne directe,
Et B(p) la fonction de transfert de la chaîne de retour.
Ho(p).B(p) représente la fonction de transfert en boucle ouverte.
La réponse en boucle fermée vaut alors (formule de Black) :

BF(p) = Ho(p) / ( 1 + B(p)*Ho(p)).

Elle permet d'obtenir l'erreur de boucle et sert de départ pour le calcul de la réponse à un échelon du système (passage de f1 à f2). On calcul ainsi le temps de réponse de la pll (très utile dans les gsm ou le "handover" est régulièrement effectué). On définit aussi avec la fonction de transfert en boucle fermé la fréquence de coupure du système ainsi que son coefficient d'amortissement.
L'entrée en échelon part d'une fréquence fe, on effectue à t=0+ une variation Delta_Fe ; la transformée de Laplace de l'entrée vaut Delta_fe / p² et permet de caractériser l'erreur de position. L'entrée en rampe part d'une fréquence fe puis varie linéairement, la transformée de Laplace de cette entrée vaut Delta_fe/p² et permet de caractériser l'erreur de trainage.

La fonction de transfert 2*pi permet la conversion fréquence vers pulsation.
La fonction de transfert 1/p permet la conversion pulsation vers phase.
2*pi/p après le comparateur de phase résulte des conversions précédentes sur
chacun des accès.
Le gain Kd exprimé en Volt/rad permet de passer de la phase à une tension.
F(p) correspond à la fonction de transfert du filtre de boucle. (sans unité)
Av représente un éventuel gain en tension (ici Av=1).
Kvco/2.pi permet de passer de la tension à une fréquence.

Note concernant le bruit de phase :
Le bruit de phase de la sortie synthétisée est déterminé par le bruit du quartz de référence, ensuite par le bruit du détecteur de phase et ce jusqu'à la bande passante du filtre, puis par le VCO. Les bruits ramenés par le cristal et le détecteur de phase sont dégradés de 20logN à l'intérieur de la bande passante du filtre de boucle, mais filtré par sa fonction de transfert au delà. Le bruit du VCO est considérablement atténué pour des fréquences proches de la porteuse alors que le bruit sera transmis sans atténuation à des fréquences avoisinants le filtre de boucle et au delà. L'augmentation de l'ordre du filtre de boucle de 2 à 3 ou 4 permet une meilleure atténuation des éléments parasites et du bruit. Une faible largeur de bande du filtre de boucle améliore le bruit de phase pour des offsets fm supérieurs à la largeur du filtre ; une plus haute largeur de bande améliorera le bruit proche et à l'intérieur de la bande. Généralement le bruit de phase est induit par le VCO, Le coéfficient de charge Q du VCO est un élément primordial dans la détermination du bruit de phase.

5. Modélisation sous Mathlab.

Exemples pratiques et calcul des éléments avec mathlab.
La partie numérique de la PLL est détaillée en fin de document.

Figure 1 : schéma de la pll.

Les valeurs suivantes seront utilisées pour les calculs :
Kpd = 9 Volts / 2*pi = 1,432 Volts/rad
Kvco = 2*pi* (2*125ppm) *44,736MHz = 17,27e3 rad/Volt.sec

Présentation du script de calcul de stabilité sous mathlab :

%-------------------------------------------------------------------------------
%-- Titre      : boucle à verrouillage de phase
%-- Projet     : X_OC3
%-------------------------------------------------------------------------------
%-- Fichier    : pll
%-- Auteur     : FLP/OTT
%-- Compagnie  : OTT
%-- Création   : 05/11/2003
%-- Last update: --
%-------------------------------------------------------------------------------
%-- Description  : Modélisation d'une pll...
%-- terminologie : Dans la suite du document, Ho représente la fonction de
%                  transfert de la chaine directe & B, la boucle de retour.
%                  Le sigle FT désigne la Fonction de Transfert.
%                  BO & BF respectivement Boucle Overte & Boucle Fermée.
%-- Définition   : Transformée de laplace : H(p) = INT [H(t)exp(-p*t)dt]
%                : Transformée inverse : h(t) = (1/2*pi*j) INT [F(p)exp(p*t)dp]
%-------------------------------------------------------------------------------
close all
clear all
clc

%-------------------------------------------------------------------------------
% Paramètres globaux.
%-------------------------------------------------------------------------------

fe          = 10000;
N           = 6192;
t           = 0:1/fe:2; %nb d'éléments de la matrice : 20 000(2*fe)

%-------------------------------------------------------------------------------
% Filtre de boucle seul.
%-------------------------------------------------------------------------------
% Rappel sur la fonction freqs :
% soit H(p) =(0.2 * p^2 + 0.3 * p + 1) / (0.4 * p + 1)
% a = [0.4 1] et b = [0.2 0.3 1]
% Par la suite, la fonction freqs sera utilisé pour représenter la FT.
%-------------------------------------------------------------------------------
% Filtre de boucle passif d'ordre 1 (R1+C) : (a)
% H(p) = 1 / (1 + Tau1 * p)
% Filtre de boucle passif d'ordre 1 modifié (R1+R2/C) : (b)
% H(p) = (1 + Tau2 * p) /(1 + (Tau1 + Tau2) * p)
% Filtre de boucle actif d'ordre 1 :(c)
% H(p) = (1 + Tau2 * p) / (Tau1 * p)
% Filtre de boucle actif avec intégrateur :(d)
% H(p) = K/p * (p+z1) / (p+p1)
% Filtre de boucle actif 'c' modifié :(e)
% H(p) = (1/Tau11*p) * (1 + Tau22*p)/(2 + Tau11*p)
%-------------------------------------------------------------------------------

string_name_lpf = 'Fonction de transfert du filtre de boucle';
w           = logspace(-2,4);
f           = w/(2*pi); % conversion de la pulsation en fréquence

% paramètres du filtre de boucle (d)
% extrait de la documentation TranSwitch.
% On choisit z1=0.1 et p1=10
% le passage à 0 du gain sera analysé avec la FT en BO

Rin         = 1000e3; % N'influence pas les points d'inflexions, juste le gain.
Cs          = 10e-6; %diminuer Cs pour avoir un gain nul à l'optimum de phase.
Rf          = 1e6;
Cp          = 100e-9;

Tau11       = Rin*Cs;
Tau22       = Rf*Cp;
Tau21       = Rf*Cs;
K           = (Tau21+Tau22)/(Tau11*Tau22);
zero1       = 1/(Tau21+Tau22);
pole1       = 1/Tau22;

a_d         = [1 pole1 0]; %polynome du dénominateur
b_d         = [0 K K*zero1]; %polynome numérateur

H_lpf_d     = freqs(b_d,a_d,f)
mag_d       = abs(H_lpf_d);
phase_d     = angle(H_lpf_d);
magdB_d     = 20*log10(mag_d); %conversion de la magnitude en décibel
phaseDeg_d  = phase_d*180/pi; %conversion de la phase en degrés.


% paramètres du filtre de boucle (c)
% l'ordre du dénominateur est identique à celui du numérateur;
% qd la fréquence est importante, le gain tend vers R2/R1
% et peut ne jamais descendre en dessous de 0dB...

R1          = 33e3;
R2          = 3.3e3;
C           = 2.2e-6;

Tau1        = R1*C;
Tau2        = R2*C;

a_c         = [Tau1 0]; %polynome du dénominateur
b_c         = [Tau2 1]; %polynome numérateur

H_lpf_c     = freqs(b_c,a_c,f)
mag_c       = abs(H_lpf_c);
phase_c     = angle(H_lpf_c);
magdB_c     = 20*log10(mag_c); %conversion de la magnitude en décibel
phaseDeg_c  = phase_c*180/pi; %conversion de la phase en degrés.

% paramètres du filtre de boucle (e)
% Utilisation sur la carte OTA gigue.
R1in        = 4.7e3;
C1in        = 100e-9;
R2cr        = 33e3;
C2cr        = 2.2e-6
R2neg       = 1e6; %n'influence pas la stabilité : diminue la gain static.
C2pos       = 10e-9; %non connecté : introduit un pôle instable.

Tau22_e     = R2cr*C2cr;
Tau11_e     = R1in*C1in;
Tau12_e     = R1in*C2cr;

a_e         = [Tau12_e*Tau11_e 2*Tau12_e 0]; %polynome du dénominateur
b_e         = [0 Tau22_e 1]; %polynome numérateur

H_lpf_e     = freqs(b_e,a_e,f)
mag_e       = abs(H_lpf_e);
phase_e     = angle(H_lpf_e);
magdB_e     = 20*log10(mag_e); %conversion de la magnitude en décibel
phaseDeg_e  = phase_e*180/pi; %conversion de la phase en degrés.

subplot(2,1,1), semilogx(f, magdB_d), xlabel('fréquence'), ylabel('magDB'), title(string_name_lpf)
grid on;
subplot(2,1,2), semilogx(f, phaseDeg_d), xlabel('fréquence'), ylabel('phase')
grid on;
pause;

%-------------------------------------------------------------------------------
% Modélaisation de la PLL.
%-------------------------------------------------------------------------------
% Décomposition de la pll en éléments simples.
% Définition des paramètres d'entrée.
%-------------------------------------------------------------------------------

Val_N       = 512; %coef de division N de la PLL
PreDiv      = 32; %facteur de prédivision
Val_R       = 16384; %facteur de division R de la PLL
K_phi       = 3.3/(2*pi); %gain du comparateur de phase
K_vco       = 2*pi*(10e3/3); %gain du vco=delta_f/delta_v (écart de fréquence/écart de tension)
Av          = 1; %gain en tension ds le cas de filtre de boucle actif


%-------------------------------------------------------------------------------
% Asservissement de la boucle à verrouillage de phase.
% On entre dans le comparateur de phase :
% la fréquence de comparaison = fref/Val_R
% et la fréquence du VCO divisée : Fvco/Val_N (ramenée au environ de fref)
% L'erreur de phase sert de tension de commande au VCO...
%-------------------------------------------------------------------------------


pulsation   = logspace(-1,3);
freq        = pulsation/(2*pi); % conversion de la pulsation en fréquence
K_retour    = 1/(PreDiv*Val_N);
K_num       = K_phi*K_vco*Av;
Alpha       = K_num*K_retour;


%-------------------------------------------------------------------------------
%la fonction de transfert en BO permet de définir la marge de phase et donc la
%stabilité du système. Pour module de (H*B)=1 (gain nul en dB) il faut une marge
%de phase PHI minimale de 45° ie. PHI_Hbo > 135°
%Une marge de phase de phase de 45° correspond à un coef d'amortissement khi=0.5
%La pll est d'autant plus stable que K_num est grand, Tau1 élevé et Tau2 faible...

%Pour le filtre de boucle (d) (TranSwitch application notes)
%H_lpf(p) = K/p * (p+z1) / (p+p1)
%Le rapport Rin/Rf définit le gain choix de Rin pour l'optimum de phase.
%-------------------------------------------------------------------------------


a_bo_d      = [1 pole1 0 0]; %polynome du dénominateur
b_bo_d      = [0 0 K*Alpha K*Alpha*zero1]; %polynome numérateur
H_bo_d      = freqs(b_bo_d,a_bo_d,freq) %calcul en fct de pulsation
magBO_d     = abs(H_bo_d);
phaseBO_d   = angle(H_bo_d);
magdB_BO_d  = 20*log10(magBO_d); %conversion de la magnitude en décibel
phaseDeg_BO_d = phaseBO_d*180/pi; %conversion de la phase en degrés.

%avec H_lpf(p)=(1+Tau2*p)/Tau1*p on obtient
%H_bo(p) = H_lpf(p) * Kphi * Kvcxo * Av * (1/32*N) * (1/p)

a_bo_e      = [Tau12_e*Tau11_e 2*Tau12_e 0 0]; %polynome du dénominateur
b_bo_e      = [0 0 Alpha*Tau22_e Alpha]; %polynome numérateur
H_bo_e      = freqs(b_bo_e,a_bo_e,freq) %calcul en fct de pulsation
magBO_e     = abs(H_bo_e);
phaseBO_e   = angle(H_bo_e);
magdB_BO_e  = 20*log10(magBO_e); %conversion de la magnitude en décibel
phaseDeg_BO_e = phaseBO_e*180/pi; %conversion de la phase en degrés.

string_name_BO = 'Fonction de transfert en Boucle Ouverte';
subplot(2,1,1), semilogx(freq, magdB_BO_d), xlabel('fréquence'), ylabel('magDB'), title(string_name_BO)
grid on;
subplot(2,1,2), semilogx(freq, phaseDeg_BO_d), xlabel('fréquence'), ylabel('phase')
grid on;
pause;

%-------------------------------------------------------------------------------
%calcul de la fonction de transfert en boucle fermée :
%On utilise la formule de BLACK pour la fonction de transfert en BF.
%Formule de Black = (Boucle directe)/(1 + boucle directe * boucle Retour);
%avec H(p)=(1+Tau2*p)/Tau1*p la FT en BF est définit par :
%(Tau2*p + Kn)/(Tau1*p^2 + Tau2*p + Kd)
%On obtient la bande passante du système (freq de coupure à 3dB)
%ainsi que le facteur d'amortissement.
%-------------------------------------------------------------------------------

%Pour le filtre de boucle (d) (TranSwitch application notes)
%H_lpf(p) = K/p * (p+z1) / (p+p1)


Alpha_d     = K_phi*Av*K_vco;
K_retour_d  = 1/(PreDiv*Val_N);
K_direct_d  = 1/(Val_R);
%denom_d     = [1 pole1 K*Alpha_d*K_retour_d K*Alpha_d*K_retour_d*zero1];  %polynome du dénominateur
%numerat_d   = [0 0 K*Alpha_d/Val_R K*Alpha_d*zero1/Val_R]; %polynome numérateur
denom_d     = [1 pole1 K*Alpha_d*K_retour_d K*Alpha_d*K_retour_d*zero1];  %polynome du dénominateur
numerat_d   = [0 0 K*Alpha_d*K_direct_d K*Alpha_d*zero1*K_direct_d]; %polynome numérateur
H_black_d   = freqs(numerat_d,denom_d,freq) %fonction de transfert en BF.
magHb_d     = abs(H_black_d);
phaseHb_d   = angle(H_black_d);
magdB_BF_d  = 20*log10(magHb_d); %conversion de la magnitude en décibel
phaseDeg_BF_d = phaseHb_d*180/pi; %conversion de la phase en degrés.

string_name_bf = 'Fonction de transfert en BF';
subplot(2,1,1), semilogx(freq, magdB_BF_d), xlabel('fréquence'), ylabel('magDB'), title(string_name_bf)
grid on;
subplot(2,1,2), semilogx(freq, phaseDeg_BF_d), xlabel('fréquence'), ylabel('phase')
grid on;
pause;

%-------------------------------------------------------------------------------
%La fct de transfert en BF permet aussi de définir la réponse à un échelon.
%La réponse à un échelon, permet de déterminer le facteur d'amortissement (khi)
%et la pulsation naturelle (wn) (tout comme la FT en BF le faisait aussi.)
%Elle se calcul en définissant S(p) = e(p)*H_bf(p)
%avec E(p)=1/p, et H_bf(p) la fct de transfert définit ci-dessus.
%En pratique, on doit calculer S(p) puis on effectue une transformée
%de laplace inverse pour retourner dans le domaîne temporel.
%Pour cette simulation, l'utilisation de la transformée en z s'avère plus simple.
%Le passage
%-------------------------------------------------------------------------------

La suite du script devait représenter la réponse à un échelon et à une rampe...

Figure 2 : fonction de transfert du filtre de boucle.

Il est courant de présenter la fonction de transfert du filtre de boucle sous sa forme pôlinomiale faisant apparaître les pôles et les zéros. Les pôles de la fonction de transfert correspondent à des changements introduisant de l'atténuation et une augmentation de phase. Les zéros de la fonction de transfert, au contraire, réduisent la phase et l'atténuation. Pour ce filtre de boucle ci-dessus, la fonction de transfert vaut :

  L_lpf(p) =  (K / p) *  (p+ z1) / (p+p1)
K = 1 / (R1 * C2)
p1 = R1 * C1
z1 = R2 * C2

La fonction de transfert en boucle ouverte est définit par la multiplication de la chaine directe avec la chaine de retour, soit Kpd * Kvco * L_lpf(p) * 1/(N*p) La marge de phase est mesurée et ajustée avec les éléments R et C du filtre de boucle ; Une marge de phase d'environ 135° entraine une réponse trensitoire oscillante. Une marge de phase de 90° génère des pics de jitter. Une marge de phase de 45° correspond à un coefficient d'amortissement de 0,5 et un dépassement de 20% pour une entrée en échelon.

Figure 3 : Fonction de transfert en boucle ouverte.

Considérations :
La fréquence de comparaison présente à la sortie du détecteur de phase est atténuée par le filtre de boucle. Il reste toutefois souvent un résidu présent à l'entrée du VCXO qui module la fréquence générée et cause du buit de phase (jitter).
Un pôle suipplémentaire (RC) est donc ajouté derrière le filtre de boucle ; il ne doit pas compromettre ni influencer la stabilité du système. Valeur classique utilisées : R=4k7 et C=2,2uf soit une fréquence de coupure de 15Hz.
Rmax ne doit pas dépasser 1/10 de l'impédance d'entre du VCXO.
Rmin de 1k est conseillée afin de rendre le circuit RC indépendant du filtre de boucle.

Figure 4 : Fonction de transfert en boucle fermée.

6. Glossaire.

Page de verrouillage :
Correspond à l'écart de fréquence par rapport à la fréquence centrale à partir duquel la pll se déverrouille. (aussi appelé plage de maintien ou de poursuite)

Plage de capture :
La plage de capture correspond à l'écart de fréquence par rapport à la fréquence centrale à partir duquel la pll se verrouille. Elle est inférieure à la plage de verrouillage et vaut de façon très approchée, la bande passante du filtre.

TCXO : Oscillateur à quartz compensé en température.
Spurious attenuation : valeur de filtrage par le filtre de boucle de la fréquence de comparaison.
Spectrum analyser : équipement permettant de mesurer la répartition fréquentielle des puissances.
Prescaler : prédiviseur HF. (intègre une partie de N)
Overshoot : Représente le dépassement sur une réponse à un échelon d'un second ordre.
Natural frequency (ωn) : correspond à la fréquence des oscillations de la réponse à un échelon.
Fonction de transfert en BO : Kvco * Kpd * Hlpf(p) / (N * p)
PLL N dfractionnée : PLL dont le coefficient N peut être fractionnaire.
Fréquence de comparaison : Valeur du quartz divisée par R.


7. Documentation, bibliographie.

Boucle à verrouillage de phase,
Michel Girard,
Editions MacGraw Hill, 1988.

Genesys PLL,
Eagleware corporation.

PLL calculation,
application note Intel.

Nettest, phase detector modelisation.
Vhdl description.

Informations générales (pll, I2c, usb...)
Description vhdl d'un système à pll.
Structures de détecteur de phase.
fichier pdf sur les pll.


Description de la partie numérique de la PLL en vhdl.
(ce ne sont que deux compteurs et un comparateur de phase.)

--
-- Asservissement de fréquence, partie numérique.
-- division par R de l'horloge de référence, on obtient clk_comp = Fref/R
-- division par K de l'horloge utile, on obtient Clk_in/K
-- L'asservissement permet d'avoir Fref/R = Fin/K soit, Fin=K*fcomp
--
-- Structure du comparateur de phase : Phase Frequency Detector.
-- gain : Kpd = (Voh-Vol)/2*PI en [V/rad]
-- 
library IEEE;
use IEEE.Std_logic_1164.all;
use IEEE.Numeric_std.all;

entity PLL_interne is port (
   XGSR : in std_logic; -- Reset asynchrone, programmation des xilinx
   CLK_in : in std_logic; -- Horloge à asservir
   Clk_ref : in std_logic; -- Horloge de référence
   PLL_Val_R : in std_logic_vector(10 downto 0); --facteur de division sur Fref
   PLL_val_K : in std_logic_vector(15 downto 0); -- facteur de division sur Fvco
   PhiD_down : out std_logic; -- sortie comparateur de phase vers LPF
   PhiD_up : out std_logic; -- sortie comparateur de phase vers LPF
   IO_test : out std_logic_vector(15 downto 0));
end PLL_interne;

architecture Alpha of PLL_interne is

-- compteur R-N
signal Cpt_clk_in : unsigned(15 downto 0);
signal Cpt_clk_ref : unsigned(10 downto 0);
-- division par 2 pour rapport cyclique de 50%:
signal PLL_Val_R_2 : std_logic_vector(10 downto 0);
signal PLL_val_K_2 : std_logic_vector(15 downto 0);
-- horloge de comparaison Fref/R
signal Clk_comp : std_logic;
-- horloge d'entrée divisée par K
signal Fin_div : std_logic;
-- comparateur de phase
signal Q_up : std_logic;
signal Q_down : std_logic;
signal Reset : std_logic;

begin

IO_test(7 downto 0) <= Clk_comp & Fin_div & Q_up & Q_down & Clk_ref & CLK_in & "11";
IO_test(15 downto 8) <= (others => '1');
PLL_Val_R_2 <= '0' & PLL_Val_R(10 downto 1);
PLL_Val_K_2 <= '0' & PLL_Val_K(15 downto 1);

--
-- Horloge de référence divisée par R
-- pour génération de l'horloge de comparaison
--
div_clk_comp: process(Clk_ref,XGSR)
begin
if (XGSR='1') then
   Cpt_clk_ref <= (others => '0');
   Clk_comp <= '0';
elsif rising_edge(Clk_ref) then
   if (Cpt_clk_ref = unsigned(PLL_Val_R)-1 ) then
     Cpt_clk_ref <= (others => '0');
   else
     Cpt_clk_ref <= Cpt_clk_ref + 1;
   end if;
   if (Cpt_clk_ref=0) then
     Clk_comp <= '0';
   elsif (Cpt_clk_ref = unsigned(PLL_Val_R_2)) then
     Clk_comp <= '1';
   end if;
end if;
end process div_clk_comp;

--
-- Horloge à asservir divisée par K
-- pour se rapporter à la même fréquence que clk_comp
-- à l'asservissement (phase) près
--
div_clk_in: process(CLK_in,XGSR)
begin
if (XGSR='1') then
   Cpt_clk_in <= (others => '0');
   Fin_div <= '0';
elsif rising_edge(CLK_in) then
   if (Cpt_clk_in = unsigned(PLL_Val_K)-1 ) then
     Cpt_clk_in <= (others => '0');
   else
     Cpt_clk_in <= Cpt_clk_in + 1;
   end if;
   if (Cpt_clk_in=0) then
     Fin_div <= '0';
   elsif (Cpt_clk_in=unsigned(PLL_Val_K_2)) then
     Fin_div <= '1';
   end if;
end if;
end process div_clk_in;
--
-- Comparateur de phase séquentiel
-- détecteur Phase/fréquence
--
-- Si les sorties up et down sont à '1' simultanément, les bascules sont remises à zéro (reset)
-- Deux cas possibles :
-- Si le front de Fref précède fo
-- Le premier front de fref active up, le front suivant de fo activera down et déclenchera reset
-- On obtient sur up une pulse de la durée de l'écart entre fref et fo.
-- Si Fo arrive en premier (précède fref) la pulse apparaitra sur down.
-- Le gain de cette structure est définit par Kd = (Voh-Vol)/2*PI en [V/rad]

process(Clk_comp,XGSR,reset)
begin
if (XGSR='1' or reset='1') then
   Q_up <= '0';
elsif rising_edge(Clk_comp) then
   Q_up <= '1';
end if;
end process;

process(Fin_div,XGSR,reset)
begin
if (XGSR='1' or reset='1') then
   Q_down <= '0';
elsif rising_edge(Fin_div) then
   Q_down <= '1';
end if;
end process;

Reset <= Q_up and Q_down;
PhiD_down <= Q_down;
PhiD_up <= Q_up;
end Alpha;


vhdl2html ; génération automatique en Perl.

Todo : porter la simulation sous Spice (si possible) ou Ptolemy avec GUI associé.