Ir para conteúdo

Olá colegas, estou fazendo um PID de controle de nível de tanque, porem a minha integral e derivada não esta funcionando queria a ajuda de vcs


alan da silva

Postagens recomendadas

#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);
*/
 

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Processando...
×
×
  • Criar Novo...