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
Ähnliche Beiträge nach Kategorie:
Elektronik STM32 C/C++
Wenn dieser Beitrag dir geholfen hat, erwäge, mir einen Kaffee zu spendieren oder per PayPal zu spenden, um die Recherche und Veröffentlichung neuer Beiträge auf TechOverflow zu unterstützen
