Pular para conteúdo

Aula 05 - Modulação por Largura de Pulso (PWM) e Controle de Atuadores ⚙️

Objetivo Pedagógico

Objetivo: Fundamentos de PWM: frequência, período e duty cycle. Controle de intensidade luminosa em LEDs e modulação de velocidade em motores DC com Ponte H.


📑 1. Fundamentos Teóricos & Conceituação

Fundamentos de PWM: frequência, período e duty cycle. Controle de intensidade luminosa em LEDs e modulação de velocidade em motores DC com Ponte H. Em projetos de engenharia eletrônica e sistemas computacionais embarcados, a precisão temporal, a contenção de recursos de memória e a confiabilidade contínua são requisitos mandatórios de projeto.

📐 Arquitetura Conceitual & Fluxo de Operação

graph TD
    A["Entrada / Periféricos"] --> B["Modulação por Largura de Pulso (PWM) e Controle de Atuadores"]
    B --> C["Processamento e Validação"]
    C --> D["Saída / Atuador / Rede"]

    style A fill:#e3f2fd,stroke:#1565c0
    style B fill:#fff3e0,stroke:#e65100,stroke-width:2px
    style C fill:#e8f5e9,stroke:#2e7d32
    style D fill:#f3e5f5,stroke:#7b1fa2

🔍 Pilares e Princípios de Engenharia

Nesta unidade, exploramos detalhadamente os seguintes conceitos: - Duty Cycle: Requisito essencial para garantir operação determinística e estável. - Frequência PWM: Requisito essencial para garantir operação determinística e estável. - Resolução em Bits: Requisito essencial para garantir operação determinística e estável. - Controle de Motores DC: Requisito essencial para garantir operação determinística e estável. - Servomotores (50 Hz): Requisito essencial para garantir operação determinística e estável.


🛠️ 2. Implementação Técnica & Código em C/C++

Abaixo está o exemplo prático estruturado de acordo com as normas de desenvolvimento bare-metal / FreeRTOS para a família estudada:

// Configuração de PWM no ESP32 (Driver LEDC)
#include "driver/ledc.h"

void pwm_init(void) {
    ledc_timer_config_t timer_conf = {
        .speed_mode = LEDC_LOW_SPEED_MODE,
        .duty_resolution = LEDC_TIMER_10_BIT, // 0 a 1023
        .timer_num = LEDC_TIMER_0,
        .freq_hz = 5000,                      // 5 kHz para motor
        .clk_cfg = LEDC_AUTO_CLK
    };
    ledc_timer_config(&timer_conf);

    ledc_channel_config_t ch_conf = {
        .gpio_num = 18,
        .speed_mode = LEDC_LOW_SPEED_MODE,
        .channel = LEDC_CHANNEL_0,
        .timer_sel = LEDC_TIMER_0,
        .duty = 512, // 50% de Duty Cycle
        .hpoint = 0
    };
    ledc_channel_config(&ch_conf);
}

💡 Análise Passo a Passo do Código

  1. Configuração de Registradores / Drivers: O hardware é parametrizado antes da ativação das interrupções globais.
  2. Tratamento Seguro: Utilização de tipos com largura fixa (uint8_t, uint32_t) da biblioteca <stdint.h> para garantir portabilidade entre arquiteturas de 8, 16 e 32 bits.
  3. Eficiência e Baixo Consumo: Minimização de ciclos de clock desperdiçados e liberação do barramento para outros periféricos.

🎯 3. Próximos Passos & Sequência Prática