STM32 PWM Idle State no persiste

0

Estoy haciendo un controlador de medio puente que está siendo manejado por un STM32. Utiliza TIM1 y el PWM del canal 1 y su señal complementaria (la señal complementaria está conduciendo el lado bajo del puente). La configuración eléctrica es tal que el lado bajo del medio puente está activo bajo y el lado alto está activo alto. Por lo tanto, la señal baja debe ser la inversa de la señal alta.

Para configurar esto en el software, estoy configurando el OC con lo siguiente. Veo las dos señales opuestas.

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 4095;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_SET;

Esta configuración funciona como se esperaba cuando ambos canales PWM están activados.

  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);

Sin embargo, cuando quiero que solo una de las señales esté activa, el estado inactivo no es persistente. Así que cuando desactivo el canal complementario, la señal simplemente baja en lugar de mantenerse alta (su estado inactivo).

HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_1);

¿Alguien tiene alguna idea de cómo solucionar esto? Parece que esto debería ser posible. También he echado un vistazo al registro BDTR (especialmente los bits 10 y 10), así como al cerrar manualmente un canal con un registro CCER.

¡Cualquier ayuda sería genial!

Resulta que si desea deshabilitar las salidas del CC, van a High-Z. Para evitar esto, cambio entre AF_PP y OUTPUT_PP en el controlador GPIO. No es una solución optimizada pero funciona bien.

    
pregunta Meozaa

0 respuestas

Lea otras preguntas en las etiquetas