PWM no STM32F103C8T6 – Controle de brilho de LED
O que é PWM?
O PWM (Pulse Width Modulation, ou Modulação por Largura de Pulso) é uma técnica utilizada em sistemas eletrônicos e embarcados para o controle da potência média entregue a uma carga por meio de sinais digitais comutados em alta frequência.
Em vez de gerar uma tensão analógica contínua, um circuito eletrônico alterna o sinal entre dois estados lógicos discretos (alto e baixo) em alta frequência, mantendo o período fixo e variando apenas a largura dos pulsos dentro de cada ciclo.
A carga não responde ao valor instantâneo do sinal, mas sim ao valor médio resultante dessa comutação, que depende da razão entre o tempo em nível lógico alto e o período total do sinal.
Essa razão é denominada duty cycle e representa o principal parâmetro de controle do PWM, sendo responsável por definir a quantidade de energia transferida para a carga em cada ciclo.
Devido a essa característica, o PWM é amplamente utilizado em aplicações como controle de brilho de LEDs, controle de velocidade de motores DC, fontes chaveadas e sistemas de controle de potência em geral.
Duty Cycle (ciclo de trabalho)
- 0% → LED apagado
- 50% → brilho médio
- 100% → brilho máximo
Montagem do circuito
- PA8 → LED verde
- LED → GND
Observação: Neste exemplo o LED foi utilizado sem resistor limitador, pois já há limitação no hardware utilizado. Em aplicações reais, recomenda-se o uso de resistor (ex: 220Ω).
Configuração no STM32CubeIDE
Passo 1 — Clock do sistema
Configure o clock para 72MHz utilizando o PLL interno.
Passo 2 — Selecionar pino PWM
Configure o pino PA8 como TIM1_CH1.
Passo 3 — Configuração do PWM
- Clock Source: Internal Clock
- Modo: PWM Generation CH1
-
Prescaler (PSC): 72
Divide o clock de 72 MHz por (PSC + 1 = 73), reduzindo a frequência para aproximadamente 986 kHz. -
Counter Period (ARR): 999
Define o período do PWM. Com isso, a frequência final do PWM será aproximadamente 986 Hz. -
Pulse (CCR): 500
Define o duty cycle (~50%).
Frequência do PWM:
F_PWM = 72MHz / ((72 + 1) * (999 + 1)) ≈ 986 Hz
Ou seja, uma frequência próxima de 1 kHz, que é o objetivo desta configuração.
O PWM é resultado de duas etapas: primeiro o prescaler reduz a frequência do clock, depois o ARR define o período do sinal, resultando na frequência final do PWM.
Entendendo os valores
- 0 → LED apagado
- 500 → brilho médio
- 999 → brilho máximo
Código completo (PWM com fade)
#include "main.h"
#include "tim.h"
#include "gpio.h"
TIM_HandleTypeDef htim1;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM1_Init();
// Inicia PWM no canal 1
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
while (1)
{
// Aumenta brilho
for (uint16_t i = 0; i < 1000; i++)
{
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, i);
HAL_Delay(5); // Ajuste para controlar velocidade
}
// Diminui brilho
for (int i = 999; i >= 0; i--)
{
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, i);
HAL_Delay(5); // Ajuste para controlar velocidade
}
}
}
Como funciona
O timer gera o sinal PWM automaticamente.
HAL_TIM_PWM_Start() inicia o PWM no pino.
__HAL_TIM_SET_COMPARE() altera o duty cycle, controlando o brilho do LED.
Conclusão
O PWM é uma técnica fundamental em sistemas eletrônicos, permitindo o controle eficiente de potência por meio de sinais digitais, sem a necessidade de geração de tensões analógicas contínuas.
Neste artigo, foi apresentado o princípio de funcionamento do PWM, incluindo a forma como a comutação de sinais digitais resulta em uma tensão média equivalente aplicada à carga, além do conceito de duty cycle como principal variável de controle.
Também foi demonstrado como o STM32F103C8T6 utiliza periféricos de temporizador (timers) para gerar sinais PWM em hardware, garantindo precisão, estabilidade e baixa carga de processamento.
Esse princípio é amplamente aplicado em sistemas reais, especialmente em controle de motores, fontes chaveadas, automação e dispositivos de potência.
Com esse conhecimento, o próximo passo é a aplicação do PWM em cargas mais complexas, como motores DC e sistemas de controle dinâmico de velocidade e potência.
Próximo passo: evoluir no STM32
O curso STM32 para Iniciantes foi desenvolvido para ajudar estudantes e profissionais a iniciarem no desenvolvimento de sistemas embarcados utilizando microcontroladores da família STM32.
Você vai aprender GPIO, ADC, PWM, UART, SPI, I2C, CAN, timers e muito mais.
👉 Acesse agora: