pwm-timer-led.c

STM32F103 "Blue Pill" (STM32F103C8T6) · 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 Blue Pill STM32F103C8T6 (Cortex-M3 @ 72 MHz, 64 Ko flash) alimentee par micro-USB ou 3,3 V externe ; programmation SWD ou bootloader serie. 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

Projet STM32CubeIDE (STM32F103C8) ou Arduino (core STM32) : programmer par SWD (ST-LINK, adaptateur DAPLink) ou par le bootloader serie (BOOT0 a 1). Attention : LED PC13 active LOW.

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