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,