Estoy intentando implementar el algoritmo de control PI en c #. Encontré ayuda en internet y entiendo la fórmula de cómo usarla. He medido el valor (PV) = 20 ° C y el punto de ajuste (SP) = 80 ° C; Me gustaría actualizar cada 2 segundos a tiempo. una vez que el valor medido alcanza el punto de ajuste, el controlador tiene que apagarse así.
Encontré este código enlace al algoritmo pid
pero lo que necesito es cómo calcular los factores de ganancia que ganan Kp y Ki, y qué hay de dt. Estoy descuidando el derivado. Entonces, por favor, ¿puede alguien explicarme cómo calcular esos factores de ganancia? Estoy usando el controlador digital shimaden SR90 (compré esto). Encontré algunos factores en el manual, pero no estoy seguro de poder usar esos factores de ganancia.
Editado para dudas.
He intentado su código de esta manera, no estoy seguro de que esta sea la forma correcta o no.
int temperature;
//int setpoint; // i have commented these because we never used.
//int status = 0;
int pulses = 0;
//int integral = 4;
//int derivative = 5;
int upperTemp = 1000; //100.0C
int upperLimit = 100; //pulses per time frame // i can take 100 pulses per sec.
runtime //make a timer that runs and updates temperature value...lets say every second
{
read temperature; //every second
temperature *= 10; //multiply by 10 for decimal place, but still keeping in integer
pulses = map(temperature, upperTemp, 0, 0, upperLimit);
//take this value of pulses to update the timer interval
I didn't understand the above line if i am right then here i need to call the
timer like
if(pulses> somevalue)
call timer
else
no call
}
//borrowed from arduino
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
Tengo una pregunta aquí 1) ¿Este método parece ser diferente al anterior porque nunca usamos ganancias o errores en este método? 2) Entiendo que "upperTemp" es el valor del punto de ajuste.
Lo he intentado con un ejemplo simple como este
int temperature = 20;
int pulses = 0;
int upperTemp = 800; //80.0C
int upperLimit = 100; //pulses per time frame // i can take 100 pulses per sec.
read temperature; //every second which is 20 in this case
temperature *= 10; //multiply by 10 for decimal place, 20*10 =200;
pulses = map(temperature, upperTemp, 0, 0, upperLimit);// map(200,800,0,0,100)
//then map function will return pulses = 75;
//then here i don't understand that much but i am thinking like that
if(pulses> 75)
switch on;
else
switch off;
No estoy seguro de que estoy haciendo lo correcto! ¿Puedes sugerirme algo más aquí?