// (Really Simple) PID Class by Ivan Seidel |
// GitHub.com/ivanseidel |
// Use as you want. Leave credits |
classPID{ |
public: |
double error; |
double sample; |
double lastSample; |
doublekP, kI, kD; |
double P, I, D; |
double pid; |
double setPoint; |
long lastProcess; |
PID(double _kP, double _kI, double _kD){ |
kP = _kP; |
kI = _kI; |
kD = _kD; |
} |
voidaddNewSample(double _sample){ |
sample = _sample; |
} |
voidsetSetPoint(double _setPoint){ |
setPoint = _setPoint; |
} |
doubleprocess(){ |
// Implementação P ID |
error = setPoint - sample; |
float deltaTime = (millis() - lastProcess) / 1000.0; |
lastProcess = millis(); |
//P |
P = error * kP; |
//I |
I = I + (error * kI) * deltaTime; |
//D |
D = (lastSample - sample) * kD / deltaTime; |
lastSample = sample; |
// Soma tudo |
pid = P + I + D; |
return pid; |
} |
}; |
#definepSENSOR A1 |
#definepCONTROLE3 |
PID meuPid(1.0, 0, 0); |
voidsetup() { |
Serial.begin(9600); |
pinMode(pSENSOR, INPUT); |
pinMode(pCONTROLE, OUTPUT); |
} |
int controlePwm = 50; |
voidloop() { |
// Lê temperatura |
double temperature = map(analogRead(pSENSOR), 0, 1023, 0, 100); |
// Manda pro objeto PID! |
meuPid.addNewSample(temperature); |
// Converte para controle |
controlePwm = (meuPid.process() + 50); |
// Saída do controle |
analogWrite(pCONTROLE, controlePwm); |
} |
Thank you ivan for the code. I'll use your PID code as reference for my final project about Controlling DC Motor Models in MATLAB from Arduino |
Thank you Ivan... |
Nice and simple approach :) However, I have a question:
Nice work. Kudos! |
Ivan boa noite. sou meio leigo em programação. onde eu insiro o valor de Kp,Ki e Kd? e o que seria esse ' PID meuPid(1.0, 0, 0)'? obrigado |
Great job Ivan! Obrigado por compartlhar! Um abraço e sucesso! |
Obrigado por compartilhar, vi seu vídeo e agora consegui entender a função do PID. Só tinha ouvido falar e to estudando isso para aplicar na faculdade, valeu abraços ;)' |
Olá Ivan, estou a implementar um controlador PID em um conversor cc-cc, e gostaria de saber se posso utilizar este código como base para o projeto, quais as limitações dele e quais melhorias podem ser feitas para um melhor desempenho do controlador |
Obrigado Ivan! Parabéns pelo trabalho. |
Ja tentei implementar seu código mas o meu derivativo sempre fica saindo nan ou inf. |