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.
Réponses:
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.
De cet article :
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.
la source
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.
la source
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:
la source
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.
la source
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.
la source