Comment mettre en œuvre un contrôleur de type PID à réglage automatique

15

J'essaie d'écrire un programme de microcontrôleur pour contrôler la température dans un système avec les caractéristiques suivantes:

  • la sortie peut uniquement être activée ou désactivée, avec des fréquences de cycle fixes (~ 2-10 par heure)
  • La plante réagit lentement (les changements de température mesurables prennent beaucoup de temps> 10 minutes).
  • La plante perd de la température en fonction des conditions environnementales.
  • le point de consigne peut varier par grandes étapes en fonction de la demande des utilisateurs.

J'écris un contrôleur qui vise à minimiser les erreurs, ainsi qu'à respecter le taux de cycle fourni en entrée.

Cela pourrait facilement être fait avec un contrôleur PI et sa sortie est convertie en rapport cyclique. Le problème est que le programme doit s'auto-régler et choisir les constantes Kp, Ki correctes et s'adapter aux différentes conditions environnementales et aux changements de la capacité de chauffage. Par conséquent, le réglage du contrôleur PI à l'avance n'est pas trop utile.

L'utilisation d'un PI ou PID réel n'est pas une exigence. Je suis ouvert à l'utilisation de Fuzzy-Logic si cela aide, j'ai également un algorithme d'apprentissage automatique sur la puce qui modélise la réponse du système et la perte de chaleur (linéaire environ) qui suggère des informations sur la réponse mesurée par étape . Je ne sais pas quoi faire de ces informations.

Quelques articles suggèrent que je pourrais utiliser les données de modélisation pour régler le PI en ligne, ainsi que le manuel de laboratoire qui suggère que je pourrais utiliser Fuzzy-Logic pour régler le PI.

Ma question est, quelle est la meilleure approche pour ce type de scénario (par exemple PID, flou-pid, convolution, etc.) et comment pourrais-je réellement l'implémenter dans le logiciel / la pratique.

Je ne suis pas un EE donc toute contribution serait grandement appréciée.

MandoMando
la source
1
J'ai écrit une réponse sur l'utilisation d'un algorithme simplex pour régler automatiquement les contrôleurs PID sur Robotics SE qui peuvent être intéressants.
embedded.kyle
@ embedded.kyle super, je comprends le simplexe / le plus grand acent. Pouvez-vous dire ce qu'il faisait pour x1, x2? J'ai du mal à les relier aux constantes PID.
MandoMando
1
Cela fait un moment mais je crois que nous avons utilisé quelque chose comme x1 = P, x2 = I, x3 = D. x0, le centre de gravité, est la mesure de la stabilité la plus importante pour vous. Dans mon application, le contrôle moteur, nous avions deux boucles. Le x0 de l'un était la vitesse et le x0 de l'autre était le courant. Voir ici pour en savoir plus.
embedded.kyle
@ embedded.kyle cela vous dérange de transformer votre commentaire en réponse? ajoutez des informations supplémentaires si vous le souhaitez. -thx
MandoMando
Une prime? Oh mec! Fait et fait.
embedded.kyle

Réponses:

7

Je n'irais pas jusqu'à appeler un PID obsolète. Mais il y a certainement place à amélioration. Une façon dont j'ai des boucles de contrôle PID auto-réglées est d'utiliser la méthode Nelder-Mead qui est une forme d' escalade algorithme simplex d' . Il a l'avantage de pouvoir converger et reconverger sur un paramètre cible qui évolue dans le temps.

Escalade sur la méthode Nelder-Mead

De cet article :

Par exemple, dans notre cas de réglage des paramètres PID {K P , K I , K D }, un simplex est tétraèdre. Nelder – Mead génère une nouvelle position de test du simplexe en extrapolant le comportement de la fonction objectif mesurée à chaque point de test disposé comme le simplexe. L'algorithme choisit alors de remplacer l'un de ces points de test par le nouveau point de test et ainsi la technique progresse.

Mon application particulière était pour le contrôle moteur. Nous avions deux boucles, une boucle de contrôle de courant PID et une boucle de contrôle de vitesse PI. Nous avons défini nos sommets à P, I et D respectivement et avons exécuté des statistiques sur la sortie de la boucle. Nous avons ensuite exécuté la réflexion, l'expansion, la contraction et la réduction encore et encore jusqu'à ce que les cibles de contrôle de courant ou de vitesse générées soient à quelques écarts-types près.

Avec notre produit, le VP était très préoccupé par la façon dont le moteur "sonnait". Et il s'est avéré que cela "sonnait" mieux lorsque la cible actuelle rebondissait un peu plus que ce qui était mathématiquement optimal. Ainsi, notre réglage a été fait "en direct" en ce que nous avons laissé l'algorithme chercher pendant que le moteur tournait afin que la perception de l'utilisateur du son du moteur soit également prise en compte. Après avoir trouvé les paramètres que nous aimions, ils ont été codés en dur et n'ont pas été modifiés.

Cela ne serait probablement pas idéal pour vous puisque vous déclarez, "mettre le système en oscillation même dans le cadre de l'autoréglage n'est pas acceptable pour les utilisateurs". Notre système oscillerait très certainement et ferait d'autres choses horribles pendant le réglage automatique.

Cependant, vous pouvez exécuter deux copies du contrôleur PID. Celui qui était "en direct" et contrôlait réellement le processus. Et une seconde qui était constamment réglée automatiquement tout en étant alimentée par les mêmes entrées que le contrôleur "live". Lorsque la sortie du contrôleur à réglage automatique est devenue "meilleure" ou plus stable, vous pouvez échanger les coefficients dans le contrôleur "en direct". Le contrôleur effectuerait ensuite des corrections du processus jusqu'à ce que les performances souhaitées soient atteintes. Cela empêcherait les oscillations qui peuvent être perçues par l'utilisateur pendant le réglage automatique. Mais si les entrées changent radicalement et que le contrôleur PID n'est plus optimal, le réglage automatique peut échanger de nouveaux coefficients à mesure qu'ils deviennent disponibles.

