PWM en Nucleo-STM32F103RB

0

Estoy intentando que la salida PWM basada en el temporizador funcione en la placa Núcleo F103 y no puedo hacer que la MCU produzca nada. Pasé una cantidad de tiempo decente mirando los ejemplos en las preguntas relacionadas con las MCU F4 y F0, pero no pude encontrar una respuesta allí. Mi código provino originalmente de la herramienta CubeMX, pero cambié el nombre de la función PWM_MspInit para que coincida con la función que llama HAL_TIM_PWM_INIT ().

Mis funciones de inicialización del temporizador y de inialización de PWM tienen este aspecto:

/* 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 = 6400-1;
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 10000-1;
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&htim3);

    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);

    HAL_TIM_PWM_Init(&htim3);

    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);

    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 1000-1;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

    HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
    HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2);
    HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3);
    HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4);
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_ALL);
}

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) {

    GPIO_InitTypeDef GPIO_InitStruct;

    if (htim->Instance == TIM3) {
        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();

        //Configure GPIO pins : PA6 PA7
        GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        //Configure GPIO pins : PB0 PB1
        GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    }
}

Entonces mi main () se ve así:

int main(void) {

    // Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    // Configure the system clock
    SystemClock_Config();

    // Initialize all configured peripherals
    MX_TIM3_Init();

    // Infinite loop
    while (1) {

    }
}

La única parte de mi main.c que no se muestra es la función SystemClock_Config () no modificada que produjo CubeMX. A mi entender, debido al reloj del sistema de 64MHz, esto debería producir una señal PWM de 1Hz con un ciclo de trabajo del 10%. Cuando pruebo PA6 o PA7 no obtengo nada.

    
pregunta Brett K Smith

1 respuesta

1

¡Hay dos problemas obvios que puedo ver con tu código!

  1. No ha mencionado claramente cómo ha cambiado el nombre de HAL_TIM_PWM_MspInit () a HAL_TIM_PWM_Init (), pero supongo que ha cambiado directamente el nombre de la función en el archivo stm32f1xx_hal_msp.c. ¡Ese podría ser el principal error! Porque ambas son funciones diferentes y realiza diferentes inicializaciones.

HAL_TIM_PWM_MspInit () inicializa el reloj del temporizador y HAL_TIM_PWM_Init () inicializa la base de tiempo TIM PWM de acuerdo con las configuraciones dadas.

  1. Estás saltando dos cosas importantes en la configuración del temporizador. Una es la función HAL_TIM_MspPostInit () que inicializa los pines del TEMPORIZADOR GPIO y la otra es que "AutoReloadPreload" debe estar habilitado.

    htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;   HAL_TIM_MspPostInit (& htim3)

respondido por el charansai

Lea otras preguntas en las etiquetas