Implémentation de D (différenciation) en PID


8

J'implémente un contrôleur PID pour le contrôle de la vitesse du moteur. J'ai terminé la mise en œuvre du contrôle PI et cela fonctionne parfaitement bien pour moi. Dans la spécification, on m'a dit d'implémenter une technique de filtrage en utilisant l'équation suivante pour la partie D:

entrez la description de l'image ici

Maintenant, ce que je comprends jusqu'à présent, c'est que sreprésente "dx/dt"généralement ce qui correspond au taux de changement d'erreur, mais ici je peux le relier au taux de changement de rétroaction. Td/Nest pour limiter le gain global de sortie (j'espère que j'ai bien compris). Maintenant, pour représenter cela en termes de code C, j'ai essayé la méthode suivante:

        s = (CurrentFeedback()-Old_Feedback)*100/(MaxFeedback()); //to calculate the % change in feedback
        s = s*1000/sampleTime;      //1000 is multiplied because sampleTime is in milliseconds
        D = (Td*s)/(1+(s*Td/N));
        D = D*KP;   //Kp is multiplied as per the standard pid equation.

        Old_Feedback = CurrentFeedback();
        PID = P+I-D;

Eh bien, les résultats en ajoutant D ne sont pas ce que j'ai prévu. Je veux juste savoir si j'ai implémenté correctement l'équation de la portion D? Suis-je en train de faire des erreurs dans ma compréhension des mathématiques de base de la différenciation?

REMARQUE: je ne suis pas en mesure de modifier le recalculer le kp, ti, td car il provient directement du VFD.


Essayez embedded.com/design/prototyping-and-development/4211211/… , "PID sans doctorat". Il y a une section claire sur l'implémentation dérivée.
Scott Seidman

2
Lorsque vous déclarez Old_Feedback = CurrentFeedback () est incorrect. Vous devez lire la valeur avec CurrentFeedback () et la stocker dans temp. variable CurrentFeedback_tmp, puis utilisez cette valeur à chaque fois dans cet ISR, car chaque fois que vous appelez un fct CurrentFeedback (), il récupère la valeur réelle qui sera différente à chaque rappel.
Marko Buršič

"les résultats en ajoutant D ne sont pas ce que j'ai prédit" - qu'avez-vous prédit? Pourquoi sont-ils différents?
Greg d'Eon

Il existe un grand potentiel de débordements d'entiers ici. Quels sont les types de variables impliquées et avez-vous considéré leurs valeurs maximales?
Lundin

s, D est S32, KP, Td et N U16. le temps d'échantillonnage est U32. J'ai considéré les valeurs maximales des variables selon la valeur maximale possible de types de données particuliers.
spp

Réponses:


1

J'ai 3 points à partager:

1-Je vais vous dire pourquoi les gens jouent avec les termes de signe D, PID = P + I + D mais, D = kd * (erreur -serreur), et en contrôle de position si vous approchez du point de consigne, toujours plus ancienne est <erreur donc le terme D sera négatif, et donc il diminue la sortie et empêche le dépassement.

2-En ce qui concerne le temps, ne divisez pas et n'utilisez pas le temps. puisque vous utilisez un microcontrôleur intégré, utilisez simplement une constante de temps et annulez-la de toutes les équations: par exemple, utilisez une interruption de minuterie pour générer une constante de temps de 1 ms et appelez votre fonction à l'intérieur.

3-Pourquoi vous utilisez PID pour le contrôle de la vitesse, 90% du temps PI est suffisant dans le contrôle de la vitesse, car D ici ressemble plus à un contrôle d'accélération.

J'espère que cela pourra aider

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.