
[Résolu] Digital PID
#1
Posté 31 mars 2013 - 07:51
u(t)=Kp e(t) + Ki Intégrale(e(t)) + Kp dérivée(e(t))
il en donne "a more digital form":
u(t)=u(t-1) + K1 E(t) + K2*E(t-1) + K3*E(t-2) avec E les erreurs et les coeffs K "are variables set similar to Kp,Ki,Kd".
Qu'en pensent ceux qui maîtrisent la théorie de la chose ?
Dans les réfs de l'article il y a les détails
http://hmnrobots.blogspot.fr/
#2
Posté 31 mars 2013 - 09:59
Un des derniers articles de Circuit Cellar (Rotational Inverted Pendulum Design) utilise un PID. Après en avoir donné sa forme analogique classique
u(t)=Kp e(t) + Ki Intégrale(e(t)) + Kp dérivée(e(t))
il en donne "a more digital form":
u(t)=u(t-1) + K1 E(t) + K2*E(t-1) + K3*E(t-2) avec E les erreurs et les coeffs K "are variables set similar to Kp,Ki,Kd".
Qu'en pensent ceux qui maîtrisent la théorie de la chose ?
Dans les réfs de l'article il y a les détails
Hello !
J'ai lu le papier en diagonale, mais il me semble qu'a certains endroit il y ai des coef \Delta t qui ne sont pas à leurs places. A part ça, le raisonnement est bon.
Je vais refaire les calculs pour mieux comprendre les avantages/inconvénients de cette méthode plupart dans la journée.
Mais déjà, une première remarque, c'est que maintenant, les 3 coef dépendent de la fréquence d'asservissement (contre 2 pour la formulation classique).
Par contre, la fin du papier m'a donner une idée : comme on fait un asservissement discret, il peut être intéressant de faire une transformée en Z sur la formule dans le domaine continu et voir ce que ça donne.
EDIT : j'ai utilisé le même procédé dans mon article sur le PI flou, mais je ne j'ai pas développé jusqu'au bout
Mon site internet : http://ferdinandpiette.com/
#3
Posté 31 mars 2013 - 10:17
je me doutais que ça susciterait ton intérêt et il vrai que ça me dépasse mais cette expression me semble facile à implémenter;Hello !
J'ai lu le papier en diagonale, mais il me semble qu'a certains endroit il y ai des coef \Delta t qui ne sont pas à leurs places. A part ça, le raisonnement est bon.
Je vais refaire les calculs pour mieux comprendre les avantages/inconvénients de cette méthode plupart dans la journée.
Mais déjà, une première remarque, c'est que maintenant, les 3 coef dépendent de la fréquence d'asservissement (contre 2 pour la formulation classique).
Par contre, la fin du papier m'a donner une idée : comme on fait un asservissement discret, il peut être intéressant de faire une transformée en Z sur la formule dans le domaine continu et voir ce que ça donne.
j'ai malgré tout compris que la démonstration aboutissait à définir l'équivalence des coefficients entre l'expression classique analogique et l'autre.
Parmi les références il y aussile lien wikipedia bien sûr
Je suis impatient de lire tes conclusions.
Un bon petit sujet pour passer l'heure gagnée cette nuit

je comprends que dans la mesure où on parle de de Delta U / t c'est pourquoi il parle de velocity algo car assimilable à une vitesse comme dans ton article
Modifié par hmnrobots, 31 mars 2013 - 10:23 .
http://hmnrobots.blogspot.fr/
#4
Posté 31 mars 2013 - 10:48
J'ai refais les calculs et je trouve bien la même chose.
Je t'invite d'ailleurs à les refaire par toi même. C'est un très bon exercice et ce n'est pas compliqué.
Je suis parti de la formule u = kp.e + ki.\integrale(e.dt) + kd.\derive(e/dt)
(La formule que j'ai exposé sur mon site, mais qui est un poil différente de la formule de départ de ton article puisque mon coef kp n'est pas en facteur.
Je discrétise avec Te, la période d'asservissement : u(k) = kp.e(k) + ki.Te.\somme{i de 0 à k}(e(i)) + kd.(e(k) - e(k-1))/Te
Pour discrétisé, j'ai remplacé
- \integrale(e.dt) par \somme{i de 0 à k}(e(i).Te)
- \derive(e/dt) par (e(k) - e(k-1))/Te
Je fais calcule uk - u(k-1), je développe et je factorise par ek.
u(k) - u(k-1) = e(k).(kp + ki.Te + kd/Te) - e(k-1).(kp + 2kd/Te) + e(k-2).(kd/Te)
On a donc trois nouveau coef qui dépendent tous de Te.
La formule finale est donc u(k) = u(k-1) + K1.e(k) + K2.e(k-1) + K3.e(k-2)
Avec le coef K2 qui est négatif.
La question, c'est est-ce que l'on gagne quelque chose à faire ça ?
Dans cette formule u(k) = u(k-1) + K1.e(k) + K2.e(k-1) + K3.e(k-2)on doit :
- Mémoriser 3 coefficients
- Calculer une erreur et mémoriser les deux dernières
- Mémoriser la commande précédente
- 6 double en permanence en mémoire mémoire
- une soustraction/assignation pour calculer l'erreur
- 3 multiplications, 3 additions et une assignation pour mettre à jour la commande
- 2 assignations pour mémoriser les erreurs
Dans la formule de base u(k) = Kp.e(k) + Ki.Te.\somme{i de 0 à k}(e(i)) + Kd.(e(k) - e(k-1))/Te on doit
- Mémoriser 3 coefficients
- Calculer l'erreur et la mémoriser
- Mettre à jour la somme des erreurs et la mémoriser
- 5 doubles en permanence en mémoire
- une soustraction/assignation pour calculer l'erreur
- une addition/assignation pour mettre à jour la somme
- 3 multiplications, deux additions et une soustraction pour calculer la commande
- une assignation pour mémoriser l'erreur
Avec la méthode du papier, on a
- un double en plus en mémoire
- une assignation en plus en mémoire
- une soustraction en moins !
Conclusion, c'est du pareil au même en fait

Mis à part qu'avec la méthode du papier, je ne vois pas trop comment régler le PID puisque les coef n'ont plus de sens "physique"
De plus, changer la fréquence d'échantillonnage demande de faire des calculs plus compliqué pour mettre à jour ces coef (ce n'est plus une simple multiplication/division !)
- Black Templar aime ceci
Mon site internet : http://ferdinandpiette.com/
#5
Posté 31 mars 2013 - 11:35

