Table des matières:

Contrôleur PID VHDL : 10 étapes
Contrôleur PID VHDL : 10 étapes

Vidéo: Contrôleur PID VHDL : 10 étapes

Vidéo: Contrôleur PID VHDL : 10 étapes
Vidéo: Contrôleur flou : Exercice 2024, Novembre
Anonim
Contrôleur PID VHDL
Contrôleur PID VHDL
Contrôleur PID VHDL
Contrôleur PID VHDL

Ce projet était mon projet final pour terminer mon baccalauréat spécialisé du Cork Institute of Technology. Ce didacticiel est divisé en deux sections, la première couvrira le corps principal du code PID qui est l'objectif principal du projet et la deuxième section couvre l'interfaçage du code qui a été implémenté sur une carte de développement Basys 3 puis interfacé à une balle de ping-pong plate-forme de lévitation. Le gréement théorique et construit sont montrés dans les images ci-jointes.

Fournitures

Simulation

Suite Vivado Design

Mise en œuvre (entre parenthèses est ce qui a été utilisé pour mon projet)

  • Carte FPGA pouvant entrer et sortir des signaux numériques/analogiques (Basys 3)
  • un système contrôlable avec une seule source de rétroaction (Ping Pong Ball Levitation Rig)

Plate-forme

  • Tube en polycarbonate
  • Ventilateur 5V
  • Capteur infrarouge
  • Base imprimée en 3D (ce didacticiel documente la construction de la plate-forme, le capteur a été ajouté pour fournir des commentaires, mais la plate-forme était généralement la même)
  • 1k Résistances
  • Planche à pain avec rail 5V et GND

Étape 1: Théorie de base du contrôle

Théorie de base du contrôle
Théorie de base du contrôle

J'ai pensé que l'ajout d'une théorie de base du contrôle donnerait à quiconque voudrait essayer d'implémenter ce code une bonne base de départ.

Le schéma ci-joint est la disposition d'un contrôleur à boucle unique.

r- Est la référence. Cela détermine où le contrôleur doit aller.

e-Est-ce l'erreur. C'est la différence entre la valeur sur votre capteur et votre référence. par exemple. e=r-(d+sortie du capteur).

K-C'est le contrôleur. Un contrôleur peut être composé de trois termes. Ces termes sont P, I et D. Les trois termes ont des multiplicateurs appelés Kp, Ki et Kd. Ces valeurs déterminent la réponse du contrôleur.

  • P-Proportionnel. Un contrôleur strictement P aura une sortie proportionnelle à l'erreur actuelle. Un contrôleur P est simple à mettre en œuvre et fonctionne rapidement mais n'atteindra jamais la valeur que vous avez définie (référence).
  • I-Intégrale. Un contrôleur strictement intégral fera la somme de l'erreur précédente qui finira par atteindre la référence souhaitée. Ce contrôleur est généralement trop lent à mettre en œuvre. L'ajout d'un terme P réduira le temps nécessaire pour atteindre la référence. Le temps pendant lequel l'entrée est échantillonnée doit être pris en compte, le terme intégral est intégré par rapport au temps.
  • D-Dérivé. Le terme dérivé aura une sortie qui dépend du taux de changement d'erreur. Ce terme est généralement utilisé avec un terme P ou avec un terme PI. Étant donné que cela est proportionnel au taux de changement d'erreur, un seul bruité verra son bruit amplifié, ce qui peut rendre le système instable. Le temps doit également être pris en compte car le terme dérivé est également par rapport au temps.

U- C'est le signal de commande. Ce signal est une entrée de la plate-forme. Dans le cas de ce projet, le u est une entrée de signal PWM vers le ventilateur pour modifier la vitesse.

G- C'est le système qui est contrôlé. Ce système peut être modélisé mathématiquement dans le domaine S ou Z. Les systèmes peuvent être du nième ordre, mais pour quelqu'un qui débute avec le contrôle, un système du premier ordre devrait probablement être supposé car c'est beaucoup plus facile à calculer. Le est une pléthore d'informations sur le système de modélisation à trouver en ligne. Selon le temps d'échantillonnage du capteur, le modèle du système est soit discret, soit continu. Cela a un effet drastique sur le contrôleur, il est donc conseillé de rechercher les deux.

d- C'est la perturbation qui s'ajoute au système. Les perturbations sont des forces extérieures dont le modèle du système ne tient pas compte. Un exemple simple de ceci serait un drone que vous voudriez faire planer à 5 mètres une rafale de vent vient et laisse tomber le drone à 1 mètre le contrôleur repositionnera le drone après que la perturbation se soit produite. C'est ce qu'on appelle une perturbation, car le vent n'est pas répétable et ne peut donc pas être modélisé.

Pour régler le contrôleur, il y a trop de règles pour les nommer, mais les bonnes avec lesquelles j'ai commencé sont Cohen Coon et Zieger Nichols.

