Advertisement
RuiViana

PID

Mar 27th, 2017
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1. float kp = 150;                   //valor da constante proporcional ---> esse valor pode ser alterado pelo usuario
  2. float ki = 0.4;                   //valor da constante integral ---> esse valor pode ser alterado pelo usuario
  3. float kd = 0.2;                   //valor da constante derivativa ---> esse valor pode ser alterado pelo usuario
  4.  
  5. float p = 0;                      //controle proporcional
  6. float i = 0;                      //controle integral
  7. float  d = 0;                     //controle derivativo
  8. float pid = 0;                    //controle proporcional, integral e derivativo (PID)
  9. float erro = 0;                   //variável de erro
  10. float tdecorrido = 0;             //variável que irá receber o tempo decorrido para ocorrer o loop de controle, sendo 0 como inicio
  11. float setpoint = 9;               //aqui é definida a temperatura alvo ---> esse valor pode ser alterado pelo usuário
  12. float PWM_PID = 0;
  13.  
  14. float x;
  15. float y = A0;                     //variável que vai receber a  medida pelo sensor.
  16. //------------------------------
  17. void setup()
  18. {
  19.   Serial.begin(9600);
  20.   pinMode(y, INPUT);
  21.   pinMode(5, OUTPUT);             //porta PWM onde será colocado o relé e definida como saída.
  22.   //digitalWrite(5, LOW);         //definindo a porta como desligada por defautl
  23. }
  24. //------------------------------
  25. void loop()
  26. {
  27.   x = analogRead(y);
  28.   erro = setpoint - x;                                  //calcula a variação entre a temperatura medida e a temperatura alvo. Faz parte da realimentação do sistema e no cálculo de cada controlador.
  29.  
  30.   float delta = ((millis() - tdecorrido)) / 1000.0;     //calcula a diferença em segundos entre um loop
  31.   tdecorrido = millis();                                //conta quanto tempo levou para dar um loop
  32.  
  33.   p = kp * erro;                                        //controle proporcional
  34.   i += (ki * erro) * delta;                             //controle integral
  35.   d = erro * kd / delta;                                //controle derivativo
  36.   pid = p + i + d;                                      //PID
  37.   PWM_PID = map (pid,  -150000, 5000,  0, 100);
  38.   analogWrite(5, PWM_PID);
  39.  
  40.  
  41.   /* if (pid > 0)                                          //aqui começam os controles de fato
  42.     {
  43.      digitalWrite(05, HIGH);
  44.     }
  45.     else
  46.     {
  47.      digitalWrite(05, LOW);
  48.     }
  49.   */
  50.   Serial.print(pid);
  51.     Serial.print("    ");
  52.   Serial.print(PWM_PID);
  53.   Serial.print("    ");
  54.   Serial.println(x);
  55.  
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement