L’auto-pilotage des actionneurs électromécaniques triphasés nécessite la connaissance de
la position angulaire (angle électrique) du rotor.
Cette information est le plus souvent fournie par un « resolver » qui élabore un signal
sinusoïdal $ \alpha(t) $ où $ \alpha(t) = \Omega.t $ est
l’angle électrique.
A partir de là, une électronique fournit 3 sinusoïdes I.sin(Ωt), I.sin(Ωt - 2π/3) et I.sin(Ωt - 4π/3),
qui seront les consignes de courant instantané de chacune des phases.
Le « resolver » est un dispositif lui même électromécanique ou optique solidaire du rotor.
Il existe des situations particulières où des contraintes technologiques interdisent l’emploi d’un « resolver ».
La seule information dont on dispose est une impulsion de « top 0 » à chaque passage de l’angle électrique par 0.
Il est alors nécessaire de reconstituer les 3 sinusoïdes à partir de cette impulsion, ce qui est la fonction de base
d’une boucle à verrouillage de phase (BVP).
On se propose d’étudier ici une boucle à verrouillage de phase entièrement numérique qui pourrait être implantée dans un circuit logique programmable de type FPGA :
Tous les circuits séquentiels de cette structure fonctionnent avec une même horloge de période Te
Le cahier des charges général est le suivant :
Dans tout le problème la fréquence de l’horloge est fixée à fe = 3 kHz
Démarage de la BVP pour une fréquence de 300 Hz :
Fonctionnement permanent pour une fréquence de 60 Hz :
Les ROMs ont chacune une capacité de $ 2^{9} $ mots de 8 bits. On souhaite obtenir en sortie des sinusoïdes de dynamique maximum.
Donner pour chacune des 3 ROMs le contenu des 3 premières et des 3 dernières adresses
On propose un programme MATLAB pour générer les différents points de sinusoïde contenus dans les ROM :
%N Nombre de points de sinusoide
N=512
% CONTENU DE ROM 1
figure(1)
x=0:(2*pi)/N:2*pi
stem(sin(x));
SINUS_1=round(127*sin(x));
stem(SINUS_1)
for i = 1:N
if SINUS_1(i)<0 SINUS_1(i) = 256 + SINUS_1(i); end;
end
fid = fopen('sinus_bin_1.txt','wt');
for i = 1:N
fprintf(fid,'"%s",',dec2bin(SINUS_1(i),8));
end
fclose(fid)
Que faudra-t-il modifier dans ce programme pour générer les données des ROM 2 et 3 ?
INDICATION : Description d’une ROM en VHDL
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity rom1 is
generic( taille_bit : integer :=9);
port( adresse : in std_logic_vector(taille_bit-1 downto 0);
donnee : out std_logic_vector(7 downto 0));
end rom1;
architecture arch_rom1 of rom1 is
type memory is array(integer range 0 to 2**taille_bit-1) of std_logic_vector(7 downto 0);
constant mem : memory :=(
-- A COMPLETER (POINTS GENERES AVEC MATLAB)
);
begin
donnee <= mem(to_integer(unsigned(adresse)));
end arch_rom1;
La structure de cet OCN, organisée autour d’un additionneur et d’un registre N bits, est la suivante :
En prenant N=4, donner l’évolution de la phase numérique pour $ \delta\phi=1 $ puis pour $ \delta\phi=3 $ .
En déduire l’expression générale de la fréquence de la phase numérique en fonction de N, $ \delta\phi $
Compte tenu du cahier des charges, déterminer la valeur minimum de N, et les valeurs de $ \delta\phi $ correspondant aux fréquences de 60 et 300 Hz.
Le comparateur de phases reçoit les signaux logiques « top 0 » et « top synchro ». Le rapport cyclique de ces signaux étant incertain,
il ne faudra prendre en compte que les fronts montants de ces signaux.
Le comparateur de phase élabore 2 signaux logiques AV et AR, actifs à l’état haut..
Le fonctionnement est le suivant :
On souhaite obtenir une impulsion d’une durée d’une période d’horloge lors du front montant du signal d’entrée.
On propose le diagramme d’états suivant :
On propose le diagramme d’états suivant pour décrire le fonctionnement du comparateur de phase :
Donner la succession des états dans les différents cas de figure et montrer que cela correspond au fonctionnement attendu
Le compteur/décompteur sera incrémenté (resp. décrémenté) au rythme de l’horloge si AV est actif (resp. AR actif).
Le correcteur a comme fonction de transfert
$$ 4.5-4.25.z^{-1} $$RAPPEL : Les calculs s’effectuent uniquement avec des nombres entiers ; une multiplication entre 2 entiers de taille N donne un résultat de taille 2*N.