Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Controlo Avançado de Motor DC: PID + PWM – Dicas e Truques de Especialista

Componentes e Materiais

Software

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)

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)

Afinação do PID (Ziegler-Nichols)

  1. Kp=Ki=Kd=0.
  2. Aumente Kp até oscilação sustentada → ganho crítico Kc, período Pc.
  3. Ajuste: P: Kp=0.5Kc | PI: Kp=0.45Kc, Ki=1.2/Pc | PID: Kp=0.6Kc, Ki=2/Pc, Kd=Pc/8.
  4. 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

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

  1. Com gráficos TFT – versão completa com plotagem, alarmes, display.
  2. 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

  1. Aprimorando Desempenho de Motor DC com Ligas Tungstênio-Cobre
  2. Crie Efeitos de Áudio Controlados por Sensores com o Kit Satellite CCRMA
  3. Controle Dois Motores de Passo com Arduino Nano e Joystick – Tutorial Simples
  4. Controlando Matriz de LED 8×8 com Arduino Uno: Guia Passo a Passo
  5. Sistema Inteligente de Monitoramento de Temperatura para Escolas: Preciso, Tempo Real e Seguro
  6. Biblioteca Eficiente de Porta IO de 8 Bits para Arduino – Expanda o Controle Digital
  7. Teclado Prototípico de 64 Teclas com Arduino: Matriz com Registradores de Deslocamento
  8. Shield TFT 2,8" para Arduino Nano – Display SPI 320×240 de Alto Desempenho
  9. Circuito de Entrada Analógica Isolada para Arduino
  10. Kit de Robô de Navegação Interna Inteligente para Projetos Arduino