STM32H7 minimales PWM-Ausgabe-Beispiel mit ST HAL

Das folgende Beispiel ist der minimale Code, um die ST HAL-Bibliothek zu verwenden, um ein PWM-Signal an einem Pin eines STM32H7-Mikrocontrollers auszugeben. In diesem Beispiel verwenden wir das Nucleo-H753ZI-Board mit einem STM32H753ZI-Mikrocontroller.

Wir verwenden TIM2, um das PWM-Signal zu generieren, und den Compare-Kanal TIM2_CH1, der am Pin PA5 ausgegeben wird.

pwm_output_stm32h7.c
#include <stm32h7xx_hal.h>

/**
 * Initialisiert die PWM-Ausgabe zur Generierung von Testpulsen.
 */
TIM_HandleTypeDef pwmOutputTimer;
TIM_OC_InitTypeDef pwmOutputConfig = {0};

void PWM_Output_Init() {
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_TIM2_CLK_ENABLE();

    /**
     * Parameter für die Messung:
     *   Prescaler = 9,
     *   Period = 48,
     *   Pulse = (Period + 1) / 8
     * Gemessene Werte (Mittelwert über 5k Messungen, DSO-X 3024A):
     *   On time: 234.36ns
     *   Frequency: 495.34 kHz
     */

    pwmOutputTimer.Instance = TIM2;
    pwmOutputTimer.Init.Prescaler = 9;  // TIM2-Takt-Prescaler (PSC)
    pwmOutputTimer.Init.CounterMode = TIM_COUNTERMODE_UP;
    pwmOutputTimer.Init.Period = 48;    // Auto-Reload-Wert (ARR) für 10 kHz
    pwmOutputTimer.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2;
    pwmOutputTimer.Init.RepetitionCounter = 0;
    if (HAL_TIM_PWM_Init(&pwmOutputTimer) != HAL_OK)
    {
        SendLogMessage("PWM output Timer Initialization Error");
    }

    // PWM-Konfiguration für TIM2 Channel 1
    pwmOutputConfig.OCMode = TIM_OCMODE_PWM1;
    pwmOutputConfig.Pulse = (pwmOutputTimer.Init.Period + 1) / 8; // 50% Duty Cycle
    pwmOutputConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
    pwmOutputConfig.OCFastMode = TIM_OCFAST_DISABLE;
    if (HAL_TIM_PWM_ConfigChannel(&pwmOutputTimer, &pwmOutputConfig, TIM_CHANNEL_1) != HAL_OK)
    {
        // PWM-Konfigurationsfehler
        SendLogMessage("PWM output Configuration Error");
    }

    // GPIO konfigurieren:
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // GPIOA-Takt aktivieren
    __HAL_RCC_GPIOA_CLK_ENABLE();

    // PA5 als Alternate Function für TIM2_CH1 konfigurieren
    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;  // TIM2 AF an PA5
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    HAL_TIM_PWM_Start(&pwmOutputTimer, TIM_CHANNEL_1);
}

Das Signal sieht für mein Board so aus

STM32H7 PWM-Signal-Messung


Ähnliche Beiträge nach Kategorie: Elektronik STM32 C/C++