embedded.kyle
la source
La méthode NM nécessite d'exécuter ses points sauvages sur la fonction objectif (c'est-à-dire le monde réel de l'utilisateur). Cependant, je crois qu'un modèle brut (état spatial?) Peut être construit sur le microcontrôleur lui-même basé sur des mesures de capteur. Il exécuterait alors votre contrôleur PI «fantôme» proposé au fur et à mesure de son optimisation. Je ne suis pas sûr que cela soit un sur-kill car il peut être possible de régler un PI sur un paramètre connu, puis de mettre à l' échelle le Kp et le Ki en fonction des lectures du capteur et de la réponse du système. Quoi qu'il en soit, bravo monsieur.
MandoMando
@MandoMando Merci beaucoup! Et j'aime beaucoup le terme contrôleur PI «fantôme».
embedded.kyle
3

Un contrôleur PID est utile dans des situations où le comportement du système contrôlé peut être raisonnablement estimé comme étant une somme du stimulus de commande, l'intégrale du stimulus de commande et l'intégrale de cette première intégrale. Certains systèmes de contrôle de la température peuvent satisfaire à un tel critère, s'il existe un objet qui est chauffé uniformément par le stimulus, et si cet objet transfère la chaleur uniformément à un autre objet à un taux proportionnel à la différence de température entre eux. Par exemple, le premier objet pourrait être un élément chauffant, et le deuxième objet pourrait être l'air circulant dans une pièce, s'il y a suffisamment de circulation d'air pour que l'air soit considéré comme ayant une seule température uniforme. Pour les modèles thermiques plus compliqués que cela (par exemple ceux qui peuvent impliquer des gradients thermiques dans un milieu solide),

Je suggérerais qu'une bonne approche pourrait être d'avoir le contrôleur, lorsque le radiateur est allumé, d'estimer en permanence la température de l'appareil régulé si la sortie était immédiatement coupée et la température à laquelle il finirait par se refroidir si le chauffage a été allumé dès que possible après cela. Estimez également quelles seraient ces valeurs si le radiateur était laissé en marche pendant une seconde, deux secondes, trois secondes, etc. Éteignez le radiateur lorsque ces valeurs sont aussi bonnes que possible. Ensuite, une fois que le chauffage est éteint, commencez à effectuer des calculs similaires, mais en échangeant les rôles de marche / arrêt, chaud / froid, etc., pour décider quand rallumer. En fonction du comportement thermique du système, il peut être nécessaire d'utiliser une stratégie d'anticipation «min / max» pour anticiper une ou deux étapes.

supercat
la source
1

Pouvoir changer l'état de la commande (marche ou arrêt) 2 à 10 fois par heure ne se prête pas à la commande du cycle de service. La sortie d'une boucle PI va être un signal de contrôle dont l'amplitude varie en fonction de l'erreur, et votre installation ne peut (de manière réaliste) accepter qu'une entrée binaire (désactivée ou activée), car la `` fréquence '' du contrôle cycle de service qui peut être accepté est une fraction de hertz.

Vous voudrez peut-être simplifier les choses et opter pour un contrôle hystérétique:

  • le système se met en marche lorsque la température franchit une limite inférieure
  • le système s'éteint lorsque la température dépasse une limite supérieure
  • la distance entre les limites supérieure et inférieure est suffisante pour empêcher le rebond de la sortie de contrôle
Adam Lawrence
la source
l'idée est de prendre la sortie PI dire: 60% et de convertir en temps de marche = 60% du cycle -> 0,6 x 30 minutes -> 18 minutes en marche et 12 minutes en arrêt pendant le cycle de 30 minutes. le contrôleur bang-bang que vous proposez ne garantit pas le maintien du taux de cycle requis (par exemple, la mise en marche, pas plus de n fois par heure) et le maintien d'une faible erreur en même temps. il peut être nécessaire que le système dépasse temporairement pendant une période de temps pour équilibrer la perte pendant le temps d'arrêt.
MandoMando
1

Une méthode typique (bien que certes simpliste pour ce faire) est appelée programmation du gain. Il s'agit d'une approche classique du contrôle non linéaire lorsque vous avez une variable (ou des variables) observable avec laquelle votre système change (paramètre de planification). Dans votre système, cette variable serait probablement la température. L'idée est que vous créez une liste des gains du contrôleur à différentes valeurs du paramètre de programmation (température) et que le paramètre de programmation change, vous utilisez ces gains dans votre contrôleur (que ce soit PI, PID, retour d'état ou autre). Si cela semble vraiment simple, c'est parce que c'est le cas. Cependant, cela fonctionne et est utilisé dans certains systèmes très compliqués.

Si vous voulez devenir sophistiqué, vous pouvez implémenter un algorithme d'apprentissage automatique pour générer votre matrice de gain. Cela se traduirait par le contrôleur évolutif et d'apprentissage que vous semblez décrire. Cependant, il pourrait être exagéré si le système peut être entièrement caractérisé.

Edit: Désolé, j'ai mal lu un peu. Vous essayez de contrôler la température afin que les «conditions environnementales» dont vous parliez soient votre paramètre de programmation.

Mat
la source
0

Vous pouvez utiliser le contrôleur Recursive Least Squares à part entière, voir Astrom et Wittenmark , Adaptive Control, mais je ne sais pas si le microcontrôleur aura suffisamment de punch pour le faire.

Scott Seidman
la source