pwm-timer-led.c

STM32H7 Nucleo-144 (modèle phare : NUCLEO-H743ZI) · Archivo : pwm-timer-led.c · Lenguaje : C · Uso : Variation de luminosité par PWM matériel (timer + canal)

El PWM hardware de un temporizador STM32 hace respirar un LED sin consumir CPU: el canal compara con el contador y genera la señal en autonomía. El ciclo de trabajo se expresa en porcentaje del periodo configurado en CubeMX.

Hardware

Una Nucleo H7 (STM32H743ZI, Cortex-M7 @ 480 MHz) programada via ST-LINK (USB), pines de 3,3 V. 1 LED + resistencia de 330 Ω (3,3 V) en el pin de salida del canal PWM.

Cableado

LED + 330 Ω entre el pin del canal (elegido en el .ioc, p. ej. PA0 para TIM2_CH1) y GND. Comprueba que el pin soporta ese temporizador.

Funcionamiento

HAL_TIM_PWM_Start lanza el canal; __HAL_TIM_SET_COMPARE fija el siguiente valor de comparación. El temporizador cuenta en hardware; el bucle solo actualiza la consigna cada 10 ms.

Ejecución

Proyecto STM32CubeIDE basado en la Nucleo-H743ZI: el codigo va en main.c, los perifericos se declaran en el .ioc y Run via ST-LINK. El monitor serie del ST-LINK muestra los printf a 115200.

Variantes

Cambia la frecuencia con la configuración CubeMX (ARR/PSC), o controla 4 canales para 4 LED con un solo temporizador.

pwm-timer-led.c

// PWM sur TIMx/CHx genere par CubeMX : respiration de LED.
#include "main.h"

extern TIM_HandleTypeDef htim2; // PWM 20 kHz, periode = ARR

#define PWM_CANAL TIM_CHANNEL_1

uint32_t t0 = 0;
int16_t niveau = 0;
int8_t pas = 1;

int main(void) {
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM2_Init();   // broche en mode PWM dans CubeMX + LED externe

  HAL_TIM_PWM_Start(&htim2, PWM_CANAL);
  uint32_t periode = __HAL_TIM_GET_AUTORELOAD(&htim2);

  for (;;) {
    if (HAL_GetTick() - t0 >= 10) {
      t0 = HAL_GetTick();
      niveau += pas;
      if (niveau >= 100) pas = -1;
      if (niveau <= 0)   pas = 1;
      // Rapport cyclique 0..100 % de la periode du timer.
      __HAL_TIM_SET_COMPARE(&htim2, PWM_CANAL,
                            periode * niveau / 100);
    }
  }
}

← Volver a la ficha