Controlo Avançado de Motor DC: PID + PWM – Dicas e Truques de Especialista
Componentes e Materiais
- Arduino Due (ou qualquer Arduino: Uno, Nano, Mega) – 1 unidade
- Motor DC – 1 unidade (ex: 70 mA nominal)
- Sensor de Velocidade Fotoelétrico HC-020K (20 slots) – 1 unidade
- Transistores PNP BC307A – 4 unidades (ponte H discreta) – Nota: NPN BC337 seria melhor para correntes maiores
- Resistores base – 4× 4.75 kΩ (calculados para hFE≈140, VBE=0.62V, VT=3.3V)
- Potenciómetros rotativos 10 kΩ – 4 unidades (ajuste Kp, Ki, Kd, Setpoint)
- Chave deslizante – 1 unidade (seleção direção CW/CCW)
- Display TFT Makeblock Me – 1 unidade (opcional, para gráficos)
- Protoboard, fios, fonte alimentação motor
Software
- Arduino IDE
- Bibliotecas padrão (
Servonão necessária)
Sobre o Projeto
Controlo preciso de velocidade e direção de motor DC usando controlador PID com saída PWM, em vez de PWM direto. PWM direto falha devido a atrito e inércia ("os gémeos"): a velocidade real nunca atinge o setpoint. PID compensa dinamicamente.
Controlador PID Implementado
Função genérica reutilizável:
float controllerPID(float _E, float _Eprev, float _dT, float _Kp, float _Ki, float _Kd) {
float P = _Kp * _E; // Proporcional
float I = _Kp * 0.5 * _Ki * (_E + _Eprev) * _dT; // Integral
float D = _Kp * _Kd * (_E - _Eprev) / _dT; // Derivativo
return P + I + D;
}
No loop principal:
E = RPMset - RPM; // Erro
float cPID = controllerPID(E, Eprev, dT, Kp, Ki, Kd);
if (RPMset == 0) OutputRPM = 0;
else OutputRPM = OutputRPM + cPID; // Saída acumulada (velocidade)
OutputRPM = constrain(OutputRPM, _minRPM, _maxRPM);
Circuito de Potência (Ponte H com Transistores)
- PWM1 (pino 3) → T1A + T1B (lado alto/esquerdo) → sentido horário (CW).
- PWM2 (pino 2) → T2A + T2B → sentido anti-horário (CCW).
- Transistores PNP: corrente flui Emissor→Coletor quando base baixa (ativo em LOW).
- Cálculo do resistor de base:
R = (VT - VBEon) * hFE / IM.
Exemplo: IM=70mA, hFE=140, VBEon=0.62V, VT=3.3V → R≈5.36kΩ (usou 4.9kΩ).
Importante: Corrente de arranque do motor pode ser 130%+ da nominal. Inversão de polaridade em movimento causa pico extremo. Solução no código: ao inverter direção, zera ambos PWMs e aguarda motor parar (RPM < _minRPM) antes de aplicar novo sentido.
Leitura de Velocidade (HC-020K)
Sensor alimentado a 3.3V (compatível Due). Função readFrequency(pin, speed) conta flancos descendentes durante janela de tempo (ex: 0.25s para speed=4). RPM = 60 × frequência / 20 slots.
int readFrequency(int pin, float speed) {
pinMode(pin, INPUT);
byte curr, prev = 0;
unsigned long t, t0 = micros();
float freq = 0;
if (speed <= 0 || speed > 10) return -1;
do {
curr = digitalRead(pin);
if (prev == 1 && curr == 0) freq++;
prev = curr;
t = micros();
} while (t < (t0 + 1000000/speed));
return speed * freq;
}
Interface Gráfica (Opcional – Makeblock Me TFT)
CommandToTFT()– envia comandos série para display.Cartesian_Setup()– desenha eixos X(Y) com escalas automáticas.Cartesian_ClearPlotAreas()– limpa área de gráfico ao reiniciar tempo.Cartesian_Line()– plota setpoint (amarelo) e RPM real (verde) vs tempo.- Alarmes visuais (caixas vermelhas) para RPM > AHH, AH, AL, ALL.
Afinação do PID (Ziegler-Nichols)
- Kp=Ki=Kd=0.
- Aumente Kp até oscilação sustentada → ganho crítico Kc, período Pc.
- Ajuste: P: Kp=0.5Kc | PI: Kp=0.45Kc, Ki=1.2/Pc | PID: Kp=0.6Kc, Ki=2/Pc, Kd=Pc/8.
- Afinar finamente.
No projeto, Kp, Ki, Kd são ajustados em tempo real via potenciómetros nos pinos A1–A3 (0–4095 → 0–Kmax).
Resultados
- PWM direto: erro estático grande, não atinge setpoint.
- PID: erro → zero, resposta rápida, mantém velocidade sob carga variável.
- Velocidade mínima atingível: ~5% da nominal (vs 10-20% sem PID).
Nota sobre Transistores NPN vs PNP
Se usar NPN (BC337): corrente Coletor→Emissor. Polarize coletor em +V, emissor no motor. Inverte lógica de drive (ativo em HIGH).
Dois Códigos Fornecidos
- Com gráficos TFT – versão completa com plotagem, alarmes, display.
- Sem gráficos – apenas lógica PID + motor + sensor, para estudo/embutir.
Ambos na secção Code do projeto original.
Esquema
Ver secção Schematics (imagem BMP: ponte H discreta 4× PNP, sensor HC-020K, potenciómetros, chave direção, display).
Processo de manufatura
- Aprimorando Desempenho de Motor DC com Ligas Tungstênio-Cobre
- Crie Efeitos de Áudio Controlados por Sensores com o Kit Satellite CCRMA
- Controle Dois Motores de Passo com Arduino Nano e Joystick – Tutorial Simples
- Controlando Matriz de LED 8×8 com Arduino Uno: Guia Passo a Passo
- Sistema Inteligente de Monitoramento de Temperatura para Escolas: Preciso, Tempo Real e Seguro
- Biblioteca Eficiente de Porta IO de 8 Bits para Arduino – Expanda o Controle Digital
- Teclado Prototípico de 64 Teclas com Arduino: Matriz com Registradores de Deslocamento
- Shield TFT 2,8" para Arduino Nano – Display SPI 320×240 de Alto Desempenho
- Circuito de Entrada Analógica Isolada para Arduino
- Kit de Robô de Navegação Interna Inteligente para Projetos Arduino