La modélisation d'un système est généralement la partie la plus importante sans un modèle précis, le contrôleur qui a été conçu ne répondra pas comme souhaité.

Il devrait y avoir suffisamment d'informations ici pour comprendre le fonctionnement du contrôleur ainsi que quelques recherches individuelles et le code sous un contrôleur avec n'importe quelle combinaison des trois termes peut être implémenté.

Étape 2: écriture du code PID

Écriture du code PID
Écriture du code PID

Le principe de base du code trouvé sur le lien suivant a été repris et modifié car ce code ne fonctionnait pas, mais bon nombre des principes étaient corrects, ce qui donnait un bon point de départ. PID d'origine Le code comportait plusieurs erreurs telles que

  • Fonctionnement continu - le contrôleur est par héritage discret, il a donc dû être configuré pour ne calculer les 3 termes que lorsqu'une nouvelle entrée était disponible. La solution de contournement pour cette simulation consistait à vérifier si l'entrée avait changé depuis la dernière fois. cela ne fonctionne que pour simuler le fonctionnement correct du code.
  • Le temps d'échantillonnage n'a eu aucun effet sur le terme intégral et dérivé - Le contrôleur n'a pas non plus pris en compte le temps pendant lequel l'échantillon était pris en charge, une valeur appelée diviseur de temps a donc été ajoutée pour garantir que les termes intégraux et dérivés fonctionnaient correctement. intervalle.
  • L'erreur ne pouvait être que positive - lors du calcul de l'erreur, il y avait également un problème car l'erreur ne pouvait jamais être négative, ce qui signifie que lorsque le signal de retour avait dépassé la valeur de référence, le contrôleur continuerait à incrémenter la sortie alors qu'elle devrait décrémenter.
  • Les valeurs de gain pour les 3 termes étaient des nombres entiers - dans mon expérience, j'ai toujours trouvé que les valeurs des 3 termes dans le contrôleur étaient toujours des nombres à virgule flottante car Basys 3 n'avait pas de nombre à virgule flottante, les valeurs devaient recevoir une valeur de numérateur et un valeur du dénominateur qui servirait de contournement au dépassement de ce problème.

Le code est joint ci-dessous, il y a le corps principal du code et un banc d'essai pour simuler le code. Le dossier zip contient le code et le banc de test déjà dans Vivado afin qu'il puisse être ouvert pour gagner du temps. il y a aussi un test simulé du code qui montre la sortie suivant la référence cela prouve que le code fonctionne comme prévu.

Étape 3: Comment modifier pour votre système

Tout d'abord, tous les systèmes ne sont pas identiques, il faut analyser les entrées et les sorties du système. Dans mon cas, la sortie de ma plate-forme qui m'a donné une valeur pour la position était un signal analogique et l'entrée du système était un signal PWM. Ce qui signifie qu'une conversion ADC était nécessaire. Heureusement, le Basys 3 a un ADC intégré, donc ce n'était pas un problème, la sortie du capteur IR a dû être réduite à 0V-1V car il s'agit de la plage maximale de l'ADC embarqué. Cela a été fait à l'aide d'un circuit diviseur de tension composé de résistances de 1k configurées comme une résistance de 3k en série avec une résistance de 1k. Le signal analogique était maintenant à portée de l'ADC. L'entrée PWM du ventilateur peut être directement pilotée par la sortie d'un port PMOD sur le Basys 3.

Étape 4: Tirer parti des E/S sur Basys 3

Il y a un certain nombre d'E/S sur le Basys 3 qui ont permis un débogage plus facile lorsque le code était en cours d'exécution. les E/S ont été configurées comme suit.

  • Affichage à sept segments - Ceci a été utilisé pour afficher la valeur de la référence et la valeur sur l'ADC en volts. Les deux premiers chiffres de l'affichage à sept segments affichent les deux chiffres après la virgule de la valeur ADC car la valeur est comprise entre 0 et 1 V. Les chiffres trois et quatre sur l'affichage à sept segments indiquent la valeur de référence en volts. Cela montre également les deux premiers chiffres après la virgule car la plage est également comprise entre 0 et 1 V.
  • 16 LED - Les LED ont été utilisées pour afficher la valeur de la sortie afin de s'assurer que la sortie était saturée et que la sortie changeait correctement.

Étape 5: Bruit sur la sortie du capteur IR

Il y avait du bruit sur la sortie du capteur pour résoudre ce problème, un bloc de moyenne a été mis en place car cela était suffisant et nécessitait très peu de travail.

Étape 6: Présentation générale du code

Disposition globale du code
Disposition globale du code

Il y a un morceau de code dont on n'a pas encore parlé. Ce code est un diviseur d'horloge appelé déclencheur. ce bit de code déclenche l'échantillonnage du code ADC. le code ADC prend un maximum de 2us pour terminer, donc l'entrée actuelle et l'entrée précédente sont moyennées. 1us après cette moyenne, le contrôleur calcule les termes P, I et D. la disposition générale du code et de l'interfaçage est illustrée dans le schéma de connexion de fortune.

