Guia Completo de PWM em STM32 para Controle de Motores

Os sinais PWMEntendendo os temporizadores no STM32Entendendo os temporizadores no STM32Descubra como configurar temporizadores STM32 para gerar PWM, medir intervalos e capturar eventos com exemplos práticos e dicas de troubleshooting. (Pulse Width Modulation) são a espinha dorsal do controle de motores em sistemas embarcados. Este guia completo explora desde os fundamentos teóricos até técnicas avançadas de implementação em microcontroladores STM32Famílias de microcontroladores STM32: Uma visão geralFamílias de microcontroladores STM32: Uma visão geralProfundo mergulho nas famílias STM32, explorando arquitetura, aplicações e desempenho. Descubra dicas e casos práticos para projetos embarcados., combinando configurações via HAL, manipulação direta de registradores e otimizações para cenários reais.

Índice Analítico🔗

1. Princípios do PWMEntendendo os temporizadores no STM32Entendendo os temporizadores no STM32Descubra como configurar temporizadores STM32 para gerar PWM, medir intervalos e capturar eventos com exemplos práticos e dicas de troubleshooting. e sua relevância para motores

2. Arquitetura dos temporizadoresUsando temporizadores para criar delays precisosUsando temporizadores para criar delays precisosDescubra como configurar temporizadores STM32 para criar delays precisos com polling, interrupções e DMA, otimizando energia em sistemas embarcados. do STM32 e modos PWM

3. Configuração prática: HALUsando o DAC no STM32 para gerar sinais analógicosUsando o DAC no STM32 para gerar sinais analógicosAprenda a configurar e calibrar o DAC do STM32 para gerar sinais analógicos precisos. Descubra técnicas avançadas, exemplos práticos e dicas de otimização., registradores e cálculo de parâmetros

4. Controle de motores DC e servos: Exemplos com código integrado

5. Técnicas avançadas: Dead time, complementary outputs e resolução dinâmica

6. Troubleshooting: Problemas comuns e soluções

7. Boas práticas e considerações finais

Princípios do PWM e sua relevância para motores🔗

O PWMEntendendo os temporizadores no STM32Entendendo os temporizadores no STM32Descubra como configurar temporizadores STM32 para gerar PWM, medir intervalos e capturar eventos com exemplos práticos e dicas de troubleshooting. modula a largura de pulsos de um sinal digital para controlar a potência média entregue a um motor. A relação entre o tempo ativo (Ton) e o período total (T) define o duty cycle:

$$ \text{Duty Cycle} = \frac{Ton}{T} \times 100\% $$

Aplicação prática:

Temporizadores do STM32: Arquitetura e modos PWM🔗

Os STM32 possuem temporizadoresUsando temporizadores para criar delays precisosUsando temporizadores para criar delays precisosDescubra como configurar temporizadores STM32 para criar delays precisos com polling, interrupções e DMA, otimizando energia em sistemas embarcados. dedicados (TIM1, TIM2, etc.) com recursos avançados:

Modos de Operação

graph TD A[TIMx] --> B[Prescaler] B --> C[Contador] C --> D{Comparação com CCRx} D -->|PWM Mode 1| E[Sinal Ativo] D -->|PWM Mode 2| F[Sinal Inativo]

Registradores Críticos

Configuração prática do PWM usando HAL e registradores🔗

Via STM32CubeIDE (HAL):

1. Selecione o timerUsando temporizadores para criar delays precisosUsando temporizadores para criar delays precisosDescubra como configurar temporizadores STM32 para criar delays precisos com polling, interrupções e DMA, otimizando energia em sistemas embarcados. (ex: TIM1) e ative o canal PWM.

2. Calcule PSC e ARRUsando temporizadores para criar delays precisosUsando temporizadores para criar delays precisosDescubra como configurar temporizadores STM32 para criar delays precisos com polling, interrupções e DMA, otimizando energia em sistemas embarcados. para a frequência desejada:

$$ f_{PWM} = \frac{f_{clock}}{(Prescaler + 1) \times (ARR + 1)} $$

3. Ajuste CCRx para o duty cycle inicial.

Exemplo de código (HALUsando o DAC no STM32 para gerar sinais analógicosUsando o DAC no STM32 para gerar sinais analógicosAprenda a configurar e calibrar o DAC do STM32 para gerar sinais analógicos precisos. Descubra técnicas avançadas, exemplos práticos e dicas de otimização.):

