Problemas con control PID en Arduino

Agradezco a Eduardo por su aportación hasta ahora. El proyecto va bastante bien. Les envío un gif de otro pequeño problema. Ya he implementado VSWITCH, pero el problema es que en la imagen se supone que en el potenciómetro debe coincidir con el voltaje de salida. Por ejemplo, si tengo un voltaje de 0.35 en el potenciómetro, la salida del horno T debe ser 35. Les adjunto los archivos y correspondientes.
La versión de mi Proteus es 8.13. Si desean que descargue otra versión, lo haré para que sea compatible.
 

Adjuntos

  • problem3.png
    problem3.png
    566 KB · Visitas: 9
  • animacion.zip
    1,018.1 KB · Visitas: 2
  • proyect_arduino.zip
    45.9 KB · Visitas: 4
Puede que venga de leer un lm35 pero me parece que está convertido de aquella manera.
Lo mismo que el setpoint no está convertido. Si no quieres que llegue a 1023°C lo lógico es reducirlo de 0 a 100 o algo así.
Agradezco a Eduardo por su aportación hasta ahora. El proyecto va bastante bien. Les envío un gif de otro pequeño problema. Ya he implementado VSWITCH, pero el problema es que en la imagen se supone que en el potenciómetro debe coincidir con el voltaje de salida. Por ejemplo, si tengo un voltaje de 0.35 en el potenciómetro, la salida del horno T debe ser 35. Les adjunto los archivos y correspondientes.
La versión de mi Proteus es 8.13. Si desean que descargue otra versión, lo haré para que sea compatible.
Si no lo conviertes no.
Para que la tensión cuadre con la lectura deberías de usar map(0,5,0,1023) o algo así, no recuerdo exactamente cómo se usa map.
 
Saludos Scooter, Al usar la función de map, noté que mi circuito se comporta de manera más eficiente, ya que le indico el rango, pero en el multímetro no se refleja.
Lo que intento es que me salga algo parecido a esto, como se muestra a continuación en la imagen(captura de nombre de imagen "trato").
 

Adjuntos

  • new.png
    new.png
    65.6 KB · Visitas: 8
  • new2.png
    new2.png
    65.5 KB · Visitas: 8
  • trato.png
    trato.png
    619.7 KB · Visitas: 9
Última edición:
...
No sabía que 0.48828125 venía de 1/2048.
Pero... si analogRead() devuelve un entero entre 0 y 1023... ¿no sería 1/1024 = 0,09765625 ? :unsure:

Si la referencia del ADC son 5V y querés convertir la lectura a los volts presentes en la entrada la operación sería:
Código:
tempc = analogRead(PIN_INPUT)*(5/1024) ;   //   5/1024 = 1/2048 = 0.0048828125

Pero como se quiere que tempc se corresponda a los grados del horno , entonces:
Código:
tempc = analogRead(PIN_INPUT)*(100*5/1024) ;   //   100*5/1024 = 0.48828125
 
Me queda clarísimo Eduardo. (y)
Como con muchas cosas, la configuración depende de la referencia base que se tome.
¡Muchísimas gracias por resolver todas mis dudas!
 
Hay algo que no estan considerando, y como desconozco la salida de la librería "PID", entonces digo que la entrada analógica es de 0-1023, y la salida "analógica" (PWM), va de 0-255, entonces debes usar;
C++:
map(variable, 0, 1023, 0, 255);
.

Dejo el enlace a la referencia de map; map() - Arduino Reference
 
Hasta ahora ando con esto, como pueden ver ya llevo un gran avance gracias a todos por los comentarios. Use setpoint = map(analogRead(A1), 0, 1023, 0, 500) "para que fuera similar". Ahora solo me falta establecer bien los valores de kp, ki, kd. Los valores actuales que tengo son double kp = 401, ki = 10, kd = 0; lo que es lento. Alguna propuesta para ponerle algunos valores?
 

