# PSoC® 1  . Diseño de un PID digital con ayuda de MATLAB



## rednaxela (Jun 13, 2011)

Para este semestre me dejaron en la universidad realizar un PID digital utilizando los toolbox “ident” y “sisotool” de MatLab, en este caso se va realizar  el control sobre una planta que simula ser un horno: es una caja de 15cm*15cm*15cm forrada interiormente con icopor el actuador es un bombillo de carro de 12[V] @ 22[W]y se utiliza el sensor de temperatura LM35.

  El circuito del actuador está diseñado para que trabaje en la zona lineal, lo que significa que hay  perdidas de energía en forma de disipación lo mejor sería que trabajara con un PWM para tal caso. El motivo en primera instancia de que se haya realizado de esa forma (zona lineal), es para demostrar que se debe utilizar un filtro pasa bajo después del DAC,  ya que si se utiliza el PWM no habrá que hacer tal filtro para recuperar la señal muestreada y de por sí es más eficiente, pero donde manda profesor no manda estudiante  .

http://imageshack.us/photo/my-images/812/planou.png/

Fig1. Plano actuador- unidad de procesamiento – sensor​ 

 El plano de fig1, es bastante sencillo, tiene:




   Una entrada que es el SetPoint (0V -5V).


   Otra entrada que es el sensor de temperatura (actualmente deje la amplificación del sensor de temperatura para cuando la temperatura este en 70ºC la salida este en 5[V], bueno eso cada persona lo pueden dejar a su gusto, claro no ir a pasar las características del sensor LM35).


   Una salida que es la señal de control, mirar que el filtro está en el internamente en el PSoC lo mismo que el DAC. Por lo que el montaje en físico se reduce bastante.
  *Ahora si vamos con lo del PID, estos serían los pasos a seguir:



   Respuesta de la planta en lazo abierto ante una señal paso (escalón).
El tiempo con el que se toman los datos es crucial para definir el tiempo de muestreo del controlador, en esta práctica lo tome cada 1s , lógico con ayuda de un osciloscopio en mi caso, la respuesta ante una seña paso de 1[V] fue :

http://imageshack.us/photo/my-images/842/respuestaenlazoabierto.png/
Fig2. Respuesta en lazo abierto
​  El osciloscopio me da la opción de generar un archivo en Excel con los datos de la figura que me ha mostrado, y lo escogí cada segundo.​
  Uso del Toolbox “ident” para identificar la planta (función de transferencia en el dominio de S)
Importando los datos ( los de excel ) en el dominio del tiempo, y haciendo la identificación con el método "Process Models", devuelve el modelos aproximado a esos puntos :

http://imageshack.us/photo/my-images/820/indentificacin.png/
Fig3. Aproximación de la planta 
​
Discretización de la planta,   dominio S al Z (hay que tener en cuenta que al discretizar la planta solo se puede hacer por invarianza al paso ya que internamente trae incluido el retenedor de orden cero), el prototipo de la función de matalb que se utiliza es “c2d(función_s, tiempo_muestreo)” para realizar dicha discretización, se escoje tiempo de muestreo cada 2s porque el tiempo del controlador debe ser mayor y múltiplo del tiempo con el que se muestreo la planta, acordar que la planta se muestro cada 1s.
http://imageshack.us/photo/my-images/835/discretizacion.png/
Fig4. Discretización de la planta​


Dibujar lugar de las raíces en plano Z, con el toolbox “sistotool”, con la función de transferencia del paso anterior


   Agregar restricciones de diseño al plano Z( tiempo de estabilización  y máximo sobre_impulso o Settling time y Percent overshoot )
Escogí un tiempo de 220s y un maxímo sobreimpulso del 5%.​
Agregar controlador PID: agregar dos polos y dos ceros, este controlador lo saque del siguiente libro :        F. Luis Pagola, “_Control digital”, _Universidad Pontificada Comillas, 2002, Cap 5.
http://imageshack.us/photo/my-images/833/lugardelasraicesplanoz.png/
Fig5. Lugar de las Raices plano Z
​

   Ajustar polos del controlador al diseño para así exportar la función de transferencia del controlador en Z.
Acordar que tiene que cruzar los puntos de diseño para que cumpla con  los requerimientos, esa localización de los polos y ceros queda así (una  imagen con zoom) :​http://imageshack.us/photo/my-images/651/lugardelasraicesplanozz.png/
 Fig6. Lugar de polos y ceros Zoom​
Dejar un polo en 1 para el efecto integral ... el siguiente cuadro muestra la localización de los polos y ceros.

http://imageshack.us/photo/my-images/845/localizacionpolosyceros.png/
  Fig7. Lugar de polos y ceros​
Luego exportar el diseño File-Export ... y se exporta el compensador al "Workspace"