Alors si on se contente du PI on obtient :
u(k)= u(k-1)+e(k)*[Kp + Ki.Te] -e(k-1)*[Kp]
Encore merci pour la leçon
http://hmnrobots.blogspot.fr/
#6
Posté 31 mars 2013 - 12:08
Bravo
je viens de le refaire (ça me retarde dans mon usinage) mais c'est limpide. Merci bien.
Alors si on se contente du PI on obtient :
u(k)= u(k-1)+e(k)*[Kp + Ki.Te] -e(k-1)*[Kp]
Encore merci pour la leçon
Exactement,
D'ailleurs, si tu développes et que tu refactorises par les coefs, tu obtiens
u(k) =u(k-1) + Kp.(e(k) - e(k-1)) + Ki.e(k)
Ce qui est la forme récursive de u(k) = Kp.e(k) + Ki.somme(e)
Bref, c'est juste une question de point de vue. Il suffit de triturer les équations et de s’arrêter sur une forme qui te plait

Mon site internet : http://ferdinandpiette.com/
#7
Posté 31 mars 2013 - 12:57
Ki.Te.e(k)?u(k) =u(k-1) + Kp.(e(k) - e(k-1)) + Ki.e(k)
Bon en fait je croyais me rapprocher de ce que j'ai fait pour le programme "aller tout droit en accélérant".
faudra quand même que j'essaie de remplacer la consigne de vitesse par la valeur calculée précédente. Je crois me rappeler que j'avais essayé et que les résultats n'étaient pas bons; peut être que le signe négatif du second coeff fait partie de la solution.
http://hmnrobots.blogspot.fr/
#8
Posté 31 mars 2013 - 06:57
Ki.Te.e(k)?
Remarque : kp = Kp ; ki.Te = Ki ; kd/Te = Kd ^^
Te est caché dans le paramètre Ki
Mon site internet : http://ferdinandpiette.com/
#9
Posté 31 mars 2013 - 07:05
Encore un sans faute donc, je voulais juste montrer que j'essayais de comprendre. je pense que je vais rajouter sous cette forme pour le contrôle de vitesse de coupe.Te est caché dans le paramètre Ki
http://hmnrobots.blogspot.fr/
#10
Posté 01 avril 2013 - 07:12
Comment fait on pour le marquer Clos / résolu?
Merci à toi BT.
Bonne journée
http://hmnrobots.blogspot.fr/
#11
Posté 01 avril 2013 - 10:12
Suite à ton expertise, je crois que l'on peut dire que le sujet est clos/résolu.
Comment fait on pour le marquer Clos / résolu?
Tu peux éditer le titre et rajouter le tag [résolu] devant

Mon site internet : http://ferdinandpiette.com/
#12
Posté 19 avril 2013 - 03:40
Bon j'ai programmé le PID pour le moteur de coupe et pour faire simple (c'est ma devise) j'ai limité aux seules action P et I; je ne suis cependant pas parfaitement satisfait de cette régul en situation, je constate quelques dépassements et une certaine lenteur à réagir. J'ai beau essayer de faire varier les paramètres mais les meilleurs résultats sont obtenus en minimisant l'action I;
En fait peut on dire que (c'est mon idée du moment) l'inertie mécanique de la lame présente un effet intégration et que ce qui me manque en l’occurrence c'est une action dérivée ?
http://hmnrobots.blogspot.fr/
#13
Posté 21 avril 2013 - 07:41
Avec un échantillonnage à 200ms, le signal commande l'ESC du moteur brushless (pulse de 1000us à 1500us car trop rapide au delà: la tondeuse décolle).
les coeffs retenus sont
#define KpCut 80.0 //gain proportionnel
#define KiCut 30 //gain intégral
#define KdCut 1 //gain dérivé sensible
#define TeCut 0.2 //période
la régul est devenue nettement meilleure y compris en charge en extérieur : erreur max de 1 point.
//Asservissement P I D
//u(k) = kp.e(k) + ki.Te.\somme{i de 0 à k}(e(i)) + kd.(e(k) - e(k-1))/Te
ErrCut = PPS-NbPps ;
f_ErrCut = KpCut*ErrCut; //terme proportionnel
SumErrCut += ErrCut;
f_ErrCut += KiCut * TeCut* SumErrCut; //terme integral
f_ErrCut -= KdCut * (ErrCut-PrevErrCut)/TeCut; //terme integral
PrevErrCut = ErrCut;
DdeCut = 1000 +(int16)f_ErrCut; //conversion int16
DdeCut = MinMax16 (CUT_OFF,DdeCut,CUT_MAX);
http://hmnrobots.blogspot.fr/
1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users