Cambie dinámicamente la frecuencia PWM con interrupción con STM32

1

Estoy usando un stm32f4 para controlar un motor paso a paso.

No estoy seguro si necesito el modo PWM o el modo OC o el modo OnePulse. Puedo generar una onda PWM de frecuencia fija, pero como necesito una aceleración / desaceleración particular, necesito variar la frecuencia de la onda con una rampa.

Algo así como: - 1 pulso a 745 hz - 1 pulso a 1867 hz - 1 pulso a 2459 hz - 1 pulso a ... - 1 pulso a ... - N pulsos a ... (velocidad constante)

Ahora mismo en la devolución de llamada HAL_TIM_PWM_PulseFinishedCallback estoy emitiendo nuevos valores TIMx- > ARR y TIMx- > CCR1 basados en una lógica dada.

Aquí está mi código

void MX_TIM9_Init(void)
{
TIM_OC_InitTypeDef sConfigOC;

htim9.Instance = TIM9;
htim9.Init.Prescaler = PSC; // Get clock to <freq> Hz
htim9.Init.CounterMode = TIM_COUNTERMODE_UP;
htim9.Init.Period = 1582; // useless since it is varying
htim9.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim9);
HAL_TIM_PWM_Init(&htim9);

sConfigOC.OCMode = TIM_OCMODE_PWM2;
sConfigOC.Pulse = htim9.Init.Period / 2; //useless but always 50% of CCR1
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
HAL_TIM_PWM_ConfigChannel(&htim9, &sConfigOC, TIM_CHANNEL_1);

}

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef* htim){
if (htim->Instance == TIM9){
    // logic
    TIM9->ARR = v;
    TIM9->CCR1 = v/2;
}
}

int main(void) {
//other
MX_TIM9_Init();

//logic and if needed
HAL_TIM_PWM_Start_IT(&m->htim, TIM_CHANNEL_1);
}

Lo que estoy notando es que el tren de ondas no tiene la forma perfecta, como si el Evento de Actualización que actualiza el registro de sombra ocurra esporádicamente. Si estoy esperando 1 pulso con 500 hz y un segundo de 700 hz, eso no sucede. 7Cleary se genera correctamente una onda de frecuencia constante a 500Hz y 700Hz. Intenté CONFIGURAR RESTAURAR una salida para verificar en qué punto se llama la interrupción.

Cuando falla, parece que se llama a una interrupción cuando el PWM sigue siendo "alto"

¿Es la PWM la forma correcta de hacerlo o debo usar el modo OC o OnePulse?

Saludos,

    
pregunta user217354

1 respuesta

1

El problema estaba relacionado con los registros de precarga. Como se menciona en es.DM00236305.pdf, se necesitan para tener una sincronización perfecta entre UEV y registrar la carga correcta

    
respondido por el user217354

Lea otras preguntas en las etiquetas