El siguiente ejemplo es el codigo minimal para usar la libreria ST HAL para generar una senal PWM en un pin de un microcontrolador STM32H7. En este ejemplo, usamos la placa Nucleo-H753ZI con un microcontrolador STM32H753ZI.
Usamos TIM2 para generar la senal PWM y el canal de comparacion TIM2_CH1 que se genera en el pin PA5.
pwm_output_stm32h7.c
#include <stm32h7xx_hal.h>
/**
* Inicializar salida PWM para generar pulsos de prueba.
*/
TIM_HandleTypeDef pwmOutputTimer;
TIM_OC_InitTypeDef pwmOutputConfig = {0};
void PWM_Output_Init() {
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
/**
* Parametros para medicion:
* Prescaler = 9,
* Period = 48,
* Pulse = (Period + 1) / 8
* Valores medidos (promedio sobre 5k mediciones, DSO-X 3024A):
* On time: 234.36ns
* Frecuencia: 495.34 kHz
*/
pwmOutputTimer.Instance = TIM2;
pwmOutputTimer.Init.Prescaler = 9; // Prescaler de clock TIM2 (PSC)
pwmOutputTimer.Init.CounterMode = TIM_COUNTERMODE_UP;
pwmOutputTimer.Init.Period = 48; // Valor Auto-reload (ARR) para 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");
}
// Configuracion PWM para 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)
{
// Error de configuracion PWM
SendLogMessage("PWM output Configuration Error");
}
// Configurar GPIO:
GPIO_InitTypeDef GPIO_InitStruct = {0};
// Habilitar clock GPIOA
__HAL_RCC_GPIOA_CLK_ENABLE();
// Configurar PA5 como funcion alterna para TIM2_CH1
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 en PA5
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_TIM_PWM_Start(&pwmOutputTimer, TIM_CHANNEL_1);
}La senal se ve asi para mi placa
Echa un vistazo a artículos similares por categoría:
Electrónica STM32 C/C++
Si este artículo te ha ayudado, considera invitarme a un café o hacer una donación vía PayPal para apoyar la investigación y publicación de nuevos artículos en TechOverflow
