Función de potencia / exponencial ARM

3

Estoy tratando de codificar una función exponencial para usarla en una señal PWM.

Mi pregunta es, ¿alguien sabe cómo hacer una función de potencia en un microcontrolador ARM cortex-M (STM32F4 en este caso, que tiene una FPU)? ¿O una aproximación de la serie taylor sería mejor?

Sé que esta pregunta está muy relacionada con la programación, pero como está relacionada con los microcontroladores, pensé que estaría bien publicar aquí (?), además, parece que las preguntas sobre el flujo de apilamiento se pierden muy rápidamente.

    
pregunta richendes

2 respuestas

2

La generación de una señal PWM en una aplicación incorporada generalmente implica un número limitado de bits en los contadores utilizados para generar el tiempo de la señal. Esto podría ser de tan solo 8 bits o 10 bits, dependiendo de su hardware PWM. Tenga en cuenta también que la representación binaria de los valores PWM establece un universo fijo de valores en la aplicación incrustada. Puede usar esto a su favor para encontrar una solución a este problema.

La idea es utilizar una herramienta de cálculo fuera de línea, como una hoja de cálculo, para calcular el rango de funciones exponenciales que desee. Esto se puede usar para producir una tabla de datos de búsqueda que luego se coloca en el código del microcontrolador como una tabla de constantes. Los PWM de ancho de bits limitado hacen que el tamaño de la mesa sea práctico. Si tiene un PWM de 16 bits, la tabla puede contener valores objetivo de 16 bits, pero el tamaño de la tabla puede limitarse a un tamaño práctico sin necesidad de entradas de 64K. En este último caso, el software de destino utiliza la interpolación lineal entre las entradas de la tabla para encontrar los valores de PWM de destino. Esta técnica es conocida como interpolación lineal por tramos.

Encontrará este enfoque de búsqueda en la tabla mucho menos intensivo en computación que en el intento de calcular complicadas fórmulas de punto flotante en tiempo real en su microcontrolador. A veces, la mejora del rendimiento obtenida es esencial para las aplicaciones que requieren el valor PWM para actualizar y rastrear una entrada con una latencia mínima.

    
respondido por el Michael Karas
3

La función lib estándar para encender el tipo de datos flotante es float powf(float, float) . Parece que está bien soportado en mi configuración STM32F4 basada en gcc. Dado el rendimiento de esta MCU y su soporte de FPU de hardware para float , esta función probablemente tenga un rendimiento excelente (es probable que esté utilizando algunas series de taylor o una aproximación numérica optimizada similar). Un enfoque de tabla de búsqueda podría ser más rápido si puede limitar su aplicación a un conjunto específico de poder, pero como tal implementación sería más complicada y menos flexible, la mantendría como una posible optimización si / cuando usted determina que powf es demasiado lento para sus necesidades.

    
respondido por el abey

Lea otras preguntas en las etiquetas