pwm-timer-led.c

STM32F103 "Blue Pill" (STM32F103C8T6) · 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 Blue Pill STM32F103C8T6 (Cortex-M3 @ 72 MHz, 64 KB flash) alimentada por micro-USB o 3,3 V externo; programacion SWD o bootloader serie. 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 (STM32F103C8) o Arduino (core STM32): programar por SWD (ST-LINK, adaptador DAPLink) o por el bootloader serie (BOOT0 a 1). Atencion: el LED PC13 es activo LOW.

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