Professional Documents
Culture Documents
2 2
2 2 3 4 5
6 7
7 8 9
MEE \pid_num.tex
3 octobre 2007
HEIG-VD
1 Introduction
Le but de ce travail de laboratoire est de programmer puis de mettre en oeuvre une premire version du rgulateur numrique de type PID. L'algorithme du rgulateur sera programm en langage de haut niveau (C) sur Windows XP puis test sur un systme rgler du laboratoire (simulateur analogique, foehn, rail, etc). Bien que l'environnement de travail propos (Windows XP, temps rel, Simulink, etc) puisse paratre relativement complexe, il est bon de se rappeler que la seule et unique fonction C que l'on demande de programmer est
reg_pid()
Le code devra se trouver dans le chier
regul.c
L'annexe 4 page 7 fournit un rappel thorique le rgulateur PID numrique.
MEE \pid_num.tex
3 octobre 2007
HEIG-VD
pid_num.zip
partir du site http://www.iai.heig-vd.ch/mee//Laboratoires_regulation_aut.htm dans votre propre rpertoire (qui devrait tre d:\users ou un de ses sousrpertoires que vous pouvez crer).
regul.c
, programmation du rgulateur
La seule unique fonction que l'on demande de programmer devra se trouver dans le chier regul.c. Pour diter le code, l'diteur "PFE" est install et son utilisation est recommande. On peut l'appeler par son icne partir du bureau. Le canevas de ce chier est fourni. Il montre que les signaux provenant de la carte d'acquisition sont disponibles dans les variables globales in0, in1, in2 et in3.
/
/ s o r t i e s / e n t r e e s
analogiques analogiques
/ /
decalages
analogiques analogiques
/ /
decalages
Les paramtres du rgulateur doivent quant eux tre dclars comme variables globales, par exemple comme suit :
/ g a i n s
Kp = 0 . 0 ; Gi = 0 . 0 ; Td = 0 . 0 ; a = 0.01;
du
regulateur
PID /
1 Le paramtre Gi est gal T . Pourquoi le gain sur l'action intgrale est-il implant i de cette manire ? De faon ce que ces paramtres soient visibles et modiables en ligne partir de RTPWatch, il faut les enregistrer dans le tableau var comme suit :
/ Declaration des variables accessibles depuis le PC via RTPWatch
Si vous l'estimez ncessaire, vous pouvez bien sr crer d'autres fonctions prives de regul.c, comme par exemple une fonction de limitation de la commande. A noter que les valeurs numriques initiales, "par dfaut" des paramtres peuvent tre spcies dans regul.c : la fonction regulation_init est appele au dmarrage et les initialisations peuvent y tre places :
Rgulateur PID numrique, v.1.6
MEE \pid_num.tex
3 octobre 2007
HEIG-VD
/ Initialisation du regulateur
void
regulation_init (
de la
void )
/ D e f i n i t i o n
r e g u l a t i o n _ b o u c l e _ i n t e r n e = regul_PID ; mode_boucle_interne = 1 ;
de la fonction effectuant la
fonction
effectuant
la
regulation
de
la
boucle 1 / / mode
/ R e g u l a t e u r
/ D e f i n i t i o n
regulation
de
la
boucle / mode
/ R e g u l a t e u r
/ I n i t i a l i s a t i o n
Kp = 0 . 0 ; Gi = 0 . 0 ; Td = 0 . 0 ; a = 0.01; AW = 0 ; offset_out0 = 0 . 0 ; offset_out1 = 0 . 0 ; offset_in0 offset_in1 offset_in2 offset_in3 = = = = 0.0; 0.0; 0.0; 0.0;
w = 0.0; umax = 1 0 . 0 ;
RTPWatch.
regul.c
Vous pouvez compiler votre programme en lanant un compilateur C/C++ partir de l'diteur PFE, menu Execute DOS Command and Capture Output. La commande make ou make -B (quivalente l'opration build) doit tre tape. Si aucune erreur n'est dtecte, le chier objet (regul.obj) est gnr. Dans la ngative, la fentre PFE ouverte indique le message d'erreur.
Rgulateur PID numrique, v.1.6
MEE \pid_num.tex
3 octobre 2007
HEIG-VD
MEE \pid_num.tex
3 octobre 2007
HEIG-VD
/
/ Version 1 2 3 4 5 Date 04/05/98 14/08/99 06/09/99 07/02/01 11/03/02 MEE MEE MEE MEE MEE Auteur Regulateur Mi se Labo Labo a jour pour temps reel NT NI numerique numerique avec carte Motif scalaire Regulateur Adaptation PID PID de courant de position PID
#define REGUL_C #include " r e g u l . h" float float float float float float float float float float float
/
/ entte de l ' unit et
/
relatives a la regulation
offset_out0 , offset_out1 ;
a appliquer sur
decalages
les
entrees
analogiques
periode
/
/ g a i n s du regulateur PID /
t_var var [ ] = { v a r _ f l o a t (w) , var_float ( offset_out0 ) , var_float ( offset_in0 ) , var_float ( offset_in1 ) , v a r _ f l o a t (w_0) , v a r _ f l o a t ( Te ) , var_int (T_u) , v a r _ f l o a t (A_u) , end_var_list };
Regulateur PID
void
regul_PID ( )
/ C a l c u l // M e s u r e s
de
w = generateur_u ( 2 ) + w_0 ;
la
c o n s i g n e /
y = in0 offset_in0 ;
/ A l g o r i t h m e /
out0 = . . . ;
Rgulateur PID numrique, v.1.6
MEE \pid_num.tex
3 octobre 2007
HEIG-VD
}
/ Initialisation du regulateur
void
regulation_init (
de la
void )
/ D e f i n i t i o n
r e g u l a t i o n _ b o u c l e _ i n t e r n e = regul_PID ; mode_boucle_interne = 1 ;
de la fonction effectuant la
fonction
effectuant
la
regulation
de
la
boucle 1 / / mode
/ R e g u l a t e u r
/ D e f i n i t i o n
regulation
de
la
boucle / mode
/ R e g u l a t e u r
/ I n i t i a l i s a t i o n
Kp = 0 . 0 ; Gi = 0 . 0 ; Td = 0 . 0 ; a = 0.01; AW = 0 ; offset_out0 = 0 . 0 ; offset_out1 = 0 . 0 ; offset_in0 offset_in1 offset_in2 offset_in3 = = = = 0.0; 0.0; 0.0; 0.0;
w = 0.0; umax = 1 0 . 0 ;
o e(t) est le signal d'erreur. Cette loi est discrtise en l'valuant l'instant d'chantillonnage k h (not k par la suite an allger la notation, h tant constante). Pour ce faire, on eectue les substitutions
u (t) u [k ] e (t) e [k ] de e [k ] e [k 1] dt h
MEE \pid_num.tex
3 octobre 2007
HEIG-VD
On voit que la drive de e(t) est approxim par la pente de la droite liant l'chantillon prsent e[k ] au prcdent e[k 1]. La rsolution de l'intgrale passe par le calcul de l'aire comprise entre l'axe t et le signal e(t). Une approximation de cette aire peut tre faite par la mthode des rectangles :
A A J A A E C A A
H A ? J =
A
A
D
D
D
A F
L'intgrale de e(t) l'instant t = k h est donc approxime par une somme de rectangles de largeur h et de hauteur
e ( ) d
l=0
e [l] h
u [k ] = K p
1 e [k ] + Ti
k 1
e [l] h + Td
l=0
e [k ] e [k 1] h
MEE \pid_num.tex
3 octobre 2007
HEIG-VD
dicult, crivons les lois de commande aux instants prsent k et et prcdent [k 1] et soustrayons membre membre :
u [k ) u [k 1] = Kp
= Kp
1 e [k ] + Ti 1 Ti
k2
k1
e [l] h + Td
l=0
e [k ] e [k 1] h
e [k 1] +
e [l] h + Td
l=0
e [k 1] e [k 2] h
u [k ] u [k 1] = Kp [e [k ] e [k 1]) Kp + Ti
k 1 k2
e [l ] h
l=0 l=0 e[k1]h
e [l ] h
+ Kp Td
puis
e [k ] e [k 1] e [k 1] e [k 2] h h
u [k ] u [k 1] Td h 2 Td = Kp 1 + e [k ] + Kp 1 + h Ti h
b0 b1
e [k 1] +
Kp Td e [k 2] h
b2
et nalement :
u [k ] u [k 1] = b0 e [k ] + b1 e [k 1] + b2 e [k 2]
La loi de commande du rgulateur PID numrique s'crit donc :
u [k ] = u [k 1] + b0 e [k ] + b1 e [k 1] + b2 e [k 2]
avec :
Td b0 = K p 1 + h h b1 = Kp 1 + T i Td b2 = K p h
2Td h
e [ k 1]) f e
C'est cette forme que l'on propose d'implanter ici dans le code C.
Rgulateur PID numrique, v.1.6
MEE \pid_num.tex
3 octobre 2007
HEIG-VD
Date 12 mars 2002 11 mars 2003 9 mars 2004 3 janvier 2005 10 mars 2005 1er octobre 2007 3 octobre 2007
Tab.
1 Versions publies
10
MEE \pid_num.tex
3 octobre 2007