2016-08-11 1 views
-1

J'ai réussi à contrôler la position de mon moteur à l'aide d'un contrôleur PD. Cependant, j'ai un problème de programmation.Le moteur ne bouge pas

Voici mon code:

#define encoder0PinA_M1 2 
#define encoder0PinB_M1 22 
int EnablePin = 8; 
int PWMPin1 = 3; 
int PWMPin2 = 11; 


volatile signed int encoder0Pos = 0; 
unsigned long LastTime; 
signed int Input; 
signed int Scaled_PID; 
float PID_Output, Scaled_PID1; 
signed int ErrorSum,ErrorDiff,Error,LastError; 
float kp=6; 
float ki=0; 
float kd=1; 
int SampleTime = 10; 
int TimeChange; 
unsigned long Now; 


void setup() 
{ 
    pinMode(encoder0PinA_M1, INPUT); 
    //digitalWrite(encoder0PinA_M1, HIGH);  
    pinMode(encoder0PinB_M1, INPUT); 
    pinMode(EnablePin, OUTPUT); 
    pinMode(PWMPin1, OUTPUT); 
    pinMode(PWMPin2, OUTPUT); 
    //digitalWrite(encoder0PinB_M1, HIGH);  
    attachInterrupt(0, doEncoder, CHANGE); 
    Serial.begin (9600); 
    Serial.println("start");     
} 

void PID() 
{ 
    Now = millis(); 
    TimeChange = Now - LastTime; 
    if(TimeChange >= SampleTime) 
    { 
    Error = Input - encoder0Pos; 
    ErrorSum = ErrorSum + Error; 
    ErrorDiff = Error - LastError; 

    PID_Output = kp * Error + ki * ErrorSum + kd * ErrorDiff; 

    LastError = Error; 
    LastTime = Now; 

    } 
} 

void speedlimitforward() 
{ 
    if (PID_Output >= 15) 
    { 
    PID_Output= 15; 
    } 
    if(PID_Output <= -15) 
    { 
    PID_Output=-15; 
    } 
    Scaled_PID = PID_Output+15; 
    digitalWrite(EnablePin, HIGH); 
    analogWrite(PWMPin1,Scaled_PID); 


} 

void speedlimitbackward() 
{ 
    if (PID_Output >= 20) 
    { 
    PID_Output= -20; 
    } 
    if(PID_Output <= -20) 
    { 
    PID_Output= 20; 
    } 
    Scaled_PID = PID_Output+20; 
    digitalWrite(EnablePin, HIGH); 
    analogWrite(PWMPin2,Scaled_PID); 
} 




void loop() 
{ 
    Input=50; 
    PID(); 
    speedlimitforward(); 
} 

void doEncoder() 
{ 
    if (digitalRead(encoder0PinA_M1) == digitalRead(encoder0PinB_M1)) 
    { 
    encoder0Pos++; 
    } else { 
    encoder0Pos--; 
    } 

}

Si vous regardez mon code, je l'ai déclaré d'entrée en tant que variable globale et en boucle() Je donne une valeur à l'entrée (50 chefs d'accusation en ce code). Ce code fonctionne très bien et le moteur s'arrête à près de 50 compteurs. Mais quand je change la boucle dans le code ci-dessus pour le code donné ci-dessous, mon moteur ne bouge pas. Je veux qu'il passer à 50 le nombre d'attendre pendant un certain temps et revenir à 0 count:

void loop() 
{ 
    Input=50; 
    PID(); 
    speedlimitforward(); 

    delay(2000); 
    Input=0; 
    PID(); 
    speedlimitbackward(); 

    delay(2000); 
    Input=-100; 
    PID(); 
    speedlimitbackward(); 

} 
+0

1) Ce n'est pas C. Arduino n'est pas C. 2) 'volatile 'ne garantit pas l'accès atomique. 3) Ce n'est pas un service de débogage. Utilisez le débogueur. 4) L'utilisation de virgule flottante sur Arduino est probablement une mauvaise idée. Utilisez des entiers mis à l'échelle. – Olaf

Répondre

1
  • Si vous demandez à l'same question in other places et obtenir une réponse, je pense que vous devriez revenir ici et répondre à votre question et marquez-le comme une réponse, sinon les gens vont passer du temps dessus. Le problème est clairement delay(2000), et si vous regardez le code, vous verrez pourquoi. Lorsque vous n'avez qu'une instruction, ce qui se passe est que la boucle commence, vérifie l'heure et voit si le moteur doit se déplacer, en fonction de la durée écoulée. Donc, si vous mettez un délai, la prochaine fois que la boucle sera exécutée, le temps sera déjà entièrement passé en attente et le moteur ne bougera pas.

  • Ce que vous pouvez faire est de garder une trace de ce que fait le moteur et de le déplacer en fonction de cela. Par exemple, conservez une variable appelée movement_completed et attribuez-lui une valeur renvoyée par les fonctions de mouvement lorsqu'elles ont bien complété le mouvement. Seulement après que cette variable est définie, continuez avec l'ensemble de mouvements suivant.

Je pense que le principal problème ici est que vous devez vous rappeler que loop() est constamment appelé, ce n'est pas quelque chose qui fonctionne juste une fois. Vous devez comprendre clairement pourquoi votre moteur s'arrête avec le premier code (alors vous comprendrez pourquoi il ne bouge pas avec le second).

+0

@ Dhav1991 ne sais pas pourquoi vous demandez ici sur stackoverflow, si vous connaissez le vrai forum arduino à http://forum.arduino.cc – datafiddler