¿Qué hace TIM_OCMode en STM32F4?

2

Estoy haciendo un dispositivo antifase bloqueado para el control del motor en la placa STM32F4. Estoy configurando los 4 canales del Timer4 para que sean 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 opuesta, lo que hace 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 el PWM1 y el 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 tres modos posibles de alineación central? 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 ser uno de los siguientes valores:

  • TIM_CounterMode_Up: TIM Up Counting Mode
  • TIM_CounterMode_Down: TIM Down Counting Mode
  • TIM_CounterMode_CenterAligned1: TIM Center Aligned Mode1
  • TIM_CounterMode_CenterAligned2: TIM Center Aligned Mode2
  • TIM_CounterMode_CenterAligned3: TIM Center Aligned Mode3

¡Gracias!

    
pregunta Terraviper-5

2 respuestas

0

Cotizaciones de el manual de referencia :

Modo PWM 1
En el conteo ascendente, el canal está activo siempre que TIMx_CNT < TIMx_CCR1 más inactivo.
En el conteo descendente, el canal está inactivo siempre que TIMx_CNT > TIMx_CCR1 else active.

Modo PWM 2
En el conteo ascendente, el canal está inactivo siempre que TIMx_CNT < TIMx_CCR1 else active.
En el conteo descendente, el canal está activo siempre que TIMx_CNT > TIMx_CCR1 else inactivo.

y

Modo alineado al centro 1
El contador cuenta arriba y abajo alternativamente.
Los indicadores de interrupción de la comparación de salida de los canales configurados en la salida (CCxS = 00 en el registro TIMx_CCMRx) se configuran solo cuando el contador cuenta abajo .

Modo alineado al centro 2
El contador cuenta arriba y abajo alternativamente.
Los indicadores de interrupción de la comparación de salida de los canales configurados en la salida (CCxS = 00 en el registro TIMx_CCMRx) se configuran solo cuando el contador cuenta arriba .

Modo alineado al centro 3
El contador cuenta arriba y abajo alternativamente.
Comparación de salida los indicadores de interrupción de los canales configurados en la salida (CCxS = 00 en el registro TIMx_CCMRx) se configuran cuando el contador cuenta arriba o abajo

    
respondido por el Jeroen3
-2
/* Common settings */ 
/* PWM mode 2 = Clear on compare match */
/* PWM mode 1 = Set on compare match */
    
respondido por el chethana

Lea otras preguntas en las etiquetas