Advertisement
junioraguilar

rotacao_motor_pid

Nov 14th, 2019
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. int IN1 = 10;
  2. int velocidadeA = 9;
  3. float velocidade = 0;
  4.  
  5. #define kp 10
  6. #define ki 0.01
  7. #define kd 2
  8. #define sp 50
  9.  
  10. float acao_anterior = 0;
  11.  
  12. float integral_error = 0;
  13. float erro_anterior = 0;
  14. void setup(){
  15.   pinMode(IN1,OUTPUT);
  16.   pinMode(velocidadeA,OUTPUT);
  17.   pinMode(2, INPUT_PULLUP); // internal pullup input pin 2
  18.   pinMode(3, INPUT_PULLUP); // internalเป็น pullup input pin 3
  19.  
  20.  
  21.   attachInterrupt(1, ai0, RISING);    
  22.  
  23.  
  24.   attachInterrupt(1, ai1, RISING);
  25.  
  26.  
  27.   Serial.begin(9600);
  28. }
  29.  
  30. void loop(){
  31.  
  32. float pv = rotac();
  33. pv = map(pv, 0, 78, 0.0, 100.0);
  34. Serial.print("         variavel:");
  35. Serial.println(int(pv));
  36. float erro = sp - pv;
  37. integral_error += erro * 0.1;
  38. float D = (erro - erro_anterior)/0.1;
  39.  
  40. float pi = (kp*erro) + (integral_erro*ki*kp) + (D*kd);
  41.  
  42. if (pi > 100){
  43.   pi = 100;
  44. }
  45. if (pi < 0){
  46.   pi = 0;
  47. }
  48. Serial.print(" PID:");
  49. Serial.print(int(pi));
  50. float velocity = map(pi, 0.0, 100.0, 0 ,255.0);
  51.  
  52. digitalWrite(IN1,HIGH);
  53. analogWrite(velocidadeA, velocity);
  54. erro_anterior = erro;
  55. }
  56. float rotac(){ //Funcao calcula e retorna a velocidade do motor em RPM
  57.    int anterior = 0; //nº de pulsos anterior
  58.    int atual; //nº de pulsos atual
  59.    float diferenca = 0; //diferenca entre o pulso atual e anterior
  60.    unsigned long int tempoInic = 0; //Variavel auxiliar
  61.    atual = counter;
  62.    while (temp != counter){ //Enquanto o motor não estiver parado, executa o loop:
  63.        
  64.     tempoInic = millis(); //guarda o tempo inicial de rotacao do motor
  65.     if (tempoInic > tempo-2 && tempoInic < tempo+2){    //Condição criada para calcular quantos pulsos foram gerados em X(ms). Neste caso, x = 500 ms;
  66.       anterior = atual;
  67.       atual = counter;
  68.       diferenca = atual - anterior;  //diferenca entre a quantidade de pulsos atual e anterior, para calcular a variação de rotacao em 500 ms.
  69.       tempo += 500; //Incrementa 500 ms a cada loop
  70.       float rotacao = diferenca/600*120;
  71.       //calcula a rotacao. A cada loop(500ms), calculamos a rotacao(rpm) fazendo a relacao entre o nº de pulsos atual e o nº de pulsos
  72.       //para uma volta, sendo assim, multiplicamos por 120 para descobrir quantas voltas por minutos o motor irá fazer.    
  73.      
  74.       return rotacao;                
  75.     }
  76.    }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement