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.