http://imageshack.us/photo/my-images/805/exportacion.png/​

Simular el controlador y la planta en simulink para verificar funcionamiento agregándole restricciones físicas como es el voltaje de alimentación del actuador que no es infinito.
Antes de simular en simulink es posible ver una respuesta en el sisotool ante una señal paso  y ver cuanta energía se necesita, luego podemos pasar al simulink, agregando el controlador, la planta y las restricciones principalmente son el voltaje de salida del actuador y el voltaje de salida del sensor 12[V] y 5[V] respectivamente.

http://imageshack.us/photo/my-images/11/diagramadebloques.png/
Fig8. Diagrama de bloques

La respuesta del sistema es:
http://imageshack.us/photo/my-images/806/respuestacontroladorant.png/
Fig8. Respuesta del sistema con controlador PID ante una señal paso
​Se observa que se estabiliza en un tiempo cercano al que se diseño, y el sobreimpulso también es aceptable, si se necesita mayor exactitud, se tendrá que modificar los polos y ceros del lugar de las raices. En mi caso lo deje así, el resultado que muestra la simulación es aceptable para mis requerimientos.​
  Hallar la ecuación en diferencias del controlador para implementarla en el microprocesador ( PSoC).
http://imageshack.us/photo/my-images/90/funciondetransferenciad.png/
Fig9. Función PID discreta

Despejando la ecuación en diferencias :

 u[n]=-0.802u[n-2] + 1.802u[n-1] + 3.827e[n-2] – 7.966e[n-1] + 4.145e[n]
​

```
...
float M1,M2,M3,M4,M5,M6;
int Vsensor, Vref;
...
void main(void){      
    M1=M2=M3=M4=M5,M6=0;             // valores iniciales
    Vsensor = Vref = 0;
    inicializa_modulos_del_psoc();
           
    while(1){  
        
        while(ADC8_1_fIsDataAvailable() == 0); //verificar si el dato está disponible
        Vsensor = ADC8_1_iGetData1();   
        Vref = ADC8_1_iGetData2ClearFlag();   
        M6 = Vref-Vsensor;                            // Calculo del Error
        M1 = -0.802*M2 + 1.802*M3 + 2.784*M4 - 5.987*M5 + 3.219*M6;        // Ecuación en diferencias PI
        if (M1>255) M1=254.0;                       // Evitar desbordamiento 
        else if (M1<0) M1=0.0;
        DAC8_1_WriteStall((int)M1);                // Escribir en el DAC
        M2 = M3;
        M3 = M1;        
        M4 = M5;
        M5 = M6;
    }  
}
```
Lastimosamente no tengo fotos de la respuesta en la vida real, pero el controlador funciono muy bien, comparando con simulink la respuesta casi fue la misma antes funciono mejor porque se estabilizaba unos 10 segundos antes y el sobre impulso fue muy cercano al 5%.

Bueno acá finaliza el diseño del PID, que se puede realizar en cualquier tipo de microprocesador, solo la última parte que fue de código es para PSoC aunque claro faltaría como configurar los módulos pero ese no es el fin de comentario.

Cabe aclarar que el periodo de muestreo del ADC es de 2s como se había diseñado.

Eso es todo

Saludes.​


----------



## betodj (Jun 13, 2011)

Excelente trabajo seguramente será de ayuda para los colegas del foro...

Un saludo..


----------



## rednaxela (Jun 14, 2011)

Si espero que sirva, pero me falto algo importante se me paso en alto, acá está el proyecto adjunto, la versión que utilice es la "PSoC Designer 5.1", alguna vista de los módulos análogos, ADC_DUAL, DAC, Filtro pasabajo:

http://imageshack.us/photo/my-images/9/psocblogos.png/​


----------



## CARLOS0907 (Nov 14, 2011)

Es muy bueno tu trabajo solo tengo una duda, como configuraste el periodo de muestreo en el PSoC?


----------



## HIRONAKAMURA (Oct 29, 2012)

Buen aporte y explicación,  pero ¿aquí te equivocaste?

u[n]=-0.802u[n-2] + 1.802u[n-1] + 3.827e[n-2] – 7.966e[n-1] + 4.145e[n]

Porque en el código escribiste, que según yo esta bien:

M1 = -0.802*M2 + 1.802*M3 + 2.784*M4 - 5.987*M5 + 3.219*M6;        // Ecuación en diferencias PI

Y en esta parte:

M1=M2=M3=M4=M5,M6=0;             // valores iniciales

No es:

M1=M2=M3=M4=M5=M6=0;             // valores iniciales

Estoy tratando de hacer algo similar...


----------



## axshaw (Oct 31, 2014)

Hola

Me podrías dar una explicación sobre el proceso de identificar la respuesta al escalón y encontrar la función de transferencia mediante tool box ident de MATLAB.

Gracias.


----------

