2016-03-04 1 views
0

Je travaille à la création d'un contrôleur PID pour la commande d'un moteur. J'ai étudié en utilisant la bibliothèque PID mais je crois que cela ne convient pas à mes besoins, car j'ai besoin de contrôler un moteur dans deux directions en utilisant le même contrôleur.Contrôleur PID, Problèmes avec la partie codage D.

J'ai actuellement la pièce PI qui fonctionne, mais je suis aux prises avec la partie D. Je suis incapable de stocker l'erreur actuelle à la dernière erreur, qui peut ensuite être utilisée pour calculer la valeur D suivante. Au lieu de cela ma valeur d semble refléter l'erreur, plutôt que le changement de l'erreur actuelle par rapport à la dernière erreur. Mon code est montré ci-dessous, tout conseil serait apprécié. ** notez, je sais que typiquement delta_T est inclus dans la partie Intégrale et Dérivée du contrôleur, mais je préfère l'incorporer dans les constantes de contrôle Ki et Kd pour éviter les complications de codage.

Distance = analogRead (irSense); //read the sensor, assigns value to Distance 
//Serial.println(Distance) ; 
double lastError; 
int control;   //initialize control variable , set up PID parameters 
int setpoint = 350; //Neutral position, zero point, desired input 
int error = Distance - setpoint; //error function 
double d = (error - lastError); //derivative function 

double kp = 0.9;   //Proportional constant 
double ki = 0.000001;  //Intergral constant 
double kd = .0001;   //Derivitve constant 

i += error; //intergral Set 
control = error * kp + i * ki + d * kd; //PID control funtion 

lastError = error; 

Serial.println (d); 

Répondre

0

Il semble que lastError soit toujours zéro. Peut-être l'imprimer comme information de débogage au début de votre code.

Si votre code affiché est à l'intérieur d'une fonction, vous pourriez avoir besoin le mot-clé statique:

static double lastError; 

Afin de conserver la valeur d'un appel à. Sinon, il peut être réinitialisé à zéro et vous donner le résultat que vous voyez. Si lastError est global,

Pour Dérivée (erreur), certains utilisent la dérivée (valeur mesurée) pour éviter la sensibilité aux changements de consigne.

Je changerais votre code:

static double lastDistance; 
... 
double d = Distance-lastDistance 
...