Bonjour
Je ne sais pas si vous utilisez C18 de MPLAB mais je vous pose la question quand même des fois que le problème vienne d'ailleurs
Je réalise une régulation PID pour moteur thermique et pour le calcul des différents termes du calcul j'utilise des variables de type float.
Je travail sur un pic18F4550 et je vérifie chaque étape de mon calcul par la liaison USB via un programme développé sous delphi
Voila l'algorithme de la régulation :
ou tab_erreur est un int,Code:for(i=5;i>=1;i--) tab_erreur[i]=tab_erreur[i-1]; // sauvegarde de l'ancienne erreur, tableau FIFO tab_erreur[0] = consigne - RPM; // calcul de la nouvelle erreur som_erreur += (tab_erreur[0])*dt; // effectue la somme des erreurs depuis le début if (som_erreur>=limite_I) som_erreur=limite_I; // limite le terme de l'intégral if (som_erreur<=(-limite_I)) som_erreur=-limite_I; // limite le terme de l'intégral diff_erreur = (tab_erreur[0] - tab_erreur[4])/dt; // calcul la différence entre l'erreur précédente et l'actuel P = kP * tab_erreur[0]; // calcul le terme proportionnel I = kI * som_erreur; // calcul le terme intégrale D = kD * diff_erreur; // calcul le terme dérivé commande_AX12 += P + I + D; // résultat final
som_erreur et diff_erreur sont des float ainsi que P,I,D,
et commande_AX12 est un int
dt est une constante fixé à 0.005
et limite_I à 1000
hélas après avoir vérifié que tab_erreur fonctionné bien, som_erreur a un comportement assez particulier ainsi que som_erreur par la même occasion.
som_erreur varie bien de -1000 a +1000 mais le comportement n'est pas normal, en négatif il varie très rapidement au début même avec une erreur = 1 puis en arrivant vers les positif une variation beaucoup plus lente voir inexistante au bout d'un moment puis des variations par pas, 8 16 32 64 128 257 513 1000.
Pour diff_erreur je la voit toujours a 0
En me renseignent un peut j'ai pu découvrir deux ou trois pistes,
- le problème des float avec C18 qui serai codé différemment et donc serai mal converti lors de l'envoi au pc
- le problème que je convertit ces float en int pour envoyer au pc
- apparemment il existe un mode extended pour les 18F qui pourrait résoudre le problème de calcul de flottant mais que je ne peut pas utilisé car j'utilise un bootloader USB avec son propre LKR
- un problème de calcul ou d'enchainement logique des opérations
malgré toutes ces pistes je n'arrive pas a résoudre mon problème
Merci de bien vouloir m'éclairer sur les calculs de nombres flottants
Cordialement Zoïlo
-----