Implementación de D (diferenciación) en PID

Estoy implementando un controlador PID para el control de velocidad del motor. Terminé de implementar el control PI y funciona perfectamente bien para mí. En la especificación me dijeron que implementara una técnica de filtrado usando la siguiente ecuación para la parte D:

ingrese la descripción de la imagen aquí

Ahora, lo que entiendo hasta ahora es que srepresenta "dx/dt"generalmente lo que corresponde a la tasa de cambio de error, pero aquí puedo relacionarlo con la tasa de cambio de retroalimentación. Td/Nes para limitar la salida de ganancia general (espero haberlo hecho bien). Ahora, para representar esto en términos de código C, probé de la siguiente manera:

        s = (CurrentFeedback()-Old_Feedback)*100/(MaxFeedback()); //to calculate the % change in feedback
        s = s*1000/sampleTime;      //1000 is multiplied because sampleTime is in milliseconds
        D = (Td*s)/(1+(s*Td/N));
        D = D*KP;   //Kp is multiplied as per the standard pid equation.

        Old_Feedback = CurrentFeedback();
        PID = P+I-D;

Bueno, los resultados al agregar D no son los que he predicho. Solo quiero saber si implementé la ecuación de la porción D correctamente. ¿Estoy cometiendo algún error en mi comprensión de las matemáticas básicas de diferenciación?

NOTA: No tengo la libertad de cambiar el recalculo de kp, ti, td ya que proviene directamente del VFD.

Intente incrustado.com/design/prototyping-and-development/4211211/… , "PID sin un doctorado". Hay una sección clara sobre la implementación derivada.
Cuando declara Old_Feedback = CurrentFeedback() es incorrecto. Debe leer el valor con CurrentFeedback() y almacenarlo en temp. la variable CurrentFeedback_tmp, luego use ese valor en todas partes en ese ISR, porque cada vez que llama a fct CurrentFeedback() recupera el valor real que será diferente cada vez que lo recuerde.
"los resultados al agregar D no son los que he predicho" - ¿qué has predicho? ¿Por qué son diferentes?
Hay un gran potencial para desbordamientos de enteros aquí. ¿Cuáles son los tipos de las variables involucradas y ha considerado los valores máximos de las mismas?
s,D es S32, KP,Td y N U16. el tiempo de muestra es U32 Consideré los valores máximos de la variable según el valor máximo posible de tipos de datos particulares.
¿Por qué estás haciendo P+ID? ¿Se ha cambiado el signo de D en alguna parte? Habría esperado que el término D se sumara al resultado y no se restara. ¿Puede fijar el período de tiempo de su ciclo de procesamiento y detección? Hace la vida mucho más simple si puede muestrear a una tasa fija. Además, si su tiempo de muestra está en milisegundos, ¿no debería dividir por 1000 para obtener segundos?
No puedo dividir porque mi dispositivo no admite puntos flotantes. Así que estoy multiplicando el numerador con 100, puedes verlo en el código. En el 1er punto tienes razón debería ser P+I+D. Creo que hubo un problema al implementar la ecuación. Publicaré la respuesta en unos días una vez que termine de probar mi código

Respuestas (1)

Tengo 3 puntos para compartir:

1-Le diré por qué la gente se mete con el término D en términos de signo, PID= P + I + D pero, D = kd* (error -olderror), y en el control de posición si se está acercando al punto de ajuste, siempre es olderror < error, por lo que el término D será negativo y, por lo tanto, disminuirá la salida y evitará el sobreimpulso.

2-Respecto al tiempo, no dividir ni utilizar el tiempo. ya que está utilizando un microcontrolador incorporado, simplemente haga una constante de tiempo y cancélela de todas las ecuaciones: por ejemplo, use una interrupción del temporizador para generar una constante de tiempo de 1 ms y llame a su función interna.

3-Por qué está usando PID para control de velocidad, el 90% del tiempo PI es suficiente en control de velocidad, ya que D aquí es más como control de aceleración.

Espero que ayude