Volver al inicio

Control de Fase PWM en STM32: Métodos de Sincronización de Temporizadores

El artículo explica métodos para el control preciso de las fases de señales PWM en microcontroladores STM32 mediante sincronización de temporizadores por hardware. Se consideran tres enfoques con análisis de precisión, limitaciones y ejemplos de código. Se proporcionan recomendaciones para diagnósticos de fase usando un osciloscopio.

Control Preciso de Fase PWM en STM32: Implementación Sin Pérdidas
Advertisement 728x90

Control preciso de fase PWM en STM32: Métodos de hardware sin pérdidas

Los microcontroladores STM32 no cuentan con un registro directo para ajustar la fase de las señales PWM de hardware. Este problema es crítico al sincronizar múltiples canales en tareas que requieren desplazamientos temporales estrictos. Te mostraremos cómo implementar un control preciso de fase con un impacto mínimo en el rendimiento y sin emulación por software.

¿Por qué ajustar la fase PWM?

El PWM de hardware en STM32 facilita establecer la frecuencia y el ciclo de trabajo, pero las bibliotecas estándar no ofrecen una forma directa de desplazar la fase. Esta limitación se vuelve crítica en los siguientes escenarios:

  • Emular un codificador en cuadratura usando dos señales PWM con un desplazamiento fijo
  • Generar pares sin/cos para mezcladores en cuadratura (desplazamiento de 90°)
  • Controlar motores BLDC trifásicos (desplazamiento de 120° entre canales)
  • Sincronizar inyectores de gasolina o bobinas de encendido en motores de combustión interna
  • Generar señales LO en receptores SDR
  • Reducir EMI escalonando artificialmente las fases en circuitos de potencia

Sin sincronización de hardware, las fases de las señales dependen de factores aleatorios: tiempo de inicialización del temporizador, velocidad de ejecución del código, frecuencia del bus. Esto hace imposible una sincronización predecible.

Google AdInline article slot

Fundamento teórico: Arquitectura maestro-esclavo

La idea clave es usar un temporizador (maestro) como fuente de referencia de sincronización para otro (esclavo). La fase del temporizador esclavo se ajusta mediante el valor del comparador del temporizador maestro. Cuando se alcanza este valor, el contador del temporizador esclavo se reinicia, creando el desplazamiento temporal deseado.

![](./images/image-5.png)

Es importante entender que la fase se mide en unidades relativas:

Google AdInline article slot
  • 0° — señales en fase
  • 180° — antifase
  • 360° — período completo (equivalente a 0°)

La precisión del desplazamiento está determinada por la resolución del temporizador. Para un período de 1 ms y reloj de bus de 84 MHz, el error puede ser tan bajo como 11.9 ns (1/84e6).

Métodos de implementación práctica

Método 0: Inversión de polaridad (desplazamiento de 180°)

El enfoque más simple es alternar el bit CCxP en el registro TIMx_CCER. Se trata de una operación atómica que no requiere recursos adicionales. La desventaja es que solo ofrece dos estados fijos (0° y 180°). Es adecuada para modulación BPSK, pero no resuelve la necesidad de ajuste suave.

Método 1: Ajuste de contador por software

El enfoque ingenuo consiste en escribir directamente en el registro CNT del temporizador esclavo:

Google AdInline article slot
bool pwm_phase_set_counter_adjust(uint8_t num, int32_t phase_us) {
    bool res = false;
    PwmHandle_t *Node = PwmGetNode(num);
    if(Node) {
        int32_t compare_value = TimerPhaseUsToCompareValue(Node->PhaseComparator.timer, phase_us);
        int32_t counter_base = (int32_t) timer_counter_get(Node->PhaseComparator.timer);
        int32_t value = counter_base + compare_value;
        res = timer_counter_set(Node->TimChan.timer, (uint32_t) value);
    }
    return res;
}

Este método tiene un error de hasta 3 µs a 1 kHz (0.29%) debido al tiempo de ejecución del código. Principales desventajas:

  • Requiere detener el temporizador durante la escritura
  • Interrumpe la integridad de la señal en el momento de la corrección
  • Carga la CPU con interrupciones

Método 2: Sincronización de hardware mediante maestro-esclavo

La solución óptima utiliza el mecanismo integrado de sincronización de temporizadores. La configuración incluye:

  • Configurar el temporizador maestro (TIM8) en modo de generación de trigger en coincidencia del comparador OC1 (TIM_TRGO_OC1)
  • Establecer el temporizador esclavo (TIM4) para reiniciarse en trigger interno (TIM_TS_ITR3)
  • Establecer modo esclavo en reinicio (TIM_SLAVEMODE_RESET)

La configuración HAL se ve así:

const TimerConfig_t TimerConfig[] = {
    { 
        .num = TIMER_NUM_LO_BASE,
        .role = TIMER_ROLE_MASTER,
        .master_out_trigger = TIMER_MASTER_OUT_TRG_OC1,
    },
    { 
        .num = TIMER_NUM_LO,
        .role = TIMER_ROLE_SLAVE,
        .slave_input_trigger = TIMER_SLAVE_IN_TRIG_INTERNAL_TRIGGER_3,
        .slave_mode = TIMER_SLAVE_MODE_RESET,
    },
};

Ventajas del método:

  • Implementación completamente de hardware sin interrupciones
  • Precisión del desplazamiento hasta el ciclo del reloj del bus (11.9 ns a 84 MHz)
  • Sin glitches en la señal de salida durante ajustes dinámicos
  • Carga mínima de la CPU (solo escritura en el registro de comparador del temporizador maestro)

Limitaciones:

  • Requiere un par de temporizadores que soporten conexión maestro-esclavo
  • Máximo 4 temporizadores esclavos por maestro (debido al número de comparadores)
  • Algunos temporizadores (6,7,10,11,13,14) no soportan modo esclavo

Diagnóstico de fase con un analizador lógico

La verificación de la configuración correcta se realiza con un osciloscopio o analizador lógico. Para las pruebas:

  • Establecer temporizador maestro (TIM8_CH1) a 1 kHz, ciclo de trabajo del 50%
  • Establecer temporizador esclavo (TIM4_CH2) con desplazamiento de fase de 90°
  • Conectar sondas a los pines correspondientes

Resultado esperado:

  • Con desplazamiento cero, el flanco ascendente de la señal maestra se alinea con el inicio del período esclavo
  • Con desplazamiento de 90° para un período de 1 ms, la señal esclava está desplazada 250 µs

![](./images/image-17.png)

Punto clave: el error se mide en ciclos del reloj del bus. Para STM32F407 a 84 MHz de bus, el paso mínimo es 11.9 ns. En la práctica a 1 kHz, esto da una precisión del 0.012%.

Lecciones clave

  • La elección del método depende de los requisitos de precisión: para un error del 0.01%, usa sincronización de hardware; para 0.3%, el ajuste por software es aceptable
  • Verifica la compatibilidad de temporizadores: no todas las parejas soportan conexión maestro-esclavo (ver tabla en RM0090)
  • Evita detener temporizadores: el método de hardware no interrumpe la generación de señales durante cambios de fase
  • Considera los límites del dispositivo esclavo: un maestro puede conectar a no más de 4 temporizadores esclavos
  • Diagnostica la fase con un osciloscopio: la verificación visual es obligatoria para sistemas críticos

— Editorial Team

Advertisement 728x90

Leer después