Está en la página 1de 4

Controlador PID discreto

Conceptos a tener en cuenta:


Timer0 (Interrupción)
Error
Bucle de iteración
Constantes Kp, Ki y Kd

Timer_0 (RTCC)
Temporizador que permite realizar un conteo hasta que este se desborde (llegue al límite del
conteo) y detenga la ejecución de las instrucciones para atender el llamado del Timer, o
también, que realice una tarea en específico cuando el Timer llegue a su valor final.
El Timer se carga con un valor llamado “pre-escaler” el cual puede tener los siguientes
valores:
RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16, RTCC_DIV_32, RTCC_DIV_64,
RTCC_DIV_128, RTCC_DIV_256.

Para obtener el valor del Timer con el que debe cargarse, se usa la siguiente fórmula:
𝑇𝑖𝑒𝑚𝑝𝑜(𝑠) ∗ 𝐹. 𝑂𝑠𝑐
𝐶𝑎𝑟𝑔𝑎𝑇 = = 𝑉𝑎𝑙𝑜𝑟 𝑑𝑒𝑙 𝑇𝑖𝑚𝑒𝑟
4 ∗ 𝑃𝑟𝑒𝑒𝑠𝑐𝑎𝑙𝑒𝑟
Pero para que el Timer llegue a su valor máximo (255) y se genere la interrupción, este debe
pasar de 255 a 0, por lo que se debe realizar lo siguiente:
256 − 𝑉𝑎𝑙𝑜𝑟 𝑑𝑒𝑙 𝑇𝑖𝑚𝑒𝑟

Consideraciones:
• Tratar siempre de obtener un número entero en la realización de la fórmula para el
valor del Timer.
• El valor del Timer no debe ser mayor a 256.

Si el resultado para el valor del Timer es mayor a 256, se realiza lo siguiente:


𝑉𝑎𝑙𝑜𝑟 𝑑𝑒𝑙 𝑇𝑖𝑚𝑒𝑟 = 𝑉𝑎𝑙𝑜𝑟 𝑖𝑛𝑖𝑐𝑖𝑎𝑙 𝑑𝑒𝑙 𝑇𝑖𝑚𝑒𝑟 ∗ 𝑉𝑎𝑙𝑜𝑟 𝑑𝑒𝑙 𝑐𝑜𝑛𝑡𝑎𝑑𝑜𝑟 𝑎 𝑑𝑒𝑐𝑟𝑒𝑚𝑒𝑛𝑡𝑎𝑟
Teniendo esto en cuenta, para el proyecto en pie se desea realizar un muestreo de 0.1
segundos, por lo tanto:
0.1 ∗ 8000000
𝐶𝑎𝑟𝑔𝑎𝑇 = = 𝑉𝑎𝑙𝑜𝑟 𝑑𝑒𝑙 𝑇𝑖𝑚𝑒𝑟 = 6250
4 ∗ 32
Es mayor 6250 que 256 por lo tanto:
6250 = 𝑉𝑎𝑙𝑜𝑟 𝑖𝑛𝑖𝑐𝑖𝑎𝑙 𝑑𝑒𝑙 𝑇𝑖𝑚𝑒𝑟 ∗ 𝑉𝑎𝑙𝑜𝑟 𝑑𝑒𝑙 𝑐𝑜𝑛𝑡𝑎𝑑𝑜𝑟 𝑎 𝑑𝑒𝑐𝑟𝑒𝑚𝑒𝑛𝑡𝑎𝑟
6250 = 50 ∗ 125
Ahora se resta el RTCC (es decir, 256) con el valor inicial del Timer previamente obtenido:
𝑅𝑇𝐶𝐶 − 𝑣𝑎𝑙𝑜𝑟 𝑖𝑛𝑖𝑐𝑖𝑎𝑙 𝑑𝑒𝑙 𝑇𝑖𝑚𝑒𝑟
256 − 50 = 206
Ya con estos valores, tenemos el valor que debemos cargar en el Timer y el valor que
debemos cargar en el contador. Quedaría de la siguiente manera:
RTCC=206
Contador=125

Instrucciones para el Timer:


set_rtcc(value); -Para inicializar el contador del TIMER0 se usa la siguiente instrucción donde
la variable value puede ser de 8 o 16 bits, dependiendo del dispositivo que se esté trabajando.

setup_timer_0(RTCC_INTERNAL | RTCC_DIV_N | RTCC_M_bits); - Para configurar el TIMER0


en modo temporizador.
RTCC_INTERNAL, indica que estamos usando el timer0 en modo temporizador.
RTCC_DIV_N configura el preescaler en función de N. Donde N puede tomar uno de los
siguientes valores: 1,2,4,8,16,32,64,128,256.
RTCC_M_bits indica el número de bits del temporizador en función de M. Donde M puede
tomar uno de los siguientes valores: 8, 16.

enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
Activación de la interrupción por desbordamiento.

Constantes Kp, Ki y Kd (Controlador PID)

El termino proporcional estará dado por la ganancia proporcional multiplicada por el error, es
decir:
𝐾𝑝 ∗ 𝑒
Donde e es el error (señal de salida censada – señal de referencia)
Para el término integral, estará dado por el término integral (en un comienzo, este será cero,
para posteriormente ir obteniendo valores y usarse en el ciclo) mas el error multiplicado por
la ganancia integral, como se muestra a continuación:
𝐼𝑛𝑡𝑒𝑔𝑟𝑎𝑙 = 𝐼𝑛𝑡𝑒𝑔𝑟𝑎𝑙 + 𝑒 ∗ 𝐾𝐼

En lo que al término derivativo respecta, se puede obtener a través de la multiplicación de la


diferencia entre el error y el error pasado y por la ganancia derivativa, como se muestra a
continuación:
𝐷𝑒𝑟𝑖𝑣𝑎𝑡𝑖𝑣𝑜 = (𝑒 − 𝑒0 ) ∗ 𝐾𝐷

También podría gustarte