pwm-timer-led.c

STM32 Nucleo-64 famille F4 — phare : Nucleo-F401RE · Fichier : pwm-timer-led.c · Langage : C · Usage : Variation de luminosité par PWM matériel (timer + canal)

Le PWM matériel d'un timer STM32 fait respirer une LED sans consommer de CPU : le canal compare la valeur au compteur et génère le créneau en autonomie. Le rapport cyclique s'exprime en pourcentage de la période configurée dans CubeMX.

Matériel requis

Une Nucleo F4 (STM32F401RE/F411RE, Cortex-M4) programmee via ST-LINK (USB), broches 3,3 V. 1 LED + résistance 330 Ω (3,3 V) sur la broche de sortie du canal PWM.

Câblage

LED + 330 Ω entre la broche du canal (choisie dans le .ioc, ex. PA0 pour TIM2_CH1) et GND. Vérifier que la broche supporte ce timer.

Fonctionnement

HAL_TIM_PWM_Start lance le canal ; __HAL_TIM_SET_COMPARE fixe la comparaison suivante. Le timer compte en matériel, la boucle ne fait que modifier la consigne tous les 10 ms.

Exécution

Creer un projet STM32CubeIDE (selection Nucleo-F401RE ou F411RE), coller le code dans main.c, configurer les peripheriques dans le .ioc, puis Executer > Run. Le terminal serie du ST-LINK affiche les printf a 115200.

Variantes

Changer la fréquence via la configuration CubeMX (ARR/PSC), ou piloter 4 canaux pour 4 LED avec un seul timer.

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);
    }
  }
}

← Retour à la fiche