Cómo configurar STM32F4s TIM1 y 8 para PWM

2

He configurado el temporizador 4 para PWM con el siguiente código y el LED conectado al pin configurado. Está funcionando.

TIM_TimeBaseInitTypeDef TIM_BaseStruct;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);    // Enable bus clock

TIM_BaseStruct.TIM_Prescaler = 0;   // Set prescaler (frequency divider)
TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_CenterAligned1;    // Set counting mode (up, down, center-aligned) to center aligned for better motor control
TIM_BaseStruct.TIM_Period = 4000; // Set timer period (timer reset/change direction value)
TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_BaseStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM4, &TIM_BaseStruct);    // Initialize timer with chosen settings
TIM_Cmd(TIM4, ENABLE);  // Start timer

GPIO_InitTypeDef GPIO_InitStruct;

/* Clock for GPIOD */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

/* Alternating functions for pins */
GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);

/* Set pins */
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;

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;
TIM_OCStruct.TIM_OCIdleState = TIM_OCIdleState_Reset;

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

pero cuando configuré TIM 1 y conecté el LED a su pin, no sucedió nada (lo probé por separado, activándolo como salida para asegurarme de que conecté el LED al pin derecho y se encendió)

TIM_TimeBaseInitTypeDef TIM_BaseStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);    // Enable bus clock

TIM_BaseStruct.TIM_Prescaler = 1;   // Set prescaler (frequency divider)
TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_CenterAligned1;    // Set counting mode (up, down, center-aligned) to center aligned for better motor control
TIM_BaseStruct.TIM_Period = 4000; // Set timer period (timer reset/change direction value)
TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_BaseStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_BaseStruct);    // Initialize timer with chosen settings
TIM_Cmd(TIM1, ENABLE);  // Start timer

GPIO_InitTypeDef GPIO_InitStruct;

/* Clock for GPIOE */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

/* Alternating functions for pins */
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_TIM1);

/* Set pins */
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
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(GPIOE, &GPIO_InitStruct);

TIM_OCInitTypeDef TIM_OCStruct;

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

TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCStruct.TIM_Pulse = 1999;
TIM_OC1Init(TIM1, &TIM_OCStruct);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

¿Hay algo diferente que deba hacer con los temporizadores avanzados para hacer que funcionen con pwm? También logré el éxito con TIM3 y TIM12 (que son temporizadores de propósito general), pero no con TIM8 (que también es un temporizador avanzado).

    
pregunta Terraviper-5

1 respuesta

3

Con la ayuda de la gente en el foro STM32, descubrí que faltaba el siguiente código adicional para hacer que el temporizador avanzado funcione de la misma manera que el temporizador de propósito general:

TIM_BDTRInitTypeDef TIM_BDTRInitStruct;
TIM_BDTRStructInit(&TIM_BDTRInitStruct);
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStruct);
TIM_CCPreloadControl(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);

Nota: los canales deben inicializarse antes de llamar al código para obtener funciones avanzadas. Si intenta inicializar los canales después de eso, puede haber problemas (mi LED conectado al canal 3, que se inicializó después de las funciones avanzadas, siempre estaba ENCENDIDO y no respondió a los cambios de pwm, curiosamente el canal 4 estaba funcionando pero también se inicializó después de las funciones avanzadas ).

    
respondido por el Terraviper-5

Lea otras preguntas en las etiquetas

Comentarios Recientes

solo mensajes: use señales de control PMU solo PWM instaladas en dispositivos AM o como p. Ej. Controles controlados por voltaje (por ejemplo, una señal de control de voltaje) y almacenan los estados de escritura ALTA y BAJA al mismo tiempo que reciben estos eventos de escritura por los sensores seriales. Solo PWM significa que el temporizador está activo cuando el voltaje sube a un cierto nivel. El Voltaje establecido predeterminado = 0 (no existe ADC en mi 1W con el software Arduino Arduino) se puede reemplazar... Lees verder