Guest User

Untitled

a guest
Dec 10th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.44 KB | None | 0 0
  1. /*
  2. * TRABALHO DE CONTROLE II - UNIDADE 3
  3. * CONTROLE DINÂMICO DE NÍVEL UTILIZANDO PID CLÁSSICO
  4. *
  5. * ALUNOS:
  6. * AMANDA DE BRITO FREITAS - 201715343
  7. * GETULIO FALCOMER DE ALMEIDA - 201517480
  8. * SANDERSON LUIZ -
  9. * WILL DOUGLAS CAVALCANTI JUNIOR - 201526200
  10. *
  11. * ORIENTADOR: PROFESSOR JAN ERIK
  12. */
  13.  
  14. // ajuste do PID
  15. float kp = 0;
  16. float ki = 0;
  17. float kd = 0;
  18.  
  19. // portas do arduíno
  20. const unsigned int potenciometro = A1;
  21. const unsigned int sensor_lm35 = A2;
  22. const unsigned int chave = 2;
  23. const unsigned int pastilha_peltier = 3;
  24.  
  25. // variáveis
  26. unsigned int estado_chave = LOW;
  27. float ts = 0.01; // período de amostragem
  28. unsigned int set_point = 0;
  29. float variavel_processo = 0;
  30. unsigned int u = 0;
  31. unsigned int u_antigo = 0;
  32. unsigned int u_minimo = 0;
  33. unsigned int u_maximo = 255;
  34. float erro = 0;
  35. float erro_antigo = 0;
  36. float erro_mais_antigo = 0;
  37.  
  38. // escopo de funções
  39. void converte_sintonia_para_discreto();
  40. void controle_pid();
  41. void imprime_serial();
  42. void u_limite();
  43. void atualizar_variaveis();
  44.  
  45. void setup(){
  46. Serial.begin(9600);
  47.  
  48. pinMode(potenciometro, INPUT);
  49. pinMode(sensor_lm35, INPUT);
  50. pinMode(chave, INPUT);
  51. pinMode(pastilha_peltier, OUTPUT);
  52.  
  53. converte_sintonia_para_discreto();
  54. }
  55.  
  56. void loop(){
  57. estado_chave = digitalRead(chave);
  58.  
  59. if(estado_chave == HIGH) {
  60. controle_pid();
  61. imprime_serial();
  62. delay(100);
  63. }
  64. else {
  65. analogWrite(pastilha_peltier, 0); // desliga a pastilha
  66. Serial.println("Esperando o sistema ser ligado...");
  67. delay(1000);
  68. }
  69. }
  70.  
  71. void converte_sintonia_para_discreto(){
  72. ki = (kp / ki) * ts;
  73. kd = (kp * kd) * ts;
  74. }
  75.  
  76. void controle_pid(){
  77. variavel_processo = (float(analogRead(sensor_lm35)) * 5 / 1024) / ts;
  78.  
  79. set_point = map(analogRead(potenciometro), 0, 1024, 3, 20);
  80.  
  81. erro = set_point - variavel_processo;
  82.  
  83. u = u_antigo +
  84. kp * (erro - erro_antigo) + // parte proporcional
  85. ki * erro_antigo + // parte integral
  86. kd * (erro - 2 * erro_antigo + erro_mais_antigo); // parte derivativa
  87.  
  88. u_limite();
  89. atualizar_variaveis();
  90.  
  91. analogWrite(pastilha_peltier, u);
  92. }
  93.  
  94. void imprime_serial(){
  95. Serial.print("Set Point: "); Serial.print(set_point);
  96. Serial.print(" ºC: "); Serial.print(variavel_processo);
  97. Serial.print(" Erro: "); Serial.print(erro);
  98. Serial.print(" Saída u (PWM): "); Serial.println(u);
  99. }
  100.  
  101. void u_limite(){
  102. if (u > u_maximo)
  103. u = u_maximo;
  104. if (u < u_minimo)
  105. u = u_minimo;
  106. }
  107.  
  108. void atualizar_variaveis(){
  109. erro_mais_antigo = erro_antigo;
  110. erro_antigo = erro;
  111. u_antigo = u;
  112. }
Add Comment
Please, Sign In to add comment