La frecuencia de salida de STM32 PWM está desactivada

0

Usando una placa STM32F429I-DISCO. SYSCLK está configurado a 180 MHz. Verifiqué el valor del pin de salida MCO2, y es correcto. Configuración del canal 1 de GPIO_AF3_TIM9, y necesita una salida de 12.288 MHz y un ciclo de trabajo del 50%. Valores de configuración calculados como:

  const uint32_t TIMF =  180000000;
  const uint32_t TFOUT =  12288000;
  uint16_t ARR = (TIMF / TFOUT) - 1;
  uint16_t uhPrescalerValue =  ((SystemCoreClock) / TIMF) - 1;
  uint16_t pulse = ARR/2 + 1;

Los resultados son prescalar = 0, ARR = 13, pulso = 7.

Aquí está el código de configuración:

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed =  GPIO_SPEED_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF3_TIM9;
  GPIO_InitStruct.Pin = GPIO_PIN_CHANNEL1;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct)

  TimHandle.Instance = TIMx;
  TimHandle.Init.Prescaler =  uhPrescalerValue;
  TimHandle.Init.Period = ARR;
  TimHandle.Init.ClockDivision = 0;
  TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
  if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
  {
    Error_Handler();
  }

  sConfig.OCMode = TIM_OCMODE_PWM1;
  sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfig.OCFastMode = TIM_OCFAST_DISABLE;
  sConfig.Pulse = pulse;
  if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }

La salida en el contador de alcance muestra la frecuencia PWM como 12.8582 MHz. El ciclo de trabajo es correcto. ¿Dónde me he equivocado al derivar los parámetros?

    
pregunta OldProgrammer

3 respuestas

4

No puede producir 12.288 MHz por división entera de una fuente de 180 MHz.

Lo más cerca que estarías sería dividir por 14, lo que produciría los 12.857 y algunos decimales siguientes, lo que probablemente esté dentro del error de medición de lo que crees que obtuviste.

Quizás puedas ajustar tu objetivo para usar eso. O quizás puede cambiar la frecuencia del cristal de origen a algo que, cuando se multiplica por el STM32 PLL y se divide hacia abajo, producirá su objetivo de manera más precisa. Todavía hay formas más complicadas de hacer esto: sintetizador fraccional de N, etc.

Al final, las soluciones para convertir una frecuencia en otra tienen varias consecuencias de potencia, costo, precisión y ruido de fase. Para elegir uno, deberá considerar sus requisitos específicos en detalle.

    
respondido por el Chris Stratton
0
  

como 12.8582 MHz

180Mhz / (13 + 1) =?

Tienes exactamente lo que tu código debería haber producido.

Para obtener un 12.288Mhz, puede ser capaz de tramar. O use un generador de reloj de referencia si el chip tiene uno.

    
respondido por el dannyf
0

Si es aceptable, puede modificar la frecuencia del reloj del sistema ajustando el PLL para lograr un resultado más cercano y averiguar qué puede hacer con eso.

Las mejores opciones son, comenzando por las mejores:

  • Reloj del sistema: 86 MHz , Prescaler: 7 , \ $ \ frac {86 \, MHz} {6 + 1} = 12.2857 \, MHz \ $
  • Reloj del sistema: 172 MHz , Prescaler: 14 , \ $ \ frac {172 \, MHz} {13 + 1} = 12.2857 \, MHz \ $

En realidad, estos son casi los mismos.

  • Reloj del sistema: 123 MHz , Prescaler: 10 , \ $ \ frac {123 \, MHz} {9 + 1} = 12.3 \, MHz \ $
respondido por el Bence Kaulics

Lea otras preguntas en las etiquetas