Adjuntos

  • kid.png
    kid.png
    64.1 KB · Visitas: 3
Tenes que aplicar una técnica de ajuste de parámetros, pero se supone que eso lo enseñan tus docentes o tu propio conocimiento.
Demasiado te han ayudado para lo que suele ser este foro, así que mas vale que vayas estudiando...

PD: ya expliqué lo mismo hace muchos años, asi que mejor buscalo...
En eso tengo duda. Supongo que debería hacer un experimento con una batería de 5V para los 500 grados y luego usar el método de Ziegler?(ya tengo un script que me saca los valores).
 
pero el problema es que en la imagen se supone que en el potenciómetro debe coincidir con el voltaje de salida. Por ejemplo, si tengo un voltaje de 0.35 en el potenciómetro, la salida del horno T debe ser 35.
Lo que pasa es que input viene multiplicada por un factor y setpoint no.
Código:
  tempc = analogRead(PIN_INPUT)*0.0048828125 * 100;
  input = tempc;
  setpoint =analogRead(A1);
O bien multiplicás las dos por el mismo o bien lo eliminás y trabajás con lo que devuelve analogRead()

La versión de mi Proteus es 8.13. Si desean que descargue otra versión, lo haré para que sea compatible.
Yo uso la 8.12 . La 8.13 la descarté porque no me respetaba los breakpoints con algunos micros.
Y la 8.15... no se si el problema habrá sido incompatibilidades, virus o lo que sea, el asunto es que después de instalarla en varias PC me dejaron de funcionar algunos programas y la cosa siguió corrupta después de sacarla y reinstalarlos --> tuve que reinstalar Windows en todas.

Si a alguien le pasó lo mismo que comente por favor :(
 
Acá está como se ajusta "practicamente" un controlador PID:
 
Hola, tengo una gran preocupación ya que he estado haciendo cambios en los valores Ki, Kp y Kd, pero solo se queda en un valor, 117.39 grados, aunque modifique los valores. Esto no hace ningún cambio en la estabilidad del circuito, por lo que creo que puede ser un mal circuito o alguna resistencia. También puede ser que los valores que estoy dando sean demasiado pequeños y deba dar cantidades más grandes, pero ya he probado esto y no ha funcionado. Antes de nada, ya he leído la publicación del Dr. donde se supone que debería haber cambios, pero no siento que haya cambios y el valor solo se queda colgado en esa temperatura, sin llegar a los 500 grados.
 

Adjuntos

  • problemas new.png
    problemas new.png
    83.3 KB · Visitas: 3
Hola, tengo una gran preocupación ya que he estado haciendo cambios en los valores Ki, Kp y Kd, pero solo se queda en un valor, 117.39 grados, aunque modifique los valores. Esto no hace ningún cambio en la estabilidad del circuito, por lo que creo que puede ser un mal circuito o alguna resistencia. También puede ser que los valores que estoy dando sean demasiado pequeños y deba dar cantidades más grandes, pero ya he probado esto y no ha funcionado. Antes de nada, ya he leído la publicación del Dr. donde se supone que debería haber cambios, pero no siento que haya cambios y el valor solo se queda colgado en esa temperatura, sin llegar a los 500 grados.

La temperatura máxima del horno es función de la potencia del calefactor y las pérdidas al ambiente. Con 120W y RTH 0.7 no vas a llegar a 500°C
--> Levantá la potencia y bajale un poco las pérdidas (digamos HP=600W) y RTH=1.5)
--> Si querés tocá también las constantes de tiempo, sobre todo la RTC

Ejemplo de parámetros:
{MODFILE=OVEN}
{TAMB=25}
{RTH=1.5}
{TPTC=10}
{RTC=2}
{TC=1}
{HP=600}

Y ahora sí tocá los parámetros Ki, Kp y Kd para que oscile lo menos posible.
 
Atrás
Arriba