Tengo un bucle PID funcionando a 100Hz y está funcionando razonablemente bien, por ahora. Sin embargo, si duplico la velocidad a 200Hz ya no funciona, lo cual no es una gran sorpresa. La pregunta es, ¿qué cambios hay que hacer en los valores del PID para que funcione a 200Hz? ¿Es un cambio lineal en los valores? ¿Se puede calcular? ¿Cuál es la relación entre la estabilidad y la velocidad del bucle?
Respuesta
¿Demasiados anuncios?Cuando se ejecuta un PID con una frecuencia de muestreo más alta se pueden encontrar dos cosas:
-
El integrador puede no funcionar correctamente si el nuevo delta es muy pequeño. Esto se debe a la resolución final del número en coma flotante. El uso de números flotantes de doble precisión mejora significativamente este problema hasta cierto punto (frecuencia de muestreo).
-
El diferenciador aumenta su salida debido al ruido de entrada (también ruido de cuantificación). La salida sigue \$\dfrac{d\varepsilon}{dt}\$ por lo que un menor tiempo de muestreo (mayor frecuencia) significa una mayor salida para el mismo cambio de paso (cuantificación). Una forma de resolver este fenómeno es utilizar un filtro de paso bajo de primer orden en la parte D. Sin embargo, los tiempos de filtrado grandes también harían que la parte D no respondiera a dinámicas altas, justo lo contrario de lo que se utiliza la parte D. Otra medida es utilizar una banda muerta en la entrada de la parte D - un pequeño cambio en la señal de entrada es por lo tanto despreciado (una buena manera de eliminar el ruido de cuantificación)
Definamos una función PID como $$y=K_p \cdot(\varepsilon+\dfrac{1}{T_i}\int\varepsilon dt+ T_d \dfrac{d\varepsilon}{dt})$$
Entonces, forma discreta: $$y=K_p\cdot(\varepsilon + \dfrac{\Delta T}{T_i}\Sigma\varepsilon + T_d\dfrac{\Delta\varepsilon}{\Delta T} )$$
A menudo se escribe también de esta forma: $$y=k_p\varepsilon + k_i\Sigma\varepsilon + k_d\Delta\varepsilon$$
Si su rutina PID utiliza la última forma, debe recalcular ki,kd en cada cambio de kp o tiempo de muestreo.