Guia Completo: Controle de Servomotores STM32 com PWM

Controlar servomotores é essencial em robótica, automação e projetos que exigem movimento preciso. Este artigo combina teoria avançada, configurações práticas e exemplos de código para dominar o controle de servos usando STM32 através de PWM. Você aprenderá desde os fundamentos elétricos até técnicas de otimizaçãoGerenciamento de energia e modos de baixo consumo no STM32Gerenciamento de energia e modos de baixo consumo no STM32Aprenda a reduzir o consumo de energia com os modos STM32, garantindo eficiência e prolongando a vida útil de baterias em sistemas embarcados., passando por cálculos matemáticos, implementação em firmware e soluções para problemas comuns.

Índice🔗

Fundamentos de Servomotores e PWM🔗

Servomotores (como o SG90) operam com um sinal PWMImplementando um robô seguidor de linha com STM32Implementando um robô seguidor de linha com STM32Aprenda a criar um robô seguidor de linha com STM32. Explore eletrônica, programação, e controle PID para um projeto educacional completo. de 20 ms de período (50 Hz), onde a largura do pulso define o ângulo:

  • 1 ms: 0° (ou sentido anti-horário máximo em servos contínuos)
  • 1.5 ms: 90° (neutro)
  • 2 ms: 180° (ou sentido horário máximo)

A relação entre o duty cycleGerando sinais PWM com STM32 para controle de motoresGerando sinais PWM com STM32 para controle de motoresAprenda os fundamentos e técnicas avançadas do PWM em sistemas STM32, otimizados para controle preciso de motores DC e servos com códigos de exemplo. e o ângulo é linear:

$$ \text{duty cycle} = \frac{t_{alto}}{T} \times 100\% $$

Para \( T = 20 \, \text{ms} \), \( t_{alto} \) varia de 1 ms a 2 ms (5% a 10% do duty cycleGerando sinais PWM com STM32 para controle de motoresGerando sinais PWM com STM32 para controle de motoresAprenda os fundamentos e técnicas avançadas do PWM em sistemas STM32, otimizados para controle preciso de motores DC e servos com códigos de exemplo.).

graph LR A[Sinal PWM] --> B[Largura do Pulso] B --> C[Ângulo do Servo] C --> D[0° a 180° ou Velocidade]

Configuração de Timers e PWM no STM32🔗

Passo a Passo:

1. Seleção do 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.: Use timersUsando 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. de 16 ou 32 bits (ex: TIM2, TIM5).

2. Configuração de Clock:

$$ ARR = \frac{\text{Clock do Timer (Hz)} \times \text{Período (s)}}{\text{Prescaler + 1}} - 1 $$

3. Modo 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.: Configure o canal em PWMGerando sinais PWM com STM32 para controle de motoresGerando sinais PWM com STM32 para controle de motoresAprenda os fundamentos e técnicas avançadas do PWM em sistemas STM32, otimizados para controle preciso de motores DC e servos com códigos de exemplo. Mode 1 e ative a saída no pino desejado (ex: PA0 para TIM2_CH1).

Exemplos de Código:

STM32F4Implementando um sistema de alarme com sensores de movimento e STM32Implementando um sistema de alarme com sensores de movimento e STM32Aprenda a criar um sistema de alarme robusto com STM32, sensores de movimento, técnicas de debounce e otimização de energia. Confira o tutorial completo! (84 MHz) com TIM2:

TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 84 - 1; // Divide para 1 MHz
htim2.Init.Period = 20000 - 1; // 20 ms (50 Hz)
HAL_TIM_PWM_Init(&htim2);
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1500; // Posição inicial: 1.5 ms (90°)
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

STM32F1 (72 MHz) com TIM1:

TIM_HandleTypeDef htim1;
htim1.Instance = TIM1;
htim1.Init.Prescaler = 72 - 1; // Clock de 1 MHz
htim1.Init.Period = 20000 - 1; // 20 ms
HAL_TIM_PWM_Init(&htim1);
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.Pulse = 1500; // 90°
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);

Cálculos Matemáticos para Controle de Ângulo🔗

A conversão entre ângulo e valor do registrador CCR é dada por:

$$ \text{CCR} = \left( \frac{\text{Ângulo} \times (\text{Pulso Máximo} - \text{Pulso Mínimo})}{180°} + \text{Pulso Mínimo} \right) \times \frac{\text{Frequência do Timer (Hz)}}{1000} $$

Exemplo para 90° (1.5 ms):

CCR = (1.5 ms / 20 ms) * 20000 = 1500

Implementação Prática: Circuito e Código🔗

Diagrama do Circuito:

STM32 GPIO (PA0) ---- Sinal PWM ----> Servo (Linha Laranja)
STM32 GND ----------- GND ----------> Servo (Linha Marrom)
STM32 5V ------------ VCC ----------> Servo (Linha Vermelha)

Função para Controle de Ângulo:

void Set_Servo_Angle(TIM_HandleTypeDef *htim, uint32_t Channel, float angle) {
  if(angle < 0) angle = 0;
  if(angle > 180) angle = 180;
  // Conversão para pulsos (1ms a 2ms = 500 a 2500 us)
  uint32_t pulse = (uint32_t)(500 + (angle / 180.0) * 2000);
  __HAL_TIM_SET_COMPARE(htim, Channel, pulse);
}
// Uso:
Set_Servo_Angle(&htim2, TIM_CHANNEL_1, 45.0); // Move para 45°

Atualização Suave com Interpolação:

for(float pos = 0; pos <= 180; pos += 0.5){
  Set_Servo_Angle(&htim2, TIM_CHANNEL_1, pos);
  HAL_Delay(10); // 10ms por passo
}

Otimização e Solução de Problemas🔗

Problemas Comuns e Soluções:

1. Jitter no Servo:

2. Precisão Insuficiente:

Tabela de Resolução vs. Velocidade do Clock:

Timer ResolutionPrescalerARRStep Size (µs)
16 bits84200001.0
32 bits0655350.76

Dicas Avançadas:

Exemplos de Aplicações🔗

  • Robótica: Controle de juntas em braços robóticos.
  • Automação Residencial: Portas automatizadas com ajuste de posição.
  • Instrumentação: Ajuste fino em equipamentos ópticos.
  • Projetos DIY: Câmeras de vigilância com movimento controlado.

Considerações Finais🔗

O controle de servomotores com STM32 via PWM é uma habilidade fundamental para projetos embarcados. Dominar a configuração de timers, cálculos precisos e técnicas de otimizaçãoGerenciamento de energia e modos de baixo consumo no STM32Gerenciamento de energia e modos de baixo consumo no STM32Aprenda a reduzir o consumo de energia com os modos STM32, garantindo eficiência e prolongando a vida útil de baterias em sistemas embarcados. permite criar sistemas robustos e responsivos. Experimente diferentes configurações de hardware e firmware, utilize as dicas de depuração e explore aplicações inovadoras para aproveitar todo o potencial dos servomotores em seus projetos.

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