// Inicialização do PWM
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
// Ajuste dinâmico do duty cycle para 60%
uint16_t pulse = (uint16_t)(0.6 * (htim1.Init.Period + 1));
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pulse);

Via Registradores (Otimizado):

// Configuração direta (TIM1, Canal 1, 25% duty cycle)
TIM1->PSC = 83;          // Prescaler = 83 (clock de 1 MHz para f_clk = 84 MHz)
TIM1->ARR = 999;         // Período = 1000 ciclos (fPWM = 1 kHz)
TIM1->CCR1 = 250;        // Duty cycle = 250/1000 = 25%
TIM1->CR1 |= TIM_CR1_CEN; // Habilita o timer

Controle de motores DC e servos: Exemplos com código🔗

Motor DC (Controle de Velocidade):

// Variável ajustável via sistema (0% a 100%)
float velocidade = 75.0;
uint16_t pulse = (uint16_t)((velocidade / 100.0) * (htim1.Init.Period + 1));
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pulse);

Servomotor (Controle Angular):

// Configura TIM2 para 50 Hz (Período = 20 ms)
htim2.Init.Prescaler = 799;    // Clock de 80 MHz → 80MHz / 800 = 100 kHz
htim2.Init.Period = 19999;     // 100 kHz / 20000 = 50 Hz
// Posição 180 graus (2 ms de pulso)
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 2000); // 2ms / 20ms = 10% duty cycle

Técnicas avançadas: Dead time e complementary outputs🔗

Para aplicações críticas como pontes H em motores bidirecionais:

1. Dead Time Insertion:

Adiciona um atraso entre a transição de estados para evitar curto-circuitos.

TIM1->BDTR |= (0x0F << TIM_BDTR_DTG_Pos); // Dead time = 15 ciclos de clock

2. Complementary Outputs:

Gera sinais invertidos para controlar transistores high-side e low-side.

// Ativa saídas complementares no TIM1 (STM32CubeIDE)
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);

3. Resolução Dinâmica:

Ajuste de ARRUsando temporizadores para criar delays precisosUsando temporizadores para criar delays precisosDescubra como configurar temporizadores STM32 para criar delays precisos com polling, interrupções e DMA, otimizando energia em sistemas embarcados. em tempo real para priorizar resolução ou frequência.

Troubleshooting: Problemas comuns e soluções🔗

ProblemaCausa ProvávelSolução
Sem sinal PWMClock não habilitadoVerifique RCC_APB1ENR/APB2ENR
Frequência incorretaPrescaler/ARR mal calculadosRecalcule com base no clock
Duty cycle não alteraCCRx não atualizadoUse __HAL_TIM_SET_COMPARE()
Ruído excessivoFrequência muito baixaAumente para >20 kHz

Dica: Use um osciloscópio para validar o sinal no pino do motor e verifique os registradores via debuggerFerramentas de desenvolvimento para STM32: IDEs, compiladores e debuggersFerramentas de desenvolvimento para STM32: IDEs, compiladores e debuggersAprenda a selecionar e integrar IDEs, compiladores e debuggers para STM32 com dicas e exemplos claros, otimizando seu desenvolvimento..

Boas práticas e considerações finais🔗

1. Testes Práticos:

2. Documentação:

3. Otimizações:

Exemplo Avançado (Controle PID com PWMEntendendo os temporizadores no STM32Entendendo os temporizadores no STM32Descubra como configurar temporizadores STM32 para gerar PWM, medir intervalos e capturar eventos com exemplos práticos e dicas de troubleshooting.):

// Integre um algoritmo PID para ajuste automático do duty cycle
float erro = setpoint - velocidade_medida;
float pid_output = Kp * erro + Ki * integral + Kd * derivada;
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, (uint16_t)(pid_output * ARR));

Com domínio dessas técnicas, você estará preparado para implementar sistemas de controle de motores robustos e eficientes, aproveitando todo o potencial dos microcontroladores STM32Famílias de microcontroladores STM32: Uma visão geralFamílias de microcontroladores STM32: Uma visão geralProfundo mergulho nas famílias STM32, explorando arquitetura, aplicações e desempenho. Descubra dicas e casos práticos para projetos embarcados..

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados