Controle de Motor com PWM e Uso de Interrupções no ESP32 com Arduino

Introdução

Este artigo explora dois conceitos fundamentais no desenvolvimento com microcontroladores: modulação por largura de pulso (PWM) e interrupções. Ambos são amplamente utilizados em projetos práticos, como no controle de velocidade de motores e na detecção de eventos em tempo real. Usaremos o ESP32 com a plataforma Arduino para demonstrar como implementar esses recursos.

O que é PWM

PWM, ou Pulse Width Modulation, é uma técnica usada para controlar a quantidade de energia entregue a um dispositivo, como um motor ou LED, variando a largura dos pulsos em uma onda digital fixa em frequência. A ideia central é ajustar a proporção entre o tempo em que o sinal está em nível alto (ligado) e o tempo total do ciclo, chamada de razão cíclica (ou duty cycle).

  • Frequência: Define a rapidez com que os pulsos se repetem (em Hz).
  • Duty Cycle: Percentual do tempo em que o sinal está em nível alto dentro de um ciclo completo.

Por exemplo, um duty cycle de 50% significa que o sinal passa metade do tempo em nível alto e metade em nível baixo.

Exemplo de Controle de Motor com PWM no ESP32

O ESP32 possui um controlador PWM dedicado chamado LEDC (LED PWM Controller), que pode ser usado para controlar motores, LEDs e outros dispositivos.


void setup() {
  ledcSetup(0, 5000, 8); // Canal 0, 5000 Hz, resolução de 8 bits
  ledcAttachPin(12, 0); // Conecta o pino 12 ao canal 0
}

void loop() {
  for (int duty = 0; duty <= 255; duty++) {
    ledcWrite(0, duty); // Atualiza o duty cycle
    delay(10);
  }
}

  • ledcSetup(channel, freq, resolution): Configura o canal PWM com a frequência e resolução especificadas.
  • ledcAttachPin(pin, channel): Associa o pino físico ao canal PWM.
  • ledcWrite(channel, duty): Define o duty cycle para o canal especificado.

Neste exemplo, o duty cycle varia de 0 a 255, o que corresponde a 0% a 100% de potência, assumindo uma resolução de 8 bits (2⁸ = 256 níveis).

Interrupções no ESP32

Interrupções permitem que o microcontrolador responda a eventos externos imediatamente, sem precisar esperar no loop principal. Isso é útil para detectar mudanças em sinais de entrada, como o pressionar de um botão.

Exemplo de Interrupção com Botão

Neste exemplo, usamos uma interrupção para alternar o estado de um LED conectado ao pino 2, acionado por um botão conectado ao pino 27.


volatile byte ledState = LOW;

void IRAM_ATTR toggleLED() {
  ledState = !ledState;
}

void setup() {
  pinMode(2, OUTPUT);
  pinMode(27, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(27), toggleLED, CHANGE);
}

void loop() {
  digitalWrite(2, ledState);
}

  • volatile: Indica que a variável pode ser alterada por uma interrupção.
  • IRAM_ATTR: Atributo necessário para que a função de interrupção seja armazenada na memória IRAM.
  • attachInterrupt(): Registra a função de interrupção associada a um pino e tipo de evento.

O modo CHANGE significa que a interrupção é acionada sempre que o pino muda de estado (de alto para baixo ou vice-versa).

Tipos de Acionamento de Interrupção no Arduino

  • LOW: Interrupção acionada enquanot o pino estiver em nível baixo.
  • CHANGE: Acionada em qualquer mudança de nível (baixo para alto ou alto para baixo).
  • RISING: Acionada quando o pino muda de baixo para alto.
  • FALLING: Acionada quando o pino muda de alto para baixo.
  • HIGH: Interrupção acionada enquanto o pino estiver em nível alto.

Considerações Finais

O uso de PWM e interrupções é essencial em projetos com microcontroladores. O ESP32 oferece suporte robusto a ambas as funcionalidades, permitindo o desenvolvimento de sistemas reativos e controlados com precisão. Com essas ferramentas, você pode avançar para projetos mais complexos, como robôs, sensores e sistemas embarcados interativos.

Tags: ESP32 Arduino PWM interrupcoes Controle de Motor

Publicado em 10-7 15:35