STM32L1 Discovery Kit 5MHz PWM Generation

2

He estado usando el STM32L1 Discovery Kit con el STM32L152RCT6 MCU.

Un proyecto en el que estoy trabajando requiere que emita dos señales PWM. Una de ellas es una onda cuadrada de 100 KHz y la otra es una onda cuadrada de 5 MHz.

He conseguido que la onda de 100KHz funcione correctamente, sin embargo, no puedo generar un pwm de 5MHz desde mi placa. Estoy usando los temporizadores 4 y 11 actualmente para generar estas dos señales y el código es el siguiente:

/* TIM3 init function */
static void MX_TIM3_Init(void)
{
    TIM_ClockConfigTypeDef sClockSourceConfig;
    TIM_MasterConfigTypeDef sMasterConfig;
    TIM_OC_InitTypeDef sConfigOC;
    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 2;
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 2;
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 1;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    HAL_TIM_MspPostInit(&htim3);
}

/* TIM4 init function */
static void MX_TIM4_Init(void)
{
    TIM_ClockConfigTypeDef sClockSourceConfig;
    TIM_MasterConfigTypeDef sMasterConfig;
    TIM_OC_InitTypeDef sConfigOC;
    htim4.Instance = TIM4;
    htim4.Init.Prescaler = 106;
    htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim4.Init.Period = 2;
    htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 1;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    HAL_TIM_MspPostInit(&htim4);
}

/* TIM11 init function */
static void MX_TIM11_Init(void)
{
    TIM_ClockConfigTypeDef sClockSourceConfig;
    TIM_OC_InitTypeDef sConfigOC;
    htim11.Instance = TIM11;
    htim11.Init.Prescaler = 2;
    htim11.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim11.Init.Period = 2;
    htim11.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    if (HAL_TIM_Base_Init(&htim11) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    if (HAL_TIM_ConfigClockSource(&htim11, &sClockSourceConfig) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    if (HAL_TIM_PWM_Init(&htim11) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 1;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    if (HAL_TIM_PWM_ConfigChannel(&htim11, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    HAL_TIM_MspPostInit(&htim11);
}

Cuando ejecuto mi tarjeta con este código, encuentro que el TIM4 emite correctamente una onda cuadrada de 100 KHz con un pico de voltaje pico de 3V. El canal TIM11 emite una onda cuadrada sucia con un voltaje de pico a pico muy bajo y solo aprox. Una señal de 3.5MHz. Si trato de reducir el valor del prescaler a 1 para aumentar aún más la frecuencia, pierdo la forma de onda completamente. Los resultados del oscilliscope se muestran a continuación:

TIM4 -

TIM11-

CuantomásaumenteelvalordelprescalerenelcanalTIM11,máslimpiaseconviertelaondayaumentalatensiónpicoapicohastaquealcanzalos3Vconunprescalerdeaprox.10a15.

CualquierayudaparalograrqueelTIM11pwmseauncuadradolimpioa5MHzcon3Vpicoapicoseríamuyapreciada.

¡Gracias!

ACTUALIZACIÓN1

¡Laconfiguraciónaltafuncionó!

Ahoraestoyrecibiendolaondade5.3MHz.sinembargo,ahoratambiénestoyrecibiendounacantidadsignificativaderuidoenamboscanalesdetemporizador: Acercándonosmás:

ACTUALIZACIÓN 2

Creo que puedo filtrar el ruido restante con un filtro RC, ¡pero si alguien sabe de una manera de hacer esto en la MCU sería genial!

    
pregunta afranca88

0 respuestas

Lea otras preguntas en las etiquetas