alan da silva Postado 3 Setembro 2019 Denunciar Share Postado 3 Setembro 2019 #define sensor A1 #define controle 6 // pino do mosfet #define altTanque 14.5 #include "Ultrasonic.h" #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); Ultrasonic ultrasonic(10,9); //pinos trigger e echo long microsec = 0; float distanciaCM = 0; void setup() { Serial.begin(9600); pinMode(sensor,INPUT); pinMode(controle,OUTPUT); lcd.begin(20,4); } double P = 0, I = 0, D = 0, PID = 0; double KP = 285.5, KI = 160.5, KD = 10.0; int setpoint = 10; float controlePWM = 0; float nivel; double erro = 0; double lastNivel; long lastProcess = 0; void loop() { microsec = ultrasonic.timing(); //Lendo o sensor distanciaCM = ultrasonic.convert(microsec, Ultrasonic::CM);//Convertendo a distância em CM double distanciaCm = map(distanciaCM, 0, 14.5, 0, 255); nivel = altTanque - distanciaCM; if(nivel > 14.5){ nivel = 14.5; } if(nivel < 00.00){ nivel = 00.00; } erro=setpoint-nivel; float deltaTime = (millis () - lastProcess)/ 1000.0; lastProcess = millis(); P = erro * KP; I = (I + erro *KI) * deltaTime; //ou I += erro * KI; D = (lastNivel - nivel) * KD / deltaTime; //D = (lastNivel - nivel) * KD ; lastNivel = nivel; //lastNivel =nivel; PID = P + I + D; controlePWM = PID; // saida do controle if(controlePWM > 255){ controlePWM = 255; } if( nivel >= setpoint){ controlePWM = 0; } analogWrite(controle,controlePWM); lcd.setCursor(2,0); lcd.print("IFMA-COELHO NETO"); lcd.setCursor(2,1); lcd.print(nivel); lcd.print(" CM DE AGUA "); lcd.setCursor(5,2); lcd.print(controlePWM); lcd.print(" PWM "); lcd.setCursor(0,3); lcd.print("ALAN,JACINTO E BRITO"); //delay(100); analogWrite(controle,controlePWM); Serial.print(setpoint); Serial.print(" "); Serial.print(nivel); Serial.println(" "); //delay(100); /* analogWrite(controle,controlePWM); Serial.print("pwm: "); Serial.println(controlePWM); Serial.print("cm de agua: "); Serial.println( nivel); Serial.print("erro: "); Serial.println(erro); delay(1000); */ Citar Link para o comentário Compartilhar em outros sites More sharing options...
Carneiro Postado 3 Setembro 2019 Denunciar Share Postado 3 Setembro 2019 O que tá controlando no pino 6? Seu comentário é mosfet... Citar Link para o comentário Compartilhar em outros sites More sharing options...
Carneiro Postado 3 Setembro 2019 Denunciar Share Postado 3 Setembro 2019 De qualquer maneira, pelo que vi dos valores constantes (Ki, Kp e Kd) seu número final tá quase sempre muito grande, provavelmente sempre seu PWM tá no máximo... Tambem pra isso que serve os vários métodos de autotunning, mas dá pra definir na unha se tiver mais noção de como evolui o erro e as somas e derivadas. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Postagens recomendadas
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.