STM32: Configuração do Modo Encoder para Controle Preciso

O modo encoder nos 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 é uma funcionalidade essencial para sistemas que demandam controle preciso de posição e velocidade de motores, como robótica, CNC e automação industrial. Este modo permite interpretar sinais de encoders quadratura (A e B) e atualizar automaticamente um contador com base na direção e velocidade do motor, eliminando a necessidade de circuitos externos complexos. Neste artigo, exploraremos a teoria, configuração prática, exemplos de código detalhados, aplicações reais e estratégias para otimização e depuração.

Tabela de Conteúdo🔗

Fundamentos do Encoder Quadratura e Funcionamento do Modo Encoder🔗

Um encoder quadratura gera dois sinais digitais defasados em 90° (fase A e fase B). A direção é determinada pela ordem dos pulsos, enquanto a velocidade é calculada pela frequência.

Funcionamento básico:

  • Rotação horária: Fase A lidera fase B.
  • Rotação anti-horária: Fase B lidera fase A.
graph TD A[Encoder Rotativo] --> B[Sinal Canal A] A --> C[Sinal Canal B] B --> D[Temporizador STM32 em Modo Encoder] C --> D D --> E[Contador de Pulsos]

A posição angular (θ) é calculada por:

$$ θ = \frac{2\pi \cdot N}{PPR \times M} $$

Onde:

A resolução depende do hardware e da configuraçã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.. Por exemplo, com \( M = 4 \), a resolução quadruplica.

Configuração do Temporizador em Modo Encoder🔗

Seleção do Timer e Pinos

GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

Configuração do Timer

Ajuste prescaler, período, filtros e modo de contagemEntendendo 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.:

TIM_Encoder_InitTypeDef encoderConfig = {0};
encoderConfig.EncoderMode = TIM_ENCODERMODE_TI12; // Ambos os canais
encoderConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
encoderConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
encoderConfig.IC1Filter = 0x0F; // Filtro de 8 pulsos para redução de ruído
encoderConfig.IC2Filter = 0x0F;
htim3.Init.Prescaler = 0;       // Sem divisão de clock
htim3.Init.Period = 0xFFFF;     // Contador de 16 bits
HAL_TIM_Encoder_Init(&htim3, &encoderConfig);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);

Registros Relevantes

  • SMCR: Define o modo de encoder.
  • CCMR1/CCMR2: Configura polaridade e filtros.
  • CNT: Armazena o valor atual do contador.

Leitura e Interpretação dos Dados🔗

Leitura do Contador

int32_t position = (int32_t)TIM3->CNT; // Lê o valor atual

Cálculo de Velocidade (RPM)

$$ \text{Velocidade (RPM)} = \frac{\Delta \text{Contador} \times 60}{PPR \times M \times \text{Período de Amostragem (s)}} $$

Exemplo de implementação:

uint32_t last_count = 0;
float rpm = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
  if (htim->Instance == TIM3) {
    uint32_t current_count = TIM3->CNT;
    int32_t delta = current_count - last_count;
    rpm = (delta * 60.0) / (PPR * 4 * 0.1); // M=4, período=0.1s
    last_count = current_count;
  }
}

Exemplo Prático com Código🔗

Configuração completa do TIM3 em modo encoder com 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.:

#include "stm32f4xx_hal.h"
TIM_HandleTypeDef htim3;
void MX_TIM3_Encoder_Init(void) {
  TIM_Encoder_InitTypeDef sConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.Period = 0xFFFF;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC1Filter = 10; // Filtro para debounce
  sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC2Filter = 10;
  HAL_TIM_Encoder_Init(&htim3, &sConfig);
  HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
}
int main(void) {
  HAL_Init();
  MX_TIM3_Encoder_Init();
  while (1) {
    int32_t encoder_count = __HAL_TIM_GET_COUNTER(&htim3);
    // Conversão para ângulo ou velocidade aqui
  }
}

Aplicações Práticas: Controle de Motores🔗

Controle de Posição em Robótica

float error = target_position - current_position;
float pid_output = Kp * error + Ki * integral + Kd * derivative;
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pid_output);

Sistemas de Transporte Industrial

  • Monitoramento de velocidade de esteiras com detecção de paradas abruptas.
  • Integração com comunicação CAN para relatórios em tempo real.

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

Problemas Comuns e Soluções

1. Contagem Errada por Ruído:

  • Aplique filtros digitais via registradores IC1Filter e IC2Filter.
  • Use cabos blindados e terminações adequadas.

2. Overflow do Contador:

3. Debounce de Sinais:

Estratégias de Otimização

encoderConfig.EncoderMode = TIM_ENCODERMODE_TI12;
encoderConfig.IC1Polarity = TIM_ICPOLARITY_BOTHEDGE;
encoderConfig.IC2Polarity = TIM_ICPOLARITY_BOTHEDGE;

Considerações Finais🔗

O modo encoder do STM32O que é STM32 e por que usá-lo?O que é STM32 e por que usá-lo?Descubra os principais benefícios, arquitetura ARM Cortex-M e aplicações práticas dos microcontroladores STM32. Comece a inovar agora. oferece uma solução integrada e eficiente para controle preciso de motores, combinando hardware dedicado e flexibilidade de configuração. Ao dominar os aspectos de configuração, interpretação de dados e estratégias de depuração, é possível implementar sistemas robustos em aplicações como robótica e automação industrial.

A chave para o sucesso está na calibração cuidadosa de parâmetros (filtros, prescalerUsando 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.) e na integração com algoritmos de controle avançados, como PID. Explore as capacidades do seu microcontrolador e adapte os exemplos aqui apresentados para atingir a precisão exigida pelo seu projeto.

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