diseño de controlador digital y mapeo de señales analógicas a valores enteros digitales

0

Tengo una situación específica en la que estoy tratando de rodear mi cabeza, pero creo que debería tener un formalismo general para abordar el problema.

He diseñado un controlador BiQuad para un conversor Buck y estoy tratando de implementar este controlador mediante una rutina de uC. El diseño del BiQuad se realiza en el dominio S y la conversión de este controlador a la forma discreta es un procedimiento bien conocido y no existe ningún misterio.

Mi preocupación es sobre la forma de la señal de error. La señal de error es una diferencia simple entre 2 señales analógicas (V_reference - V_out).  Estoy usando el convertidor ADC para muestrear V_Out que lo asigna a un valor entero en el rango [0 - 65536] que corresponde a (0 - > Vcc) [vcc aquí está relacionado con el convertidor ADC].

ahora los coeficientes de punto flotante de mi controlador BiQuad discreto deben ajustarse para adaptarse al hecho de que la señal de error que estoy alimentando no es un valor real sino un valor mapeado de enteros, ¿no?

aunque puedo convertir la lectura del ADC en una representación real de punto flotante de la señal de error, pero prefiero hacer el cálculo con un valor entero para que el código del controlador se ejecute más rápido.

asumamos esto simple:

PWM_Duty = a0 * error + a1 * previous_error + b0 * previous_PWM_Duty.

error, previous_error : valor entero de 32 bits asignado desde el valor de punto flotante por el convertidor ADC.

a0, a1, b0: coeficientes de punto flotante obtenidos por el diseño del controlador.

PWM_Duty, previous_PWM_Duty: la señal de control que cambia el ciclo de trabajo del PWM, es un valor entero entre 0 y 100.

mi pregunta es cómo convertir b0, a1, a2 para hacer que la ecuación de control haga el control correcto en el mundo analógico.

con suerte estoy haciendo la pregunta correcta aquí. Me encantaría alguna referencia o libros que hablen sobre los controladores de codificación y aborden este tipo de problema.

perdón por el largo post :)

    
pregunta Udai F.mHd

1 respuesta

1

En realidad, existen bastantes referencias sobre la conversión de algoritmos de punto flotante a punto fijo. Google "convierte el algoritmo de punto flotante a punto fijo" para muchos ejemplos. Algunos programas como MATLAB pueden ayudar (aunque no es barato, necesitará algunas cajas de herramientas).

El enfoque general es escalar los números en cada operación (por turnos) para que mantenga el número máximo de bits (al menos "suficientes" bits de todos modos) sin ninguna posibilidad de desbordamiento. En algunos casos (como la integración) donde los números pueden crecer sin límite en ciertas condiciones, puede resultarle útil utilizar la matemática de punto fijo fraccional de saturación en lugar de los algoritmos de enteros comunes que encontrará en C o en el idioma que utilice.

No necesariamente será mucho más rápido que el punto flotante, depende del procesador la cantidad de bits que necesite, etc. Por ejemplo, si desea multiplicar un número de 24 bits por un coeficiente de escalado cercano a 1.000 para la calibración, lo más probable es que tenga que usar largos (64 enteros de bits) en C porque desea tener al menos 24 bits. en cada operando y eso dará como resultado un producto que puede ser de ~ 48 bits (luego podría descartar los 24 bits más o menos), pero si intenta multiplicar dos multipicandos de 24 bits en matemática de 32 bits obtendrá un desbordamiento. Una multiplicación de punto flotante de 32 bits (con una mantisa de 24 bits) puede ejecutarse más rápido que una multiplicación de enteros de 64 bits.

Puede pensar en la escala como un manejo manual del exponente en un número de punto flotante.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas