J'essaie d'implémenter un algorithme PID de base sur un Arduino Leonardo pour mélanger l'eau du robinet chaude et froide à l'aide de vannes asservies. Le but est de maintenir la température aussi près que possible d'une consigne. Il est particulièrement important d'empêcher la température de sortie de dépasser le point de consigne pour protéger l'utilisateur contre les brûlures. Il est également important d'obtenir la température près du point de consigne le plus rapidement possible.
Pour les petits changements de température, une implémentation standard de l'algorithme PID semble fonctionner correctement. Mais je ne sais pas comment tenir compte des longs retards qui peuvent survenir en attendant que l'eau chaude atteigne la vanne, car ces retards sont beaucoup plus longs que les retards standard après avoir changé les positions de la vanne.
Évidemment, en fonction de la longueur de la conduite d'eau chaude et du temps écoulé depuis la dernière utilisation d'eau chaude, cela peut prendre plusieurs dizaines de secondes pour que l'eau chaude atteigne la vanne, donc pendant ce temps, la température de l'eau reste assez constante à basse température. et la vanne d'eau chaude s'ouvre bientôt à 100%. Le composant intégral commence à accumuler une grande valeur d'erreur.
Lorsque l'eau chaude atteint enfin la vanne, la température détectée augmente très rapidement jusqu'à la température maximale de l'eau chaude. En raison de la grande erreur intégrale, la vanne d'eau chaude est maintenue à 100% pendant longtemps après que la température dépasse le point de consigne, en raison de l'attente de la valeur intégrale réduite à des niveaux normaux. Ainsi, le résultat est une eau à température maximale pendant plusieurs (dizaines) de secondes.
Je ne sais pas comment expliquer ce retard possible . Dans un tel cas, serait-il sage de fixer une borne supérieure (et inférieure) sur la valeur d'erreur intégrale, afin de limiter le temps de réponse maximum? Cela semble aller à l'encontre de l'objectif de la composante intégrale et imposerait également un certain retard après avoir atteint le point de consigne.
Ou existe-t-il une meilleure façon de gérer les changements d'entrée rapides après un long délai?
Merci pour tout conseil!
la source
Réponses:
Votre problème s'appelle Integral Windup , c'est un problème de contrôle commun. Dans une région non linéaire ou autrement délimitée, le contrôleur ne peut pas suivre le point de consigne et l'intégrale augmente à une valeur élevée. Cela provoque un grand dépassement lorsque le point de consigne est finalement atteint, ce qui est exactement ce que vous avez déduit du problème.
La solution la plus simple consiste à limiter la valeur de l' intégrateur lui-même à un maximum raisonnable. Limiter la contribution intégrale ne fonctionnera pas aussi bien, car l'intégrateur sera toujours liquidé à une valeur importante.
Mathworks a une page avec quelques autres solutions à la liquidation intégrale.
Dans un contrôleur PID, vous voulez généralement aussi peu de termes intégraux que possible. Dans une vanne de régulation de température mécanique standard, seule une régulation proportionnelle est utilisée et fonctionne correctement. Gardez le terme intégral aussi petit que possible - l'utilisateur ne remarquera pas une petite erreur dans la température finale. Vous pourriez constater que vous obtenez des performances acceptables avec seulement PD.
Comme il s'agit d'un cas connu très spécial, vous pourriez envisager d'avoir un mode différent pour le contrôleur. Mesurer la température d'entrée chaude, et pendant qu'elle est inférieure au point de consigne, il suffit de faire fonctionner 100% à chaud, 20% à froid. Quand il se réchauffe, passez au PID, avec de bonnes conditions initiales.
la source
La clé pour contrôler efficacement ce processus est de réaliser que les robinets chaud et froid ne fonctionnent pas de manière symétrique, et tout algorithme optimal doit en tenir compte.
Lorsque vous n'utilisez pas l'eau chaude pendant un certain temps, elle se refroidit dans le tuyau.
Lorsque vous n'utilisez pas l'eau froide pendant un certain temps, elle reste la même que jamais (sauf si l'eau froide provient d'un réservoir d'eau froide avec un refroidisseur, ce qui serait génial d'avoir les jours chauds d'été, mais je suis les paris sont assez rares en pratique).
Ainsi, nous supposons que nous ne savons pas ce que nous obtenons du tuyau d'eau chaude, mais nous pouvons dépendre du fait que le tuyau d'eau froide est à peu près constant tout au long d'une analyse.
Ainsi, à partir de la température de l'eau mélangée, de la connaissance du réglage de la vanne et d'une estimation de la température de l'eau froide, nous pouvons estimer la chaleur de l'eau provenant actuellement de la conduite d'eau chaude. Ensuite, vous pouvez régler la vanne pour obtenir la température de sortie correcte sans PID, simplement en fonction de l'évaluation d'une formule thermodynamique.
Pour obtenir "l'estimation de la température de l'eau froide", vous pouvez faire couler de l'eau froide pendant une courte période (quelques secondes peut-être) au début du cycle et lire la température. Supposez ensuite que cela ne changera pas par la suite, car vous n'avez pas suffisamment de données à résoudre pour les deux températures.
Ce schéma ne sera pas parfaitement précis, mais j'estime qu'il parviendra de manière fiable dans le stade sans la possibilité d'un dépassement drastique. Ensuite, vous exécutez PID au-dessus de ce schéma pour affiner les résultats, mais limitez la modification du paramètre de vanne que PID est autorisé à produire. Et éventuellement réinitialiser l'état PID lorsque vous avez des changements importants dans la température d'entrée de l'eau chaude.
Des solutions plus sophistiquées sont possibles avec plusieurs capteurs de température.
la source
Je voulais juste ajouter un détail aux belles réponses ci-dessus sur ce que les ingénieurs de contrôle font pour les possibilités de liquidation intégrale. Cela se produit également dans de nombreux processus industriels et c'est un art plutôt qu'une science.
Il y a des actions classiques contre cela sans sacrifier le gain intégral qui pourrait être vraiment requis pour la spécification de performance.
Chaque fois que vous franchissez le niveau d'erreur zéro, vous réinitialisez l'intégrateur. Cela fait de l'intégrateur un élément non linéaire de type intégrateur à la demande au lieu d'un accumulateur aveugle.
Vous connectez essentiellement le bloc d'entrée d'action intégrale à un élément indicatif de la boucle. Cela peut être soit la sortie de l'intégrateur pour juger s'il a commencé la construction (ce qui nécessite une compréhension du processus pour faire le bon jugement). Ou vous vérifiez si vos actionneurs sont saturés ou non et formez une boucle de rétroaction basée sur ces informations. J'ai juste choisi au hasard le premier lien qui est sorti de google et à la fin de cette vidéo il y a une explication graphique de mon dernier point. https://www.youtube.com/watch?v=H4YlL3rZaNw
la source
Parfois, il peut être utile d'avoir plusieurs ensembles de paramètres PID, pour les étapes à granularité grossière de la plage de fonctionnement du système, que vous modifiez à la volée lorsque le système passe d'une étape de comportement à une autre. Par exemple, un ensemble de Kp, Ki et Kd lorsque vous ouvrez le robinet chaud et que vous obtenez uniquement de l'eau froide; puis une fois que vous commencez à voir la température monter, passez à un autre ensemble de Kp, Ki & Kd. Réglez ensuite les deux en conséquence.
Utilisez-vous la bibliothèque PID dans l'Arduino Playground de Brett Beauregard? Celui-ci est assez sympa. Et il y a aussi un exemple «adaptatif» de cela.
la source
Avez-vous modélisé le système?
Avez-vous des données temporelles montrant le dépassement - en particulier la fréquence
Ce sont deux questions qui doivent être posées avec toute requête basée sur un contrôle.
D'après ce que vous avez décrit, votre gain intégral est trop élevé, beaucoup trop élevé. Cela pourrait être dû à la liquidation de l'intégrateur: le code affiché présente de réelles préoccupations pratiques, dont l'une n'est pas le plus grand des intégrateurs discrets
Cela pourrait également être dû au fait qu'il est très élevé et qu'il faut du temps pour diminuer.
Alors oui, la valeur stockée dans le registre I aurait pu se résumer à dire ... 1000C parce que le P + I n'était pas réglé sur la réponse du système et qu'il devait ensuite baisser.
La première chose que je ferais serait de capturer des données en temps réel pour le post-traitement. Ensuite, je lancerais P-only et m'assurerais que le gain proportionnel atteigne PRESQUE la température souhaitée (la théorie du contrôle dit que ce ne sera pas le cas). Le selon que
Je commencerais par changer le code PID pour être une meilleure implémentation, puis ajouterais un petit peu de I, juste pour prouver un point.
Vous devez vraiment déterminer à quoi ces gains sont destinés. L'entrée est la température, la sortie est ... le débit? il devrait donc y avoir un transfert de flux / C et une fonction de transfert de Flow / Cs.
la source
Une façon que j'aime résoudre la liquidation intégrale est d' arrêter d'accumuler l'erreur chaque fois que votre sortie de contrôle est à sa déflexion maximale . Ou redimensionnez-la en vous éloignant de la déflexion maximale. Donc, chaque fois que votre contrôleur génère "eau chaude 100%, eau froide 0%", n'accumulez simplement pas l'erreur, mais ne la remettez pas à zéro non plus.
Je n'aime pas limiter l'intégrale à un maximum car il y a alors une limite à l'erreur systématique que votre PID peut compenser.
Je suggérerais également qu'au lieu de créer un PID "stupide" qui n'a qu'un seul paramètre qu'il essaie de contrôler sans connaître le système sous-jacent, vous installez deux capteurs de température supplémentaires, à la fois sur l'entrée chaude et froide. Vous essayez ensuite de trouver une fonction qui se rapproche de la position souhaitée en fonction des températures d'entrée, et vous utilisez uniquement la boucle PID pour régler l' erreur de sortie de cette fonction.
L'erreur sera importante car vous ne mesurez pas le débit (enfin, sauf si vous le faites bien sûr), ce qui dépend non seulement des positions des vannes (connues) mais aussi de la pression de l'eau (inconnue).
Pourtant, cela devrait aider beaucoup avec le problème de l'eau chaude atteignant enfin le robinet car dans une boucle PID bien amortie, vous devez vous fier à l'élément D bien calibré pour réduire rapidement le flux chaud. D'après mon expérience, obtenir le coefficient dérivé correct est généralement le plus difficile. Mais si vous aviez les deux capteurs supplémentaires, la sortie principale changerait exactement aussi rapidement que la température d'entrée de l'eau, donc essentiellement instantanée, sans aucun besoin de l'élément dérivé.
la source