Étape 7: Tester

Essai
Essai

Le code a été déployé sur le Basys 3 et la réponse suivante a été enregistrée. la référence a changé entre 2 valeurs. ce qui est le cas dans le code de projet complété ci-joint. La vidéo ci-jointe montre cette réponse en temps réel. Les oscillations décroissent plus rapidement dans la partie supérieure du tube car le contrôleur a été conçu pour cette région, mais le contrôleur ne fonctionne pas aussi bien plus loin dans le tube car le système est non linéaire.

Étape 8: Modifications pour améliorer le projet

Le projet a fonctionné comme prévu mais il y a quelques modifications que j'aurais apportées si le projet avait pu être prolongé.

  • Mettre en œuvre un filtre numérique pour atténuer complètement le bruit
  • configurer le code ADC, le code moyen et le code d'intégration pour qu'ils se déclenchent de manière séquentielle.
  • utilisez un capteur différent pour le retour car la réponse non linéaire de ce capteur a causé une grande variété de problèmes avec ce projet, mais c'est plus du côté du contrôle que du côté du codage.

Étape 9: Travail supplémentaire

Au cours de l'été, j'ai écrit du code pour un contrôleur en cascade et mis en œuvre les modifications que j'ai recommandées pour le contrôleur PID à boucle unique.

Modifications apportées au contrôleur PID régulier

· Modèle de filtre FIR mis en œuvre, les coefficients doivent être modifiés pour atteindre la fréquence de coupure souhaitée. L'implémentation actuelle est un filtre de sapin à 5 robinets.

· La synchronisation du code a été configurée de sorte que le filtre propage le nouvel échantillon et lorsque la sortie est prête, le terme intégral sera déclenché, ce qui signifie que le code peut être modifié pour fonctionner à différents intervalles de temps avec moins d'effort pour changer code.

· La boucle for principale qui pilote le programme a également été réduite car cette boucle for prenait 7 cycles auparavant, ce qui ralentissait la vitesse de fonctionnement maximale du contrôleur, mais en réduisant les états de la boucle for t 4, cela signifie que le bloc de code principal peut fonctionner dans les 4 cycles d'horloge.

Essai

Ce contrôleur a été testé et exécuté comme prévu. Je n'ai pas pris de photos de cette preuve car cette partie du projet était juste pour garder l'esprit actif. Le code de test ainsi que le banc de test seront disponibles ici afin que vous puissiez tester le programme avant l'implémentation.

Pourquoi utiliser un contrôleur de cascade

Un contrôleur de cascade contrôle deux parties du système. Dans ce cas, un contrôleur de cascade aurait une boucle externe qui est un contrôleur qui a un retour du capteur IR. La boucle interne a un retour sous forme de temps entre les impulsions du tachymètre qui détermine la vitesse de rotation du ventilateur. En mettant en œuvre le contrôle, une meilleure réponse peut être obtenue hors du système.

Comment fonctionne le contrôleur de cascade ?

La boucle externe du contrôleur fournira une valeur pour le temps entre les impulsions au contrôleur de boucle interne. Ce contrôleur augmentera ou diminuera ensuite le rapport cyclique pour atteindre le temps souhaité entre les impulsions.

Mise en place de modifications sur le rig

Malheureusement, je n'ai pas pu implémenter ces modifications sur le rig car je n'y avais pas accès. J'ai testé le contrôleur à boucle unique révisé qui fonctionne comme prévu. Je n'ai pas encore testé le contrôleur de cascade. Je suis convaincu que le contrôleur fonctionnera, mais peut nécessiter de légères modifications pour fonctionner comme prévu.

Essai

Je n'ai pas pu tester le contrôleur car il était difficile de simuler deux sources d'entrée. Le seul problème que je peux voir avec le contrôleur de cascade est que lorsque la boucle externe essaie d'augmenter le point de consigne fourni à la boucle interne, un point de consigne plus grand est en fait un RPS inférieur pour le ventilateur, mais cela peut être corrigé facilement. prendre la consigne à partir de la valeur max du signal de consigne (4095 - consigne - tacho_result).

Étape 10: Conclusion

Dans l'ensemble, le projet fonctionne comme je l'avais prévu au début du projet, je suis donc satisfait du résultat. Merci d'avoir pris le temps de lire ma tentative de développement d'un contrôleur PID en VHDL. Si quelqu'un tente d'implémenter une variante de cela sur un système et a besoin d'aide pour comprendre le code, contactez-moi, je répondrai dès que possible. Quiconque essaie le travail supplémentaire qui a été effectué mais non mis en œuvre, veuillez me contacter pour toute aide. J'apprécierais beaucoup si quelqu'un qui le met en œuvre me fait savoir comment ça se passe.

Conseillé: