Aller au contenu


Photo
- - - - -

[Résolu] Digital PID


  • Veuillez vous connecter pour répondre
12 réponses à ce sujet

#1 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 31 mars 2013 - 07:51

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
Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/

#2 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

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 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 31 mars 2013 - 10:17

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.

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;
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 .

Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/

#4 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 31 mars 2013 - 10:48

Salut,

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
Remarque : kp = Kp ; ki.Te = Ki ; kd/Te = Kd ^^



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
On a donc par boucle d'asservissement :

  • 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
On a donc par boucle d'asservissement

  • 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 Image IPB

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 !)

Mon site internet : http://ferdinandpiette.com/


#5 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 31 mars 2013 - 11:35

Bravo :clapping: 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
Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/

#6 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 31 mars 2013 - 12:08

Bravo Image IPB 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 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 31 mars 2013 - 12:57

u(k) =u(k-1) + Kp.(e(k) - e(k-1)) + Ki.e(k)

Ki.Te.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.
Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/

#8 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

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 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 31 mars 2013 - 07:05

Te est caché dans le paramètre Ki

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.
Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/

#10 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 01 avril 2013 - 07: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?
Merci à toi BT.
Bonne journée
Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/

#11 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

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 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 19 avril 2013 - 03:40

Bonjour
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 ?
Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/

#13 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 21 avril 2013 - 07:41

Bon en fait je suis repassé à l'expression classique du PID comme développée par Black Templar (Merci à toi) et du coup j'ai trouvé le bug : la formule utilisait un Kp défini ailleurs au lieu d'utiliser le coeff proportionnel KpCut de la coupe.
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);
Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users