¿Qué hace TIM_OCMode en STM32F4?

Estoy haciendo una unidad antifase bloqueada para el control del motor en la placa STM32F4. Estoy configurando los 4 canales de Timer4 para que estén en pares, ch2 inverso de ch1 y ch4 inverso de ch3. Cada par controlará su propio motor.

    TIM_TimeBaseInitTypeDef TIM_BaseStruct;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
    TIM_BaseStruct.TIM_Prescaler = 0;
    TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
    TIM_BaseStruct.TIM_Period = 3999;
    TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_BaseStruct.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM4, &TIM_BaseStruct);
    TIM_Cmd(TIM4, ENABLE);

    GPIO_InitTypeDef GPIO_InitStruct;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

    GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_TIM4);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOD, &GPIO_InitStruct);

    TIM_OCInitTypeDef TIM_OCStruct;

    TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;

    // Channel 1
    TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
    TIM_OCStruct.TIM_Pulse = 1999;
    TIM_OC1Init(TIM4, &TIM_OCStruct);
    TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);

    // Channel 2
    TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCStruct.TIM_Pulse = 1999;
    TIM_OC2Init(TIM4, &TIM_OCStruct);
    TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);

    // Channel 3
    TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
    TIM_OCStruct.TIM_Pulse = 1999;
    TIM_OC3Init(TIM4, &TIM_OCStruct);
    TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);

    // Channel 4
    TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCStruct.TIM_Pulse = 1999;
    TIM_OC4Init(TIM4, &TIM_OCStruct);
    TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);

Para cambiar el ciclo de trabajo usaré

void changePulseCH1_2(uint32_t pulse)
{
    uint32_t prim;
    prim = __get_PRIMASK();
    __disable_irq();

    TIM4->CCR1 = pulse + DEADTIME;
    TIM4->CCR2 = pulse - DEADTIME;

    if (!prim) __enable_irq();
}

Según tengo entendido, TIM_OCPolarity_Low hará que la salida del canal sea primero baja y luego alta, mientras que TIM_OCPolarity_High será exactamente lo contrario, lo que hará que la antifase esté bloqueada. Las pruebas en los LED parecen confirmar que configurar el mismo pulso para ambos hace que un LED sea más tenue y otro LED más brillante, si el pulso no es del 50%. Lo que no entiendo es el significado de la línea.

TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM2;

¿Cuál es la diferencia entre PWM1 y PWM2? Parece que no puedo encontrar una fuente confiable de información sobre esto, ¿cuál es su propósito?

Además, ¿cuál es la diferencia entre los tres posibles modos alineados al centro? Hay

TIM_CounterMode_CenterAligned1
TIM_CounterMode_CenterAligned2
TIM_CounterMode_CenterAligned3

La biblioteca periférica estándar es muy vaga al respecto:

TIM_CounterMode: especifica el modo de contador que se utilizará. Este parámetro puede tener uno de los siguientes valores:

  • TIM_CounterMode_Up: Modo de conteo ascendente de TIM
  • TIM_CounterMode_Down: modo de conteo regresivo de TIM
  • TIM_CounterMode_CenterAligned1: Modo 1 alineado al centro de TIM
  • TIM_CounterMode_CenterAligned2 : TIM Center Aligned Mode2
  • TIM_CounterMode_CenterAligned3 : TIM Center Aligned Mode3

¡Gracias!

Respuestas (1)

Citas del manual de referencia :

Modo PWM 1
En contaje, el canal está activo mientras TIMx_CNT < TIMx_CCR1, de lo contrario está inactivo.
En el conteo regresivo, el canal está inactivo mientras TIMx_CNT > TIMx_CCR1 de lo contrario está activo.

Modo PWM 2
En contaje, el canal está inactivo mientras TIMx_CNT < TIMx_CCR1, de lo contrario está activo.
En el conteo regresivo, el canal está activo mientras TIMx_CNT > TIMx_CCR1 de lo contrario está inactivo.

y

Modo alineado al centro 1
El contador cuenta hacia adelante y hacia atrás alternativamente.
Los indicadores de interrupción de comparación de salida de los canales configurados en la salida (CCxS=00 en el registro TIMx_CCMRx) se establecen solo cuando el contador está en cuenta regresiva .

Modo alineado al centro 2
El contador cuenta hacia adelante y hacia atrás alternativamente.
Los indicadores de interrupción de comparación de salida de los canales configurados en la salida (CCxS=00 en el registro TIMx_CCMRx) se establecen solo cuando el contador está contando .

Modo alineado al centro 3
El contador cuenta hacia adelante y hacia atrás alternativamente.
Los indicadores de interrupción de comparación de salida de los canales configurados en la salida (CCxS=00 en el registro TIMx_CCMRx) se establecen cuando el contador cuenta hacia adelante o hacia atrás.