He configurado mi temporizador TIMM STM32F407VG (STM32F4Discovery) usando el siguiente código:
void TIM4_Init(void)
{
// Configure TIM4 for PWM
hTim4.Instance = TIM4;
hTim4.Init.Prescaler= 42000 - 1; // (84MHz / 42000 = 2KHz)
hTim4.Init.CounterMode = TIM_COUNTERMODE_UP;
hTim4.Init.Period = 2000 - 1; // Period = 2000 -> 1 second
hTim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&hTim4);
// Configure channels 1-4 for TIM4,
// each channel is mapped to a GPIO pin
TIM_OC_InitTypeDef oc_config;
oc_config.OCMode = TIM_OCMODE_PWM1;
oc_config.Pulse = 1000;
oc_config.OCNIdleState = TIM_OCNIDLESTATE_RESET;
oc_config.OCIdleState = TIM_OCIDLESTATE_RESET;
oc_config.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&hTim4, &oc_config, TIM_CHANNEL_1);
HAL_TIM_PWM_ConfigChannel(&hTim4, &oc_config, TIM_CHANNEL_3);
// Flip the OC polarity for channels 2 and 4
oc_config.OCPolarity = TIM_OCPOLARITY_LOW;
HAL_TIM_PWM_ConfigChannel(&hTim4, &oc_config, TIM_CHANNEL_2);
HAL_TIM_PWM_ConfigChannel(&hTim4, &oc_config, TIM_CHANNEL_4);
// I want to shift channel 1-4 90 degrees apart...
HAL_TIM_PWM_Start(&hTim4, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&hTim4, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&hTim4, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&hTim4, TIM_CHANNEL_4);
}
Cada canal se asigna a un pin GPIO, con la intención de conducir un motor paso a paso.
Me gustaría generar una señal, con un ciclo de trabajo de 25% cada una, donde las fases se han desplazado 90 grados.
¿Cómo hago para cambiar las fases en los 4 canales?
¿Debo configurar otro temporizador y usarlo como una interrupción sobre la cual puedo llamar a HAL_TIM_PWM_Start () para cada canal en el tiempo apropiado?