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!